如何在运行的Docker Compose栈中无停机重建单个服务?
无停机更新Docker Compose单个服务的可行方案
完全可行,你当前操作无效的核心原因是:docker compose start只会重启已存在的旧容器,不会用新构建的镜像替换它。以下是正确的操作流程和关键注意事项:
正确的无停机更新步骤
针对你的app-01服务,按以下顺序执行:
- 停止目标服务容器:
(此时haproxy的健康检查会自动将流量切到正常运行的docker compose stop app-01app-02,前提是你配置了健康检查) - 删除旧容器(可选但推荐):
彻底清除旧容器,避免后续误启动docker compose rm -f app-01 - 构建新镜像:
docker compose build app-01 - 启动新容器:
docker compose up -d --no-deps app-01-d:后台运行容器--no-deps:仅启动目标服务,不触发其依赖服务的重启(避免影响mongo、redis等)
等app-01启动完成并通过haproxy健康检查后,再对app-02重复上述步骤,整个过程中始终有一个app服务对外提供能力,实现无停机更新。
关键注意事项
- 必须配置负载均衡健康检查:确保haproxy能检测app服务的存活状态(比如检查
/health接口),这样在服务停止/启动过程中,haproxy会自动剔除不健康实例,避免流量丢失或报错。 - 避免使用
docker compose start:该命令仅重启已存在的容器,不会应用新构建的镜像或配置变更,这是你之前遇到旧容器的根本原因。 - 验证新容器状态:启动后可以通过
docker compose logs app-01查看日志,确认服务正常启动;或通过haproxy的统计页面(如果开启)查看实例状态。
内容的提问来源于stack exchange,提问作者himmip
相关产品推荐
相关产品推荐

