关键在于restart字段须与image等同级缩进、选unless-stopped策略兼顾自动恢复与手动维护可控性、配合healthcheck和service_healthy依赖检查防启动风暴,并确保docker daemon开机自启。

服务器重启后容器自动拉起,关键不是“加个 restart 就完事”,而是整套配置要对路——位置、策略、依赖、健康检查,四者缺一不可。
restart 字段必须放对位置
它得和 image、ports、environment 在同一缩进层级,不能顶格写,也不能多缩进一级。错位就等于没写:
- ✅ 正确写法:
restart: unless-stopped和ports对齐(通常两个空格) - ❌ 常见错误:写在
services:下直接顶格;或缩进比image多一层;或塞进deploy:块里——这些 Compose 全部忽略
选 unless-stopped 最稳妥
它和 always 行为接近,但多一个“人治开关”:你手动执行 docker-compose stop 后,下次 Docker 守护进程启动(比如宿主机重启),它不会自动起来。运维做计划内维护时不会误触发。
-
no:调试用,退出就停 -
on-failure:3:适合批处理任务,失败最多重试 3 次,防死循环 -
always:会无视你的手动 stop,宿主机重启后一定拉起,容易干扰维护
依赖服务要等真正就绪,不能只等容器启动
depends_on 只管容器是否 running,不管数据库连不连得上、API 能不能响应。光靠它,web 容器常因连不上 db 而反复崩溃重启。
- 给 db 加 healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"] - 让 web 等 db 健康再启动:
depends_on: { db: { condition: service_healthy } } - 这样能避免“启动风暴”——即容器刚起就崩、崩了又起、起了又崩的恶性循环
确认 Docker 服务开机自启
Compose 自动拉起的前提是 Docker daemon 本身在系统启动时就运行了。
- Linux 上执行:
sudo systemctl enable docker - 验证是否生效:
systemctl is-enabled docker返回enabled - 如果 Docker 没自启,compose.yml 写得再规范也没用











