不使用Swarm/Stack,如何实现Docker Compose容器的顺序更新?
问题原因
deploy.update_config 是Docker Swarm模式下的专属配置项,普通单机版Docker Compose(非Swarm集群)不会解析这个配置,所以你设置的parallelism:1和delay:10s完全不生效,执行docker compose up -d时会一次性替换所有副本容器。
非Swarm环境下的顺序更新方案
不用Swarm/Stack的话,只能通过脚本手动实现滚动更新,以下是两种可行方案:
方案一:逐个强制重建容器(简单直接)
先拉取新镜像,然后循环逐个重建容器,每次间隔10秒:
# 拉取最新镜像 docker compose pull myservice # 逐个重建容器 for container in $(docker compose ps -q myservice); do # 仅重建当前容器,不影响其他服务 docker compose up -d --no-deps --force-recreate $container # 等待10秒再处理下一个 sleep 10 done
--no-deps:避免重启当前服务依赖的其他服务--force-recreate:强制用新镜像重建容器,即使配置没有变化
方案二:无停机滚动更新(适合生产环境)
先启动新镜像的容器,再逐个停止旧容器,保证服务始终可用:
# 拉取最新镜像 docker compose pull myservice # 先扩容1个新容器(此时共6个,1个新镜像+5个旧镜像) docker compose up -d --scale myservice=6 sleep 10 # 按创建时间排序,逐个停止并删除旧容器 for old_container in $(docker compose ps -q myservice | sort | head -n 5); do docker stop $old_container docker rm $old_container sleep 10 done # 缩回到5个副本(此时全部是新镜像的容器) docker compose up -d --scale myservice=5
内容的提问来源于stack exchange,提问作者Elijah Root
相关产品推荐
相关产品推荐

