Docker四种重启策略:no(默认不重启)、on-failure[:N](仅非零退出码重启,可限次)、always(任何退出都重启)、unless-stopped(自动重启但尊重手动停止),生产推荐unless-stopped。

Linux 容器设置重启策略是保障服务高可用最直接、最基础的手段。关键不在于“能不能重启”,而在于“什么时候重启、怎么重启、重启几次”。Docker 原生支持四种核心策略,选对策略比堆监控工具更有效。
四种重启策略怎么选
每种策略对应不同业务逻辑,不能一概套用 always:
- always:容器退出就重启,宿主机重启后也自动拉起。适合 Nginx、PostgreSQL 这类必须长期在线的服务。
-
unless-stopped:和 always 类似,但会尊重人工干预——你执行过
docker stop,它就不会再自启。生产环境最常用,兼顾自动恢复与运维可控性。 -
on-failure[:N]:只在非零退出码时重启,可限制最多重试 N 次(如
on-failure:3)。适合批处理脚本或依赖外部资源可能临时失败的应用。 - no:默认策略,退出即终止。仅用于调试、一次性任务或需完全手动控制的场景。
运行时设置 vs 动态更新
策略可在启动时指定,也能事后调整,无需重建容器:
- 新建容器时加参数:
docker run -d --restart unless-stopped --name api nginx:alpine - 已存在容器直接更新:
docker update --restart always mysql-db(Docker 20.10+ 支持) - 注意:
docker update不立即触发重启,只修改元数据;下次容器因异常退出或 Docker 守护进程重启时才生效。
验证策略是否生效
别只信配置,要查实际状态:
- 看策略定义:
docker inspect myapp | jq '.HostConfig.RestartPolicy'或简写为docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' myapp - 看历史行为:
docker ps -a中 STATUS 列若显示Restarting (1)或含(Exited)后又变回Up,说明策略已在起作用。 - 模拟测试:手动
docker kill -9 myapp,观察是否自动重启(注意不要在生产环境随意 kill 关键服务)。
搭配健康检查提升可靠性
重启策略解决“挂了就拉”,健康检查解决“活着但不对”:
- 在 Dockerfile 中定义:
HEALTHCHECK --interval=30s --timeout=3s --retries=3 CMD curl -f http://localhost/health || exit 1 - 容器内应用即使没崩溃,但响应超时或返回错误码,Docker 会标记为 unhealthy,配合 restart 策略(如 on-failure)可触发重建。
- 注意:健康检查本身不触发重启,需与 restart 策略协同使用才完整。


















