蓝绿部署通过两套隔离的 Docker Compose 服务(blue/green)并行运行,借助 Nginx 动态切换 upstream 实现零停机发布;需端口隔离、健康检查、兼容性验证及保留旧实例等关键保障措施。

Compose 编排实现蓝绿部署,核心是用两套隔离的服务(blue 和 green)并行运行,再通过 Nginx 反向代理动态切换 upstream,不依赖 Kubernetes 或复杂网关,就能完成零停机发版。它轻量、可复现,特别适合开发测试、CI/CD 验证或中小规模单机/边缘部署场景。
准备两套独立服务实例
在 docker-compose.yml 中定义两个服务块,命名明确区分版本,例如:
-
app-blue:运行旧版本镜像(如myapp:v1.2),监听宿主机端口8081 -
app-green:运行新版本镜像(如myapp:v1.3),监听宿主机端口8082
两者共用同一网络(如 app-network),但彼此无依赖、不共享卷或环境变量,确保配置与数据完全隔离。健康检查建议启用,例如:
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/healthz"] interval: 10s timeout: 3s retries: 3
用 Nginx 做流量入口与动态切换
Nginx 不只是静态反代,而是作为“流量开关”:它的 upstream 指向当前生效的后端服务。典型做法是:
- 将 Nginx 配置挂载为外部文件(如
./nginx/conf.d/app.conf) - 配置中定义两个 upstream:
upstream app_blue { server app-blue:8080; }和upstream app_green { server app-green:8080; } - 主
server块默认proxy_pass http://app_blue;(即初始走 blue)
切换时只需修改配置文件中的 proxy_pass 行,然后执行 docker exec nginx nginx -s reload ——Nginx 会平滑重载,连接不中断,毫秒级生效。
配套自动化脚本保障可靠切换
人工改配置易出错,推荐用简单 Shell 脚本封装流程:
-
deploy-green.sh:先docker-compose up -d app-green启动新实例 → 等待健康检查就绪(可用curl轮询/healthz)→ 替换 Nginx 配置中proxy_pass指向app_green→ 重载 Nginx -
rollback-to-blue.sh:同理切回app_blue,同样重载
脚本中加入超时和失败退出逻辑(如 60 秒内 green 未就绪则中止),避免半途而废导致服务异常。
关键注意事项
零停机不是自动发生的,几个细节必须卡住:
-
端口不能冲突:blue/green 容器内部都用
8080,但映射到宿主机必须不同(如8081:8080/8082:8080),否则docker-compose up会报错 - 数据库与状态需兼容:蓝绿是并行运行,若新版本写了不兼容的数据库字段或缓存结构,切流后旧版可能读取异常 —— 切换前务必验证双向读写兼容性
-
不要直接删旧服务:blue 实例在 green 上线后应保留至少一小时,确认无错误日志、监控指标稳定后再执行
docker-compose rm -f app-blue - 外部调用方感知:如果其他服务直连你的 Compose 应用(非通过 Nginx),需统一走域名或 VIP,避免硬编码 IP+端口


















