docker compose 搭配 nginx 实现单机微服务蓝绿发布,核心是通过脚本动态生成 upstream 配置并重载 nginx,使流量在 blue(8081)和 green(8082)实例间切换,实现零停机发布;需确保网络互通、健康检查、配置语法校验及数据隔离。

用 Docker Compose 搭配 Nginx 实现单机微服务蓝绿发布,核心在于:让 Nginx 动态切换流量到两套并行运行的服务实例(blue 和 green),通过修改 upstream 配置或重载 Nginx 实现零停机发布。整个过程无需外部编排工具,适合开发、测试或小规模生产环境。
准备两套独立的服务实例
在 docker-compose.yml 中定义 blue 和 green 两个服务组,端口必须错开(避免冲突),且各自有唯一服务名:
- blue 服务使用
8081端口,容器名为api-blue - green 服务使用
8082端口,容器名为api-green - 两者镜像可相同,但启动命令或环境变量应体现版本差异(如
VERSION=1.2) - Nginx 容器需与这两个服务在同一网络中(推荐自定义 bridge 网络)
配置 Nginx 动态路由与健康检查
在 Nginx 配置中定义一个 upstream,初始只指向 blue;同时启用 health_check(需 Nginx Plus)或用简单心跳 + 自定义脚本模拟健康判断。单机场景更常用轻量方案:
- 编写一个
check_api.sh脚本,轮询http://api-blue:8081/health和http://api-green:8082/health - 根据返回状态生成临时 upstream 配置(如
upstream backend { server api-blue:8081; }) - 调用
nginx -s reload生效新配置 - 注意:Nginx 默认不支持 run-time 修改 upstream,所以需靠外部脚本生成配置文件再重载
实现蓝绿切换的简易流程
发布新版本时,不中断旧服务,而是部署 green 实例 → 验证 → 切流 → 下线 blue:
- 先启动 green 实例:
docker compose up -d api-green - 等待 green 健康就绪(可用
curl http://localhost:8082/health确认) - 执行切换脚本:将 Nginx upstream 指向
api-green:8082,然后docker kill -s HUP nginx-container或docker exec nginx nginx -s reload - 观察流量是否已切至 green(查 Nginx access log 或服务日志)
- 确认无误后,关闭 blue:
docker compose stop api-blue
补充建议:提升可靠性和可观测性
单机蓝绿虽轻量,但容易忽略细节:
- 所有服务共享同一 volume 时,注意 green 版本不要误删 blue 的持久化数据
- 在 Nginx 日志中添加
$upstream_addr,便于快速识别当前转发目标 - 用
docker compose --profile区分 blue/green 启动(如compose --profile blue up -d) - 把切换脚本封装为 Makefile 或 shell alias,例如
make switch-to=green
不复杂但容易忽略的是配置热重载的安全性——确保 Nginx 配置语法正确再 reload,否则会导致网关不可用。可在脚本中加入 nginx -t 校验步骤。











