docker服务未开机自启是容器不重启的主因;应先执行sudo systemctl enable docker确保服务自启,再用--restart unless-stopped设置容器策略,并手动启动一次容器以激活策略。

容器不重启?先确认 Docker 服务本身是否开机自启
容器开机不拉起,八成是因为 docker.service 根本没起来。系统启动时如果 Docker daemon 没运行,--restart 策略就完全失效。
检查方法:
-
systemctl is-enabled docker—— 应返回enabled -
systemctl status docker—— 看是否为active (running)
没启用就补上:
sudo systemctl enable docker
别跳过这步——哪怕你只改了容器的 --restart,Docker 服务没自启,一切白搭。
用 --restart=unless-stopped 是最稳妥的选择
新建容器时加这个参数,能兼顾自动恢复和人工干预自由度:宿主机重启后自动启动,但如果你手动执行过 docker stop myapp,它就不会偷偷再拉起来。
对比其他策略:
-
always:哪怕你刚docker stop完,Docker daemon 一活过来就立刻start,容易干扰调试 -
on-failure:只对非零退出码响应,适合批处理任务,不适合长期服务(比如 nginx、redis) -
no:默认值,啥也不干
实操示例:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
docker run -d \ --name web \ --restart unless-stopped \ -p 80:80 \ nginx:alpine
已有容器怎么补设重启策略?用 docker update
创建容器时忘了加 --restart?不用删重跑,docker update 可热更新配置,且立即生效(下次容器退出或宿主机重启时触发)。
注意点:
- 容器必须处于停止或运行状态都可执行;但不能是
created或exited且未被start过的“半残”状态 - 命令里不能带等号空格:错的写法是
--restart = unless-stopped,正确是--restart unless-stopped - 批量设置所有容器(慎用):
docker update --restart unless-stopped $(docker ps -aq)
单个容器补设:
docker update --restart unless-stopped web
为什么 systemd 服务方式反而容易出问题?
有人喜欢写 /etc/systemd/system/docker-web.service 来调用 docker start,逻辑看似清晰,但实际埋了几个坑:
- 容器名冲突:如果同名容器已存在,
docker start失败,systemd 会不断重试直到超时 - 镜像拉取缺失:systemd 不管
docker pull,若镜像不存在,start直接报错退出 - 依赖顺序脆弱:仅靠
After=docker.service不够,Docker daemon 启动完成 ≠ 所有网络/存储驱动就绪
除非你要做「启动前清理旧容器 + 拉取新镜像 + 注入动态配置」这类复杂流程,否则纯靠 --restart 更轻量、更可靠。
真正容易被忽略的是:重启策略只在容器**退出后**才触发,不是“开机瞬间立刻启动”。所以首次部署后,务必手动 docker start 一次,让容器进入 running 状态,后续才能被策略接管。










