• zxb的博客
    • 运维
      • 🧊即插即更:移动硬盘与 U 盘的自动同步方案
      • ⛳FRP穿透个人博客——SSL安全篇
      • 📄Github Action自动化部署Vue3项目
      • 🎲Docker Desktop 代理配置:让镜像拉取更稳更快
      • 🤓FRP穿透搭建个人博客(白嫖SSL版)
      • 🪁FRP穿透搭建个人博客
      • 📄Kubeeasy安装K8s集群(附独家报错解决)
      • 📄不用 Kubernetes,Docker Compose 也能实现零停机蓝绿发布
    • 技术体验
      • 🛡️别再找插件了,美团出品的Tabbit才是真正的AI浏览器
      • 💧GitHub 霸榜!Tabbit平替:给浏览器装上“最强大脑”,这才是真·AI 浏览器插件
    • 自制软件插件
      • 🧋🧧 仪式感拉满!这款开源“年味”小游戏,带你瞬间找回童年快乐!
      • 🕸️摸鱼神器——摸了吗
      • 🔍🚀 思源笔记 S3 插件 v1.0.2 更新:手把手教你配置 PicList 导出
      • 🌊🚀 思源笔记 S3 插件 v1.0.3 更新:一键解锁 BM.md 精美排版!
      • 🥔AE机器人大模型案例
      • Claude Code 终于会"叫"了 —— 一个 10MB 小工具,让 AI 跑完任务发个声
    • 开发小技巧
      • 🪴【保姆级】NAS 骚操作:白嫖百 T 网盘做图床!阿里云/百度秒变“私有云相册”,快到飞起!
    • 后端技术
      • 🚁解决 Spring Session 分布式部署难题:Redis 集成指南
      • 📄使用ThreadLocal实现用户身份认证
      • SpringAI
        • 别再手写 HTTP 客户端调 AI 了!Spring AI 官方出手,一行代码搞定多模型切换
      • 📄使用注解+反射实现自动填充
      • Spring
        • 🔁循环依赖:一个Spring经典坑
        • Spring如何解决依赖循环
        • 🫛什么是Spring Bean
      • Java基础
        • 什么是序列化和反序列化?
        • 📄Java中HashMap的原理
    • 📑前端技术
      • 🫚axios工具类
      • 🍛Vite项目屏幕适配的两种方案,超详细
      • 📕vue-router小技巧:通过route传参动态设置页面
    • 疑难杂症
      • 🕙SpringWeb报错——CORS问题解决
      • 📄一行 JVM 参数解决 HttpClient 卡死:强制 Java 禁用 IPv6
      • 📄修复github action注入npm包权限问题
zxb的博客运维

不用 Kubernetes,Docker Compose 也能实现零停机蓝绿发布

访问次数 2132 次创建时间 2026-03-27 11:08

从一次简单的 docker compose up -d,到一套可靠的生产发布流程设计。

写在前面

Docker Compose 在中小型项目中非常常见,但直接执行 docker compose up -d时,旧容器停止、新容器启动、应用初始化和数据库迁移之间可能存在不可用窗口。

蓝绿发布通过同时维护 Blue 和 Green 两套环境,把发布过程拆成:

启动新环境 → 健康检查 → 流量切换 → 观察 → 清理旧环境。

image

什么是蓝绿发布

蓝绿发布(Blue-Green Deployment)的核心:

同时维护两套运行环境,但任意时间只有一套承接线上流量。

Blue 表示当前生产环境,Green 表示待发布的新版本。

发布步骤:

  1. 确认当前环境;
  2. 启动备用环境;
  3. 检查健康状态;
  4. 切换 Nginx 流量;
  5. 观察业务指标;
  6. 保留旧版本用于回滚。

Docker Compose 双环境设计

示例:

services:
  app-blue:
    image: registry.example.com/my-app
    environment:
      RELEASE_COLOR: blue
    ports:
      - "127.0.0.1:18081:8080"
​
  app-green:
    image: registry.example.com/my-app
    environment:
      RELEASE_COLOR: green
    ports:
      - "127.0.0.1:18082:8080"

两个环境分别运行:

  • Blue:18081
  • Green:18082

Nginx 如何切换流量

蓝绿发布真正切换的是入口,而不是容器。

切换前:

用户
 |
Nginx
 |
Blue :18081

切换后:

用户
 |
Nginx
 |
Green :18082

Nginx upstream:

upstream app_backend {
    server 127.0.0.1:18081;
}

修改为:

upstream app_backend {
    server 127.0.0.1:18082;
}

然后:

nginx -t
nginx -s reload

image

数据库迁移

蓝绿发布最大的风险来自数据库。

推荐采用 Expand-Migrate-Contract:

  1. Expand:新增字段、表、索引,不删除旧结构;
  2. Migrate:新旧版本兼容运行;
  3. Contract:确认稳定后清理旧逻辑。

蓝绿发布不能自动解决数据库不兼容问题。

回滚

如果新版本异常,只需要恢复旧 upstream:

upstream app_backend {
    server 127.0.0.1:18081;
}

然后:

nginx -t
nginx -s reload

即可恢复旧版本。

总结

Docker Compose 配合 Nginx,同样可以实现可靠的生产发布:

启动备用环境
        ↓
健康检查
        ↓
切换流量
        ↓
业务验证
        ↓
清理旧环境

核心思想:

不替换正在运行的环境,而是先准备好新的环境,再切换流量。

评论

0 条评论

暂无评论,欢迎第一个留言。

验证码
回复评论
验证码
举报内容
验证码
由 b8l8u8e8 提供支持