在使用 Docker Compose 管理服务器服务时,一个非常常见但经常被误解的问题是:
执行
docker compose stop之后,如果系统重启,这些容器会不会自动启动?
这个问题如果理解错误,可能导致服务器重启后关键服务无法恢复,或者相反,一些本应“冷静”的服务又被意外启动。
本文对 Docker Compose 的停止机制与自动重启行为进行系统性说明。
1. docker compose stop 的真实含义
执行:
docker compose stop
其行为是:
- 向 Compose 项目中的容器发送
SIGTERM - 停止容器进程
- 保留容器、网络、volume 和配置
- 将容器状态标记为
exited
这是一个逻辑层面的“人为停止”,不是故障,不是崩溃,而是一个明确的运维决策。
2. 系统重启后是否会自动启动?
答案是:不会。
如果某个容器曾被 docker compose stop 停止,那么:
- 系统重启
- Docker daemon 重启
- 宿主机断电重启
都不会自动将其启动。
该容器会保持 exited 状态,直到手动执行:
docker compose start
3. restart: unless-stopped 为什么不起作用?
很多人会在 docker-compose.yml 中写:
restart: unless-stopped
并以为这样就一定会自动启动。
但实际上:
unless-stopped的语义是
“只要不是被人为停止,就在 Docker 启动时自动恢复”
而 docker compose stop 正是一个**明确的“人为停止”**标志。
因此一旦某个容器被 stop 过,Docker 就会尊重这个状态,不会再自动拉起它。
4. 自动启动与停止的完整规则
容器是否会在系统启动后自动运行,取决于两点:
| 条件 | 说明 |
|---|---|
是否设置了 restart 策略 | 如 always 或 unless-stopped |
| 容器是否被手动 stop | 只要 stop 过,就不会再自动启动 |
对照表如下:
| 场景 | 是否自动启动 |
|---|---|
| 容器运行中 → 系统重启 | ✅(有 restart) |
执行 docker compose stop 后 → 系统重启 | ❌ |
| Docker 守护进程崩溃 → 自动恢复 | ✅ |
docker compose down | ❌(容器已不存在) |
5. stop 与 down 的根本区别
| 命令 | 含义 |
|---|---|
docker compose stop | 停止容器,保留一切 |
docker compose start | 继续使用同一个容器 |
docker compose down | 删除容器和网络(volume 默认保留) |
如果只是暂时不用服务,正确操作是:
docker compose stop
而不是 down。
6. 适合长期服务器的使用模型
一个成熟的 Docker Compose 服务器应当遵循以下模式:
- 核心服务(反代、存储、认证、基础设施)
→ 依赖restart: unless-stopped,永远不手动 stop - 按需服务(测试环境、迁移任务、一次性服务)
→ 使用docker compose stop进行明确控制
这样可以保证:
- 系统重启后,真正重要的服务自动恢复
- 被明确关闭的服务不会“复活”
这是长期稳定运行服务器的关键设计原则。
7. 查看当前状态
随时可以使用:
docker compose ps
判断:
running:正在运行exited:被 stop 的服务created:存在但从未启动
总结
docker compose stop 是一个强意图指令:
它告诉 Docker ——“这个容器是被人关掉的,不要在重启时复活它”。
理解这一点,才能真正掌控服务器的启动行为,而不是被 Docker 的自动机制“反向控制”。
在长期运行的服务器中,
stop 是权威决策,restart 只是默认行为。