答案是四种重启策略需按场景选用:no适用于一次性任务;on-failure[:max]适用于批处理类应用;always适用于关键服务且不介意手动停止后仍重启;unless-stopped最推荐于生产环境,宿主机重启后自动启动,但手动停止后不再恢复。
直接在启动容器时加 --restart 参数,或者对已有容器用 docker update 修改,就能实现自动重启。关键不是“能不能”,而是选对策略——不同场景要匹配不同行为。
四种重启策略怎么选
Docker 提供四种内置策略,核心区别在于“什么情况下触发重启”:
- no:默认不重启,适合一次性任务或调试容器
-
on-failure[:max-retries]:只在容器以非零状态码退出时重启,可限制重试次数(如
on-failure:3),适合批处理、脚本类应用,避免无限失败循环 - always:无论退出码是 0 还是 137,只要停了就立刻拉起,连宿主机重启后也会恢复,适合数据库、消息队列等基础组件
-
unless-stopped:和
always类似,但如果你手动执行docker stop停掉它,之后 Docker 守护进程重启时就不会再自动启它——这是生产环境最推荐的策略,兼顾高可用与可控性
新建容器时设置自动重启
命令里加 --restart=策略 即可:
- 始终运行 Web 服务:
docker run -d --restart=unless-stopped --name web nginx - 运行一个可能出错的任务,最多重试 5 次:
docker run -d --restart=on-failure:5 my-batch-job - 挂载端口并启用自愈:
docker run -d -p 5432:5432 --restart=unless-stopped --name pg postgres
给已有容器补上自动重启
不用删重建,一条 docker update 就生效:
- 让已存在的容器具备开机自启能力:
docker update --restart=unless-stopped nginx - 修改为仅失败时重启:
docker update --restart=on-failure:3 worker-app - 取消自动重启(恢复默认):
docker update --restart=no redis
配合健康检查提升自愈质量
光靠退出码不够智能。比如容器进程还在,但 HTTP 接口卡死、数据库连接中断——这时需结合 HEALTHCHECK:
- 在 Dockerfile 中定义:
HEALTHCHECK --interval=10s --timeout=3s --retries=2 CMD curl -f http://localhost/health || exit 1 - 搭配
--restart=on-failure使用:一旦健康检查连续失败,Docker 会把容器标记为unhealthy并按策略重启 - 在 docker-compose.yml 中统一配置更清晰:
services:<br> api:<br> image: my-api<br> healthcheck:<br> test: ["CMD", "curl", "-f", "http://localhost/ready"]<br> interval: 15s<br> timeout: 5s<br> retries: 3<br> restart: on-failure


















