如何在不停止现有运行容器的前提下完成新版本Docker容器生产部署
Docker 容器版本零停机更新方案
核心解决思路是通过流量切分的方式规避端口占用冲突,不需要提前停止旧容器即可完成版本迭代,以下是两种常用落地方案:
方案一:手动实现轻量蓝绿部署(适配单节点小型服务场景)
操作步骤如下:
- 拉取最新版本镜像,操作命令和原有流程一致:
docker pull <镜像名称>:<版本标签> - 启动新版本容器,不要映射和旧容器相同的宿主端口,比如旧容器对外映射宿主8080端口,新版本可以映射到8081端口,参考启动命令:
docker run -d -p 8081:80 --name <新版本容器名称> <镜像名称>:<版本标签>
启动完成后先执行健康检查,比如调用服务接口、查看容器运行日志,确认新容器服务可用后再进行下一步操作。 - 调整反向代理(如Nginx)配置,将原本指向旧容器8080端口的流量规则,修改为指向新容器的8081端口,执行平滑重载命令使配置生效:
nginx -s reload
该操作不会导致请求中断,不会产生停机时间。 - 确认所有流量已切换至新容器,且新容器运行稳定无异常后,再停止并删除旧容器即可。如果新版本出现问题,只需将反向代理配置切回旧容器端口即可实现秒级回滚。
方案二:通过Docker编排工具自动实现(适配多节点、生产级服务场景)
如果已经使用容器编排工具,可以直接用自带的滚动更新能力,无需手动调整代理配置:
- 使用Docker Compose的场景:在
docker-compose.yml中配置deploy.update_config字段,指定并行更新容器数、健康检查阈值等参数,执行docker compose up -d时工具会自动先启动新版本容器,确认健康后再下线旧容器,全程不会出现服务中断,端口冲突问题由Compose自动调度处理。 - 使用Docker Swarm、Kubernetes等集群编排工具的场景:自带成熟的滚动更新、蓝绿发布能力,集群的Service/Ingress层会统一管理对外端口,更新过程中先启动健康的新版本实例,再逐步下线旧版本实例,全程对外服务无感知。
注意:无论使用哪种方案,都建议提前配置服务健康检查逻辑,确认新版本完全可用后再切流量,更新后至少保留10~30分钟的观察窗口再删除旧容器,预留快速回滚的能力。
内容的提问来源于stack exchange,提问作者Prabin Ojha
相关产品推荐
相关产品推荐

