前言:html
这篇博文是基于docker Swarm群集环境之上,延伸了Docker Swarm的功能。node
博文大纲:
1、Docker Swarm网络管理
2、Swarm的service管理及版本更新nginx
这篇博文的环境仍是基于上一篇博文中搭建的环境,具体能够参考博文:Docker Swarm群集配置实战(1) ,在进行接下来的操做以前,必需要保证访问docker Swarm的web UI时,能够看到如下界面:web
Swarm群集会产生两种不一样类型的流量:docker
在Swarm service中有三个重要的网络概念:服务器
查看docker01上面的默认网络,以下(注意其SCOPE列,确认其生效范围):网络
除了Swarm群集默认建立的两个网络之外,咱们还能够自定义建立overlay网络,链接到此网络的容器,便可互相通讯,可是须要注意,除了在docker01这个manager上能够查看建立的overlay网络外,其余节点在没有加入此网络前,执行“docker network ls”命令是查看不到的。负载均衡
[root@docker01 ~]# docker network create -d overlay --subnet 192.168.22.0/24 --gateway 192.168.22.1 --attachable my_net1 # 建立一个overlay网络,名字为my_net1; # “--subnet”:指定其网段(能够不指定);“--gateway”:指定其网关(能够不指定); # 可是在docker Swarm群集中建立overlay网络时,必须添加“--attachable”选项 # 不然,其余节点的容器运行时,没法使用此网络
建立完成后,在其余docker节点上是查看不到这个新建立的overlay网络的,可是,可使用此网络(在运行容器时,直接指定便可,等容器运行后,即可以查看到此网络了)ide
测试刚刚建立的overlay网络,是否可用,分别在docker0一、docker02上基于建立的overlay网络运行一个容器,而后进行ping测试,确承认以ping通:测试
#docker01主机上基于overlay网络建立一个容器: [root@docker01 ~]# docker run -tid --network my_net1 --name test1 busybox #同docker01的操做,在docker02上也建立一个: [root@docker02 ~]# docker run -tid --network my_net1 --name test2 busybox
在容器建立后,在docker02主机上,使用test2这个容器去ping容器test1,测试结果以下(因为是自定义网络,因此能够直接ping对端容器的容器名):
在第一篇的博文中测试过,若是Swarm群集中的manager下发一个service任务,那么,下发的任务将随机分布在群集中的docker服务器之上运行, 若是说,因为须要将本身的生产环境配置的统1、规范一些,某一台docker服务器,我就只运行web服务,另外一台docker主机,我就只运行PHP服务,那么,怎么解决呢?
解决方案一:
[root@docker01 ~]# docker service create --replicas 3 --constraint node.hostname==docker03 --name test nginx #在docker03主机上,基于nginx镜像,运行3个名为test的容器
上述命令的执行后以下所示:
解决方案二:
[root@docker01 ~]# docker node update --label-add mem=max docker02 #以键值对的方式给docker02主机打上标签“mem=max”,等号两边的内容是能够自定义的 [root@docker01 ~]# docker service create --name test01 --replicas 3 --constraint 'node.labels.mem==max' nginx #基于nginx镜像在标签为“mem==max”的主机上运行3个名为test01的服务 [root@docker01 ~]# docker node inspect docker02 #能够执行此命令查看dokcer02主机的标签 #标签相关的信息,在Spec{ }中
查看web UI界面进行确认:
[root@docker01 aa]# cat html/index.html #准备网页文件 127.0.0.1 [root@docker01 aa]# cat Dockerfile #基于nginx容器,将当前目录下的html目录挂载为nginx的网页根目录 FROM nginx ADD html /usr/share/nginx/html [root@docker01 aa]# docker build -t 192.168.20.6:5000/testnginx:1.0 . #生成一个镜像 [root@docker01 aa]# docker push 192.168.20.6:5000/testnginx:1.0 #将新生成的镜像上传至私有仓库 [root@docker01 aa]# docker service create --name newnginx -p 80:80 --replicas 3 192.168.20.6:5000/testnginx:1.0 #基于上传到私有仓库的镜像,运行三个service,并映射到本地80端口 #当上面的命令执行成功后,只要docker主机上运行着那个service,就能够经过它的80端口访问到nginx服务
运行后,web UI界面显示以下:
能够看到,每一个节点都运行了那个service,也就是说,访问哪一个节点的80端口,均可以看到同样的页面,以下:
在docker01上查看service的详细信息,以下:
[root@docker01 aa]# docker service ps newnginx #查看service的详细信息
命令执行的结果(须要注意的是其镜像标签,也就是说注意其是基于哪一个镜像运行的):
[root@docker01 aa]# docker tag nginx:latest 192.168.20.6:5000/testnginx:2.0 #准备2.0版本的镜像 [root@docker01 aa]# docker push 192.168.20.6:5000/testnginx:2.0 #上传到私有仓库 [root@docker01 aa]# docker service update --image 192.168.20.6:5000/testnginx:2.0 newnginx #将newnginx服务的镜像升级到2.0 [root@docker01 aa]# docker service ps newnginx #再次查看service的详细信息
命令执行的结果以下,发现基于1.0镜像运行的newnginx的service状态已经变成了shutdown,而基于2.0运行的service变为了running,以下:
此时,若再次访问其web页面,就变为了nginx的默认首页(由于咱们的2.0镜像只是更改了下nginx镜像的标签,并无修改其文件),以下:
其web UI界面能够查看到该service的最后一次升级的时间。
[root@docker01 aa]# docker tag nginx:latest 192.168.20.6:5000/testnginx:3.0 #准备3.0版本的镜像 [root@docker01 aa]# docker push 192.168.20.6:5000/testnginx:3.0 #上传到私有仓库 [root@docker01 ~]# docker service update --replicas 6 --image 192.168.20.6:5000/testnginx:3.0 --update-parallelism 3 --update-delay 1m newnginx #上述选项的含义以下: # “--replicas 6”:更新后的service数量为6个(本来是3个) # “ --update-parallelism 2 ”:设置并行更新的副本数。 # “ --update-delay 1m ”:指定滚动更新的时间间隔为1分钟 [root@docker01 ~]# docker service ps newnginx #自行对比newnginx服务的详细信息
当咱们升级到新的版本后,发现新版本的镜像有些问题,而不得不返回以前运行的版本,那么能够执行下面的操做:
[root@docker01 ~]# docker service update --rollback newnginx #将newnginx的service回滚到前一个版本 [root@docker01 ~]# docker service ps newnginx #自行查看
执行回滚命令后,回滚过程以下:
回滚成功后,我这里就从原来的3.0变回了2.0,虽然在升级3.0的时候,指定的service数量是6个,可是以前只有3个,因此在执行回滚操做后,service数量也将变回3个。
注意:当咱们执行回滚操做的时候,默认是回滚到上一次操做的版本,而且不能够连续回滚。
———————— 本文至此结束,感谢阅读 ————————