服务编排实现无缝滚动更新与平滑重启,核心在于健康就绪控制、逐步替换节奏和流量安全过渡;docker compose需配合swarm或外部机制,而swarm和kubernetes原生支持;健康检查、update_config配置、优雅关闭及服务发现协同缺一不可。

服务编排实现无缝滚动更新与平滑重启,核心在于“旧实例不骤停、新实例不盲切”,靠的是健康就绪控制 + 逐步替换节奏 + 流量安全过渡。Docker Compose 本身不内置滚动更新(v2.x 无原生支持),但 v3.8+ 配合 Swarm 模式或借助外部协调机制,可达成接近 Kubernetes 的效果;而 Docker Swarm 和 Kubernetes 则原生支持并精细可控。
健康检查是滚动更新的前提
没有健康检查,系统无法判断新容器是否真正就绪,容易把流量导给“假启动”实例,导致请求失败。
- 在 docker-compose.yml 中为服务定义
healthcheck,例如:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 40s
-
start_period给应用留出初始化时间(如加载配置、连接数据库); - Swarm 或 Kubernetes 会等待健康检查连续通过后,才将该实例纳入负载均衡池。
控制更新节奏:并行度与延迟
一次全量替换等于重启,必须分批、可控地推进。
- Docker Compose(Swarm mode)中,在
deploy.update_config下设置:
update_config:
parallelism: 1 # 每次只更新 1 个副本
delay: 15s # 新旧交替间隔 15 秒
order: start-first # 先启新、再停旧(避免空窗)
- Swarm 命令行等效参数:
--update-parallelism 1 --update-delay 15s --update-order start-first; - Kubernetes 中对应
maxSurge=1, maxUnavailable=0,确保任意时刻副本数不低于期望值。
平滑重启依赖优雅关闭(Graceful Shutdown)
容器收到 SIGTERM 后不能立即退出,需完成正在处理的请求。
- Golang 示例:监听信号,调用
http.Server.Shutdown()等待活跃连接结束; - Java Spring Boot 默认启用优雅关机(需配置
server.shutdown=graceful); - Node.js 应捕获
process.on('SIGTERM'),关闭 HTTP server 并等待 pending 请求完成。 - 在
docker-compose.yml中建议显式设置stop_grace_period: 30s,给应用留足缓冲时间。
服务发现与流量切换要协同动作
编排工具只是调度容器,流量是否真正绕过旧实例,取决于服务注册与负载均衡逻辑。
- 使用 Swarm 内置 DNS 负载均衡时,旧任务停止后自动从
tasks.<service></service>解析列表中剔除; - Kubernetes 中
readinessProbe失败会立即将 Pod 从 Endpoints 中移除,新流量不再进入; - 若自建 Nginx 或 Traefik,需配合 Consul/Etcd 等注册中心,由健康状态驱动 upstream 动态更新。











