docker swarm滚动更新和回滚

    技术2025-07-12  10

    一、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

    Processed: 0.011, SQL: 9