如何用 docker-compose 只重启其中一个容器?
docker compose restart --no-deps 服务名 只重启指定服务;配置变了要重建用 up -d 服务名;不想动依赖容器加 --no-deps。本文区分 restart 与 recreate 的差别。
做法:docker compose restart --no-deps <服务名>——停启该服务的容器,避免重启传播到依赖服务。一个服务可能有多个副本。注意 restart 不会应用 yml 改动或替换镜像;改了配置用 docker compose up -d --no-deps <服务名>,代码打进镜像时还需构建新镜像。
两个命令的差别(关键)
# 只是重启(进程停启,容器不变,配置不更新)
docker compose restart --no-deps web
# 应用配置变更(必要时重建容器;镜像内代码另需 build)
docker compose up -d --no-deps web
| restart | up -d | |
|---|---|---|
| 应用 yml 新配置 | ❌ | ✅ |
| 应用新镜像/代码 | 不替换镜像;绑定挂载代码由应用重载决定 | 镜像内代码需先构建或配 --build |
| 速度 | 快 | 稍慢(可能重建) |
--no-deps 的作用:web 依赖 db 时,up web 默认会确保 db 也在跑;加 --no-deps 就只动 web 自己。
常用组合
# 改了代码:构建 + 只重建这一个服务
docker compose up -d --build --no-deps web
# 配置热重载能解决的别重启(如 nginx)
docker compose exec web nginx -s reload
观察重启结果
docker compose ps web # 状态
docker compose logs -f web # 日志跟随
重启完成后,检查原先失败的业务请求是否恢复。已经接入观测云日志的服务,可按服务名与重启时间查询新的错误记录,再与重启前比较;日志采集配置中应保留容器标识,避免新旧实例混在一起。
常见问题(FAQ)
Q:restart 后改动没生效?
A:restart 不重读 yml 也不换镜像——用 up -d(配置)或 up -d --build(代码)。
Q:depends_on 的服务会跟着重启吗?
A:显式 restart 在部分依赖配置下可能传播重启;不希望涉及依赖服务时,restart 和 up 都使用 --no-deps。
Q:能滚动式逐个重启副本吗?
A:Compose 没有自动滚动更新保证。docker compose restart web 会涉及该服务的多个容器;需只重启一个副本时,先用 docker compose ps web 确认容器 ID,再用 docker restart <容器ID>。逐个手工操作也不保证零停机;需要滚动编排时用 K8s/Swarm。