Docker技术分享•什么是Docker•镜像•容器•仓库•数据卷•网络•练习:搭建第一个Docker镜像•业务镜像&代码2什么是Docker•Docker是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上•Go语言实作,加入了Linux基金会,遵从Apache2.0协议,原始码在GitHub上进行维护•在LXC的基础上Docker进行了进一步的封装,让使用者不需要去关心容器的管理,使得操作更为简便。使用者操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单3Docker与VM区别4安装Docker•Centos7$yuminstalldocker–y$chkconfigdockeron$servicedockerstart•Ubuntu1404$sudoapt-getupdate$sudoapt-getinstalllinux-image-generic-lts-trusty$sudoreboot$curl-sSL|shservicedockerstart5镜像•Docker镜像(Image)类似于虚拟机镜像,可以理解为面向Docker引擎的只读模板•可从DockerHub下载数以千记的、由各应用官方发布的应用镜像,比如Redis、Mysql、nginx等•增量文件系统模式的像版本管理功能,使镜像创建、升级十分方便6•获取镜像dockerpullcentos:7.0不带仓库名称则默认从DockerHub下载dockerpullubuntu不带版本版本号则默认下载latest版本dockerpulld1.dockerpool.com:5000/ubuntu指定仓库下载•上传镜像dockerpushregistry:5000/centos_cms:v1.1•查看镜像•搜索镜像7•删除镜像dockerrmiregistry:5000/centos_cms:v1.0Dockerrmi5506ed32sd3w2•提交镜像dockercommit890sadfae12se2registry:5000/centos_cms:v1•从容器导出、导入镜像dockerexport890sadfae12se2centos_cms11.tarcatcentos_cms11.tar|dockerimport-registry:5000/centos_cms:v1•存出和载入镜像dockersaveregistry:5000/centos_cms:v1.0centos_cms11.tardockerloadcentos_cms11.tar8容器•容器是从镜像创建的应用运行实例,可以将其启动、停止、重启、删除•可以将容器看做简易版的Linux系统环境,以及运行在其中的应用程序打包而成的应用盒子•镜像本身是只读的,容器从镜像启动之后,Docker会在镜像的最上层创建一个可写层,而镜像本身将保持不变9•新建并启动容器dockerrun[OPTIONS]IMAG[COMMAND]OPTIONS:−-ti-t让docker分配一个伪终端并绑定到容器的标准输入上,-i表示让容器的标准输入保存打开−-d让docker容器在后台以守护态形式运行−-p桥接模式,端口映射−--net=hosthost模式启动−--restart=always一直重启−--privileged=true高级权限−--log-driver=none不打印容器级别日志−--name容器命名COMMAND−/run.sh10dockerrun-d-p3307:3306-p5667:5666-namemysqlos--restart=always--privileged=true--log-driver=noneregistry:5000/centos_mysql_os:v5.6.2/run.shdockerrun-d--net=host–nameos--restart=always-v/home/data/osdata:/usr/local/nginx/html/mnt--privileged=true--log-driver=noneregistry:5000/centos_os:v2.1.0/run.sh•进入容器exec−dockerexec-ticontainerID/bin/bashssh−ssh–p222root@hostIP11•停止容器dockerstopcontainerID•启动容器dockerstartcontainerID•重启容器dockerrestartcontainerID•删除容器dockerrm–fcontainerID12仓库•Docker集中存放镜像文件的应用•仓库概念的引入,为Docker镜像文件的分发和管理提供了便捷的途径•公开仓库——DockerHub、DockerPool•私有仓库——Dockerregistry、DockerTrustedRegistry1314.0412.0413.10Ubuntu仓库7.06.56.0Centos仓库注册服务器•创建私有仓库dockerrun-d-p5000:5000--nameregistry_5000--restart=always--privileged=true--log-driver=none-v/home/registry:/tmp/registryregistry•仓库可移植仓库数据——镜像分层文件+镜像描述文件14•RegistryrestAPI列举注册服务器中的仓库−Curl示例:curl-s-XGET列举仓库中的Tag−Curl示例:curl-s-XGET删除注册服务器中的镜像(含所有tag)−Curl示例:curl-XDELETE删除仓库中的某镜像的某个Tag−Curl示例:curl-XDELETE数据卷•挂载宿主机的目录到容器中作为数据卷目的:容器无状态数据输出,例如Mysql数据文件夹、源服务器视频文件夹•利用数据卷迁移容器数据将数据文件拷贝到挂载文件夹中,即可实现文件在宿主机与容器之间的迁移•数据卷IO读写能力高于Docker原生DeviceMapper16网络|Host•Docker使用了Linux的Namespaces技术来进行资源隔离,如PIDNamespace隔离进程。•一个NetworkNamespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的NetworkNamespace隔离。一个Docker容器一般会分配一个独立的NetworkNamespace。•host模式下,容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。17•Host模式使用场景服务端与客户端进行通信的端口不能提前指定,只能临时协商,例如FTP服务信源输入、结果数据输出有物理网卡的限制,即容器内部需要绑定物理网卡信息,例如编码器、源服务器其他一些只能在host模式下才能正常工作的场景,例如容器内部需要挂载外部nfs路径的场景等•Host注意事项安全性,能够连接到物理主机上的外部主机,均能够连接到容器中(桥接模式指定网卡,只有与网卡相同的VLAN的主机才可连接到容器中)端口资源占用18网络|NAT桥接•Docker默认的网络设置,此模式会为每一个容器分配NetworkNamespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上19•向外通信:IP包首先从容器发往自己的默认网关docker0,包到达docker0后,也就到达了主机上。然后会查询主机的路由表,发现包应该从主机的eth0发往主机的网关,接着包会转发给eth0,并从eth0发出去。数据包相当于做SNAT转换,将源地址换为eth0的地址。这样,在外界看来,这个包就是从eth0上发出来的,Docker容器对外是不可见的•向内通信主机eth0收到的目的端口为port1的数据流量进行DNAT转换,将数据流量发往对应容器的port2端口20•NAT桥接适用场景桥接模式是Docker默认的网络连接方式,几乎适用于所有的应用桥接模式有网络性能的损耗,不适用于对网络性能要求较高的应用(比如nginx)NAT机制导致无法使用容器IP进行跨服务器通讯若容器需要对外提供服务,桥接模式需要在宿主机之上开放服务端口,这在部署上势必带来一些不便,例如容器无法漂移,NAT模式难于理解等等适用于某些特殊场景,例如桥接与HOST模式配合,来搭建对信源、输出有需求,且环境长期不会变的的场景21练习:搭建第一个Docker镜像•1、启动镜像$dockerrun-ticentos/bin/bash•2、进入容器,安装passwd$yuminstallpasswd-y•3、修改Centosroot密码$passwd•4、安装opensshyuminstallopenssh-server-y22•5、生成公钥、私钥ssh-keygen-trsa-f/etc/ssh/ssh_host_rsa_keyssh-keygen-trsa-f/etc/ssh/ssh_host_ecdsa_keyssh-keygen-trsa-f/etc/ssh/ssh_host_ed25519_key•6、编写启动脚本vi/run.sh−#!/bin/bash−/usr/sbin/sshd-Dchmod+x/run.sh•7、修改SSH默认端口vi/etc/ssh/sshd_config−Port22223•8、退出容器,保存镜像dockercommit378ab88a06c8centos_ssh•9、启动容器dockerrun--net=host-dcentos_ssh/run.sh•10、远程连接测试ssh192.168.31.203-p222•更加具体的细节请查看:业务镜像&代码•业务镜像=代码+运行环境——在不改变当前开发习惯基础之上,如何实现这个“+”•代码库:Svn、Cvs、Git——共同点,均有一个构建包路径•运行环境:C、JAVA、Jboss、基础Linux工具•业务镜像=基础环境镜像+代码构建包+自动部署脚本(Dockerfile)2526现场人员管理人员研发人员代码库1、提交代码2、申请打包3、打包构建包存放服务器4、提交代码构建包镜像构建服务器5、通知镜像自动构建工具6、打开基础镜像、根据自动部署脚本、重新构建镜像镜像仓库7、推送镜像测试人员8、下载镜像9、测试10、有问题,报BUG10、没问题,通知现场人员生产系统10、没问题、通知生产系统11、下载对应版本的镜像11、下载对应版本的镜像谢谢!