零停机发布不依赖“down参数”,而是通过健康检查、滚动更新策略(如start-first)、流量门控和自动回滚组成的闭环机制实现;docker-compose down会中断服务,应禁用,改用滚动或蓝绿部署。

“down 参数”并不是标准的零停机发布术语,实际中并不存在一个叫 down 的通用部署参数。你可能指的是以下几种常见场景之一:
1. 误将 docker-compose down 当作发布命令
这是最常见误解。执行 docker-compose down 会**立即停止并删除所有容器、网络和卷**,导致服务完全中断——这恰恰是零停机发布的反面。
✅ 正确做法是:在 CI/CD 中彻底避免在生产环境使用 down,改用支持滚动更新或蓝绿切换的机制:
- 使用
docker-compose up -d --scale web=4启动新实例,再通过健康检查+负载均衡器逐步下线旧实例 - 在
deploy:配置块中启用滚动策略(Docker Compose v3.8+):
```yaml
deploy:
replicas: 4
update_config:
parallelism: 2
delay: 10s
order: start-first # 先启新,再停旧
failure_action: rollback
``` - 配合
healthcheck确保新容器就绪后才参与流量分发
2. 混淆 Kubernetes 的 maxUnavailable 与 “down”
Kubernetes Deployment 中的 maxUnavailable: 1 表示允许最多 1 个 Pod 不可用,但它的作用是**控制滚动更新时可容忍的不可用副本数**,不是“让服务 down”。它保障的是:即使在更新中,也始终有 replicas - maxUnavailable 个 Pod 在运行。
✅ CI/CD 流水线中应显式配置该参数,例如:
- Jenkinsfile 或 GitHub Actions 中调用
kubectl apply -f deployment.yaml,而 YAML 文件内已定义:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0 # 关键!确保更新中 0 个 Pod 不可用
maxSurge: 1 # 允许临时多起 1 个新 Pod
```
这样就能实现“旧 Pod 不终止,直到新 Pod Ready 并接管流量”。
3. 将数据库迁移中的 --down(如 Flyway/Liquibase)误解为服务停机
某些数据库迁移工具(如 Liquibase)提供 rollback 命令,有时别名为 lb down,但这仅回退数据库变更,不等于服务下线。
✅ 安全实践是:
- CI/CD 流水线中将 DB 迁移与应用部署分离:先执行兼容性迁移(只增不删字段),再部署新代码;最后按需清理旧字段
- 禁止在生产流水线中自动执行破坏性
down或rollback,必须人工审批或走独立回滚通道 - 所有迁移脚本需幂等,且与新旧版本应用代码双向兼容
4. CI/CD 流水线中真正的“防 down”关键配置点
零停机不靠某个 magic 参数,而靠整套协同机制。以下是必须落地的 CI/CD 配置项:
-
健康检查集成:在构建镜像时嵌入
HEALTHCHECK,CI 流程中验证curl -f http://localhost/health返回 200 -
就绪探针(readinessProbe):K8s 中配置
initialDelaySeconds和periodSeconds,确保 Pod 进入Ready状态才接入 Service -
流量切换门禁:在部署阶段插入自动化卡点,例如:
– 调用 Prometheus API 查询新实例错误率 – 等待至少 2 分钟无 5xx 报警 - 自动回滚触发:当健康检查连续失败、HTTP 200 率低于阈值、或 CPU/内存突增时,CI/CD 工具(如 Argo CD、Jenkins 插件)自动执行上一版镜像回滚
零停机发布不依赖单个“down 参数”,而是靠健康检查、滚动策略、流量门控和自动验证组成的闭环。把注意力从“怎么 down”转向“怎么稳住旧的、再无缝换新的”,才是实战核心。










