容器不启动的根本原因是docker.service未开机自启;必须先执行sudo systemctl enable docker确保服务自启,再配置--restart=unless-stopped策略并验证生效。

docker.service 没开机自启,容器根本不会动
容器设了 --restart=always 却不启动?八成是 docker.service 本身没随系统起来。Docker 守护进程不运行,所有容器策略都形同虚设。
检查方法:
-
systemctl is-enabled docker—— 必须返回enabled -
systemctl status docker—— 状态得是active (running)
如果没启用,立刻补上:
sudo systemctl enable docker
顺手再确认服务已运行:sudo systemctl start docker(若状态为 inactive)
--restart=unless-stopped 是生产环境最稳妥的选择
它兼顾自动恢复和人工干预:宿主机重启后自动拉起,但只要你手动执行过 docker stop myapp,它就不会偷偷再启——避免调试时被“复活”干扰。
新建容器时直接加参数:
docker run -d --restart=unless-stopped --name nginx nginx:alpine
已有容器补设:
docker update --restart=unless-stopped nginx
别用 always 的典型场景:
- 你常手动停容器做配置验证或日志排查
- 容器启动依赖外部服务(如数据库还没就绪),盲目 auto-start 可能反复失败打日志
怎么确认策略真生效了?别只信命令返回
设置完必须验证,否则重启后才发现没起,就晚了。
查单个容器当前策略:
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' nginx
应输出 unless-stopped 或 always;不是空、不是 no。
批量看所有容器状态和重启次数:
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.RestartCount}}"
模拟验证更可靠:执行 sudo systemctl restart docker,等 5 秒,再跑 docker ps,目标容器必须出现在列表里且状态为 Up。
用 docker-compose 的人,别漏掉 service 级配置
Compose 不会继承全局策略,每个 service 必须显式声明 restart。
示例 docker-compose.yml:
services:
db:
image: postgres:15
restart: unless-stopped
api:
build: .
restart: always
部署必须用 docker-compose up -d 启动,后续 Docker 服务重启才会触发自动恢复。直接 docker run 起的容器,Compose 配置完全不生效。
真正容易被忽略的是:docker-compose.yml 里的 restart 和 docker run --restart 是两套独立机制,混用时策略不会叠加,也不会覆盖——只认自己那一层的定义。


















