生产环境如何使用 Docker Compose 实现零停机更新服务

文章导读
生产环境用 Docker Compose 实现零停机更新,核心是靠健康检查 + 滚动更新策略 + 优雅停止三者配合,适合多副本服务场景,单实例服务需要额外配合负载均衡。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

生产环境用 Docker Compose 实现零停机更新,核心是靠健康检查 + 滚动更新策略 + 优雅停止三者配合,适合多副本服务场景,单实例服务需要额外配合负载均衡。

先说结论:Docker Compose 本身不支持完整的滚动更新,但通过 healthcheck、deploy 配置和外部工具组合,可以实现最小化中断的平滑更新。

  • 适合多副本服务、有健康检查接口的无状态应用
  • 先准备配置健康检查、设置优雅停止时间、确保负载均衡支持
  • 验收更新过程中持续监控服务可用性,确认无请求失败

命令速用版

基础更新命令(配合健康检查):

docker-compose up -d `--no-deps` <service_name>

使用 docker-rollout 工具实现真正零停机:

docker rollout <service_name>

回滚到上一版本:

docker rollout <service_name> `--rollback`

为什么会这样

Docker Compose 默认执行up -d时会先停止旧容器再启动新容器,这中间存在服务中断窗口。要实现零停机,需要让新容器完全就绪后再停止旧容器。

关键机制有三点:健康检查确保新容器能正常处理请求,order: start-first 控制启动顺序,stop_grace_period 给旧容器时间处理完手中请求。但要注意,原生 Compose 对滚动更新的支持有限,多副本场景下可能需要 Swarm 模式或外部工具配合。

分步处理

第一步:配置健康检查

在 docker-compose.yml 中为服务添加 healthcheck:

生产环境如何使用 Docker Compose 实现零停机更新服务
services:
  web:
    image: myapp:v2
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80"]
      interval: 10s
      timeout: 3s
      retries: 3

检查点:执行docker-compose ps确认容器状态为healthy后再继续。

第二步:配置更新策略

添加 deploy 配置控制更新行为:

deploy:
  replicas: 2
  update_config:
    parallelism: 1
    delay: 10s
    order: start-first

注意:order: start-first 是实现零停机的核心,确保新容器启动并健康后,旧容器才会被终止。

第三步:设置优雅停止

给容器足够时间处理完现有请求:

stop_grace_period: 30s

同时确保应用代码能监听 SIGTERM 信号并优雅关闭连接。

第四步:执行更新

使用标准命令或工具:

生产环境如何使用 Docker Compose 实现零停机更新服务
# 标准方式
docker-compose up -d `--no-deps` web

# 或使用 docker-rollout 工具
docker rollout web

怎么验证是否生效

更新过程中持续检查:

# 查看容器健康状态
docker-compose ps

# 查看服务日志
docker-compose logs -f web

# 持续发送测试请求
curl -I http://localhost:80

判断标准:更新全程curl请求无失败,日志中无连接拒绝错误,容器状态始终有至少一个healthy实例。

常见坑

单实例服务无法真正零停机:只有一个副本时,新旧容器交替必然有中断,需要配合负载均衡或蓝绿部署。

健康检查配置不当:检查间隔太长会导致更新等待过久,太短可能误判容器状态,需要根据应用启动时间调整。

数据库迁移兼容性:新版本代码可能与旧数据结构不兼容,需要先做渐进式迁移或确保代码同时兼容新旧格式。

会话状态丢失:如果服务有本地会话,滚动更新会导致用户登录态丢失,需要将会话存到 Redis 等外部存储。

资源不足导致新容器启动失败:滚动更新期间需要同时运行新旧容器,确保服务器有足够内存和 CPU 余量。

参考来源

  • CSDN 博客 - Docker Compose 服务如何实现零 downtime 更新
  • CSDN 博客 - 如何用 docker-compose up `--build` 实现零停机发布
  • CSDN 博客 - 如何用 docker-compose up -d 实现零停机发布
  • CSDN 博客 - Docker Compose 服务平滑更新实战
  • GitCode - docker-rollout 项目文档