Docker Swarm生产环境单箱测试:如何临时推送新版本镜像至单个副本并回滚?
Docker Swarm单箱测试:灰度发布与回滚实操指南
当然可以!这种金丝雀发布的方式完全适配你在Docker Swarm里做单箱测试的需求——先让单个副本跑新版本,测试没问题再全量更新,出问题就快速回滚。下面给你唠唠具体怎么操作:
一、提前准备好这些
- 确认Swarm集群运行正常,目标生产服务(比如我就叫它
my-prod-service)已经部署,当前用的是旧版本镜像old-image:v1 - 新版本镜像
new-image:v2已经构建完成,并且推送到了你的镜像仓库(要保证集群里的所有节点都能拉取到这个镜像)
二、让单个副本跑新版本(两种实用方法)
方法1:用Swarm滚动更新参数精准控制
这是最省心的方式,直接利用Swarm的更新策略,让它只更新1个副本,然后暂停更新流程,给你留足测试时间:
- 先看看当前服务的配置心里有数:
docker service inspect my-prod-service - 执行更新命令,指定新版本镜像,同时设置并行更新数为1,更新延迟拉得足够长(比如3600秒,也就是1小时,够你测了吧?):
docker service update --image new-image:v2 --update-parallelism 1 --update-delay 3600s my-prod-service
执行完后,Swarm只会把1个副本更到新版本,然后就等着,这段时间你就放心测这个单独的新版本实例就行。
方法2:手动新增单个新版本副本(更灵活)
如果想更自主控制,也可以手动加个副本然后单独更到新版本:
- 先给现有旧版本的所有实例打个标签,方便后续区分:
docker service update --label-add "version=v1" my-prod-service - 给服务加1个副本:
docker service scale my-prod-service=$(docker service inspect --format '{{.Spec.Mode.Replicated.Replicas}}' my-prod-service)+1 - 只更新没有
version=v1标签的那个新副本到新版本:docker service update --image new-image:v2 --filter "label!=version=v1" my-prod-service
这样就只有刚加的那个副本跑新版本,其他还是原来的旧版本,完全隔离。
三、怎么测试这个新版本实例?
测试期间,你可以这么定位和验证:
- 看服务的任务列表,能清楚看到每个副本用的镜像版本:
docker service ps my-prod-service - 直接进容器调试或者看日志:
docker exec -it <任务ID> bash(任务ID从上面的命令结果里拿) - 如果服务有暴露端口,要是用了Swarm路由网格,可以给新版本实例加个节点约束,让它跑在特定节点上,然后直接访问这个节点的对应端口,就能单独测这个实例了。
四、测试完怎么回滚?
不管用哪种方法,回滚都超级简单:
- 直接用Swarm自带的回滚命令,一键回到更新前的状态:
docker service rollback my-prod-service
执行完后,所有副本都会切回旧版本old-image:v1,省心到爆。 - 要是用的手动加副本的方法,也可以先删掉那个新版本副本,再把服务缩容回原来的数量:
docker service scale my-prod-service=$(docker service inspect --format '{{.Spec.Mode.Replicated.Replicas}}' my-prod-service)-1
几个实用小贴士
- 测试前建议给服务加个
--update-failure-action pause参数,要是新版本实例启动失败,Swarm会立刻暂停更新,不会影响其他正常的生产副本。 - 确保新版本镜像的配置和生产环境完全一致,不然测试结果就不准啦。
- 测试期间可以实时看所有实例的日志:
docker service logs -f my-prod-service,随时监控新版本的运行状态。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

