容器不会自动重启,绝大多数是因为Docker服务未开机自启且容器重启策略配置不当;须同时启用systemctl enable docker和设置--restart=unless-stopped等合适策略。

容器不会自动重启,绝大多数情况是因为只配了 --restart 却没让 Docker 服务自己开机自启——两者必须同时生效,缺一不可。
先确认 Docker 守护进程是否开机自启
Docker 容器的自动重启依赖于 dockerd 进程本身在系统启动后已运行。如果 systemctl 没启用 docker 服务,哪怕容器策略设成 always,它也压根没机会被拉起。
- 检查状态:
systemctl is-active docker(应返回active),systemctl is-enabled docker(应返回enabled) - 若未启用:
sudo systemctl enable docker,再执行sudo systemctl start docker - 验证失败时看日志:
journalctl -u docker --no-pager -n 50,重点关注权限、cgroup 或存储驱动报错
选对 --restart 策略比盲目用 always 更可靠
always 看似“最保险”,但实际容易掩盖应用自身问题:比如配置错误导致容器反复崩溃退出,always 会无限重试,而 unless-stopped 至少给你手动干预的机会。
-
unless-stopped:推荐默认值。Docker 服务重启后自动拉起,且你执行过docker stop的容器不会被误启,适合绝大多数 Web 服务 -
on-failure:3:调试阶段首选。只在非 0 退出码时重启,最多 3 次,之后停住,方便查日志定位崩溃原因 -
always:仅用于绝对不能中断的核心组件(如监控采集器、日志转发器),且必须配合健康检查或外部告警 -
no:别乱删——一次性任务、CI 构建容器、调试用的临时容器就该用这个
已有容器补救:用 docker update 而不是删重建
别为了加重启策略就把运行中的容器 rm 掉再 run 一遍。数据卷、网络配置、启动参数都得重配,容易漏。
- 直接更新策略:
docker update --restart unless-stopped myapp - 验证是否写入:
docker inspect myapp | grep -A 5 "RestartPolicy",注意输出中Name字段值是否匹配预期 - 策略只对 detached 模式(
-d)生效;前台模式(-it)下该字段存在但不触发任何行为
docker-compose 用户注意 YAML 缩进和 restart 字段位置
很多人把 restart 写在 service 同级或缩进错位,导致 Compose 忽略该配置,容器仍不会自启。
- 必须放在具体 service 下,与
image、ports同级,例如:
services:
nginx:
image: nginx:alpine
restart: unless-stopped
ports:
- "80:80"restart: "unless-stopped" 带引号——YAML 解析器可能识别为字符串而非关键字docker compose up -d 重部署,docker compose restart 不会更新 restart 策略最容易被忽略的是:数据库类容器(MySQL、PostgreSQL)即使设置了 unless-stopped,若没挂载持久化卷(-v /data:/var/lib/mysql),每次重启都会丢数据——策略生效了,但服务起来也没用。


















