一、Docker Swarm的service的功能:
首先可以创建副本,在创建的过程中,可以指定要使用的容器映像以及在运行中的容器内执行的命令。您还定义服务的选项,包括:
- 群在群外提供服务的端口。
- 用于服务连接到群中其他服务的覆盖网络。
- CPU和内存限制与保留。
- 滚动更新策略。
- 群中要运行的图像的副本数。
Service服务的扩容和缩容,可以使用docker service scale 来增加副本的数量。
二、最重要的是可以对镜像的升级与回滚:
可以使用docker service update --image 来升级镜像。也可以平滑升级,来定义一次升级几个副本和滚动更新的时间间隔,通过--update-parallelism和--update-delay来实现。
可以参考官方文档:
https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/
1)基于私有仓库,httpd镜像,自定义3个镜像,模拟v1,v2,v3不同版本。
2)部署一个service,以自己的名字命名,副本数量为3个。
3)service服务进行扩容到6个,以及缩容到4个的操作。
4)然后对服务进行默认的滚动更新到v2版本。
5)再平滑更新到v3版本,策略为每次更新2个,时间间隔为1m。
6)如何实现回滚操作。
三、滚动更新service
1.创建服务
docker pull httpd:2.2
docper pull httpd:2.4
docker service create --name web_http --replicas 3 192.174.1.43:5000/httpd:2.2 (启动的服务)
swarm按照如下步骤执行滚动更新:
1.停止第一个副本
2.调度任务,选择worker node
3.在worker 上用新的镜像启动副本
4.如果副本 (容器)启动成功,继续更新下一个副本;如果失败了。暂停整个更新过程。
docker service update --image 192.174.1.43:5000/httpd web_http
三个副本的版本已经更新成功了!
5.默认配置下,swarm一次更新一个副本,并且两个副本之间没有等待时间,可以通过--update-parallelism设置并行更新的副本数目,通过--update-delay制定更新的间隔时间。
docker service update --replicas 6 --update-parallelism 2 --update-delay 1m30s web_http
web_http
service 增加到留个副本,每次更新两个副本 间隔时间一分半
查看副本处于正常状态
6.更新镜像到2.4
docker service update --image 192.174.1.43:5000/httpd:2.4 web_http
四、回滚
swarm 还有方便的功能就是回滚,如果更新后效果不理想,可以通过--rollback快速恢复到更新之前的状态。
docker service update --rollback web_http
注意:--rollback只能回滚到上一次执行docker service update之前的状态,并不能无限制的回滚
五、replicated mode与global mode
swarm可以在service创建和运行过程中灵活的通过 --replicas调整容器副本数量,内部调度器则会根据当前集群的资源使用状况在不同的node上启停容器,这就是service默认的replicated mode。在此模式下,node上运行的副本数有多有少,一般情况下,资源更丰富的node运行的副本数更多。
除了replicated mode,service还提供了一个globalmode,其作用是强制在每个node上都运行一个且最多一个副本。
docker node update --availability active node1
docker service create --mode global --name my_test 192.174.1.43:5000/httpd
docker service inspect my_test --pretty
如果创建建service时不指定,默认是replicated
六、lebel控制service位置
无论采用global mode 还是replicated mode 副本运行在哪些节点都是有swarm 决定,作为用户我们使用label精细控制service的运行位置:
逻辑分两步:
1.为每个nioe定义label。
2.设置service运行在制定label的node上,label可以灵活描述node的属性,其刑事是key=value 用户可以任意制定,例如将swarm-worker1作为测试环境,为其添加label env=test:
docker node update --label-add env=test node2
docker node update --label-add env=port node3
对应的 将node2作为测试环境添加label env=prot:
2.部署service到测试环境:
docker service create --constraint node.labels.env==test --replicas 3 --name my_web --publish 8080:80 192.174.1.43:5000/httpd
--constranint node.labels.env==test限制将service部署到label=test 的node,三个副本全部都运行在node2上。
3.更新service 将其迁移到生产环境:
docker service update --constraint-rm node.labels.env==test my_web
docker service update --constraint-add node.labels.env==prot my_web
删除并添加新的constranint,设置node.labels.env==prot,最终所有副本都迁移到swarm-worker2