单机 Docker 蓝绿发布
本技能面向资源有限但需要降低发布中断的单机部署。它不引入 Kubernetes,而是用两个应用槽位、一个活动上游和明确状态文件建立最小可控发布闭环。
何时使用
- 单台云服务器运行 Docker Compose + Nginx 应用。
- 当前发布会重建/重启唯一应用容器,造成用户中断。
- 需要候选版本验证、原子切流、自动回滚和更新提示。
- 需要评估数据库迁移对零停机的影响。
不适用于服务器资源无法同时运行两个实例;此时应选择滚动重启、短维护窗或扩容。
最小拓扑
app_blue与app_green:相同镜像协议,不同端口/容器名。- Nginx:只把公网流量转发给活动槽位。
- 共享依赖:数据库、对象存储和必要的应用密钥。
- 状态文件:
active、candidate、previous,记录版本、槽位和端口。 - 发布脚本:Stage、Promote、Rollback 三个独立动作。
工作流程
1. 评估前置条件
确认 CPU、内存、磁盘、端口、镜像构建时间、会话存储、文件上传、后台任务和 WebSocket。先做容量验证,再承诺零停机。
2. 定义发布契约
Stage: 启动非活动槽位 → 迁移/准备 → 内网健康与冒烟 → 标记 candidate
Promote: 再次健康检查 → 原子更新 Nginx 上游 → reload → 连续性探测 → 标记 active
Rollback: 恢复 previous 上游 → reload → 健康检查 → 标记状态
3. 设计健康检查
健康检查至少区分:进程存活、依赖就绪、关键只读查询和版本号。不要用首页 200 代替全部健康。
4. 审查数据库迁移
使用 expand/contract:先增加兼容结构,再部署兼容新旧结构的应用,最后在旧版本退出后清理。不可逆迁移必须有备份、验证和独立回滚方案。
5. 处理共享状态
两个槽位必须共享相同认证密钥、上传存储和必要缓存。后台任务需防止双实例重复消费,使用 leader、队列或显式开关。
6. Stage 候选版本
在非活动端口启动,检查容器状态、应用版本、数据库连接、关键路由、静态资源和日志。Stage 失败不得影响活动槽位。
7. Promote 与连续性探测
切流前后持续探测关键公开路由,记录 5xx、延迟和连接错误。只有 Promote 成功后才写入更新通知或版本可用状态。
8. Rollback 演练
在非生产或低风险窗口实际演练一次回滚。确认状态文件、Nginx 配置和旧容器仍可用。数据库不兼容时,应用回滚不等于完整回滚。
输出格式
# 单机蓝绿发布方案
当前拓扑:
容量结论:可行 / 需扩容 / 不建议
## Stage
- ...
## Promote
- ...
## Rollback
- ...
## 风险表
| 风险 | 触发条件 | 检测 | 回退 |
## 验收
| 检查项 | 阈值 | 证据 |
质量门槛
- Stage 失败不会改动活动流量。
- Promote 使用原子配置变更并能立即回退。
- 数据库迁移兼容新旧两个应用版本。
- 更新通知只在 Promote 成功后出现。
- 至少有一次真实的连续性探测和回滚演练。
- 不把单机蓝绿描述为机器级高可用;主机故障仍是单点风险。
微信扫一扫