8.3 Swarm滚动更新和回滚

在实际的生产环境中,应用的版本更新是家常便饭。传统的更新方式往往需要停机维护,这会导致服务中断,影响用户体验。而 Docker Swarm 提供了"滚动更新"功能,可以让你在不中断服务的情况下,平滑地将应用升级到新版本。
这篇实验手册将带你学习如何在 Swarm 集群中进行滚动更新和回滚操作,掌握零停机部署的技巧。
本节课使用 versions-for-swarm项目/镜像 来演示 Docker Swarm 滚动更新、回滚和版本管理。
任务一、服务滚动更新
滚动更新是 Swarm 提供的强大功能,它可以在不中断服务的情况下,平滑地将服务升级到新的版本。Swarm 会逐个替换旧版本的容器,确保始终有足够的容器在运行,从而实现零停机更新。
1. 部署一个全局服务
首先,我们部署一个初始版本为 v1.0 的服务。这次我们使用 --mode global 参数,让每个集群节点上都运行一个该服务的实例。

[学号后两位] 和 [完整学号] 替换为你自己的学号!docker service create \
--mode global \
--name s[学号后两位] \
-p [9000+学号后两位]:80 \
-e STUDENT_ID=[完整学号] \
harbor.seahi.me/stu/versions-for-swarm:v1.0
参数说明:
--mode global:指定服务为全局模式,每个节点上都会运行一个任务副本。与之对应的是replicated模式(默认),可以手动指定副本数量。--name:为服务指定一个唯一的名称。-p:将容器的 80 端口映射到宿主机的指定端口。-e STUDENT_ID:设置环境变量,用于标识不同学生的服务。
2. 验证全局服务
部署完成后,让我们验证服务是否正常运行。
首先查看服务状态:
docker service ls
你应该能看到服务已经启动,并且副本数量与集群节点数一致。

然后查看任务列表:
docker service ps s[学号后两位]
你会发现任务的数量与集群中活动节点的数量一致,每个节点上都有一个任务在运行。

http://节点IP:[9000+学号后两位] 来查看当前部署的服务版本。
3. 执行滚动更新:升级到 v2.0
现在,我们将服务从 v1.0 版本升级到 v2.0 版本。执行更新命令后,Swarm 会自动开始滚动更新过程。
执行更新命令的同时,请在浏览器中持续刷新服务页面,观察版本变化。
预期现象:页面会在蓝色(旧版本)和绿色(新版本)之间交替变化,这说明 Swarm 正在逐个替换容器。
docker service update s[学号后两位] --image harbor.seahi.me/stu/versions-for-swarm:v2.0
滚动更新的工作原理:
Swarm 会逐个节点地停止旧版本的任务,并启动新版本的任务。在这个过程中,始终保持有足够的容器在运行,以确保服务的连续性和可用性。

更新完成后,所有旧版本的任务都会被标记为 Shutdown(关闭),新版本的任务则处于 Running(运行中)状态。


4. 再次升级:到 v2.1
为了进一步熟悉滚动更新的过程,让我们将服务再次升级到 v2.1 版本。
docker service update s[学号后两位] --image harbor.seahi.me/stu/versions-for-swarm:v2.1
这次更新的过程与之前类似,Swarm 会自动处理所有的容器替换工作。
5. 验证最终版本
更新完成后,查看任务状态确认所有容器都已成功更新到 v2.1:
docker service ps s[学号后两位]

任务二、自动回滚
在实际生产环境中,有时候新版本可能会存在 bug 或者不稳定的情况。Docker Swarm 提供了自动回滚功能,当检测到更新失败时,可以自动回退到之前的稳定版本。
1. 模拟更新到问题版本:v3.0-buggy
我们故意更新到一个有问题的版本 v3.0-buggy,并设置 --update-failure-action rollback 参数,让 Swarm 在检测到失败时自动回滚。
docker service update s[学号后两位] \
--update-failure-action rollback \
--image harbor.seahi.me/stu/versions-for-swarm:v3.0-buggy
参数说明:
--update-failure-action rollback:当更新失败时,自动回滚到上一个版本。
2. 查看任务状态
使用 watch 命令持续观察任务状态的变化:
watch -n 1 docker service ps s[学号后两位]
这个命令会每秒刷新一次任务列表,你可以清楚地看到 Swarm 如何检测故障和进行回滚。

你会看到:
- Swarm 尝试启动
v3.0-buggy版本的容器 - 容器启动失败(因为这个版本有 bug)
- Swarm 检测到故障
- 自动触发回滚操作
- 容器回退到上一个稳定版本
v2.1
整个过程完全自动化,无需人工干预!
最终你会看到服务自动回滚到 v2.1 版本:

任务三、手动回滚
除了自动回滚,Docker Swarm 也支持手动回滚操作。这在你需要主动回退版本时非常有用。
1. 删除刚才的服务
为了演示手动回滚,我们先删除之前创建的服务,重新开始:
docker service rm s[学号后两位]
2. 直接以 v2.1 版本运行服务
重新创建服务,这次直接使用 v2.1 版本:
docker service create \
--mode global \
--name s[学号后两位] \
-p [9000+学号后两位]:80 \
-e STUDENT_ID=[完整学号] \
harbor.seahi.me/stu/versions-for-swarm:v2.1
3. 升级到 v3.0-buggy 版本
现在,我们更新到有问题的 v3.0-buggy 版本,但这次不设置自动回滚参数:
docker service update s[学号后两位] --image harbor.seahi.me/stu/versions-for-swarm:v3.0-buggy
持续查看任务状态:
watch -n 1 docker service ps s[学号后两位]
你会发现由于没有设置自动回滚,Swarm 会一直尝试更新,但只有部分任务能够成功更新(因为 v3.0-buggy 版本有问题):

4. 手动回滚到上一个版本
执行以下命令手动回滚到上一个版本:
docker service update --rollback s[学号后两位]
Swarm 会将服务回退到更新前的版本(v2.1)。
查看任务状态确认回滚成功:
docker service ps s[学号后两位]

--rollback 参数可以让服务回退到上一次更新之前的状态。这包括镜像版本、环境变量、端口映射等所有配置。实验总结
通过本次实验,你应该掌握了以下内容:
- 滚动更新:如何使用
docker service update命令平滑地更新服务版本,实现零停机部署。 - 自动回滚:如何设置
--update-failure-action rollback参数,让 Swarm 在检测到更新失败时自动回滚。 - 手动回滚:如何使用
docker service update --rollback命令手动回退到上一个版本。





