容器重启策略需按场景选型:no适合调试,on-failure[:max]响应非零退出,always无视退出码强制重启,unless-stopped为生产首选,手动stop后不再自启;须结合健康检查防假活。
容器重启策略不是“开了就稳”,关键在选对策略、配好边界、验证效果。直接生效的配置,必须结合实际退出行为和运维意图来定。
四种重启策略怎么选
no:默认值,适合调试或单次任务。容器一停就停,不干预。
on-failure[:max-retries]:只对非零退出码响应。比如应用 panic 退出(状态码 2)、连接数据库失败(状态码 1)会触发重启;而正常 shutdown(exit 0)不会。加 :5 表示最多重试 5 次,避免无限循环拉起崩溃进程。
always:不管 exit 0 还是 exit 1,只要停了就拉。宿主机重启后也会自动启动。但注意:手动执行 docker stop 后,它仍会重启——这点常被误认为“不受控”。
unless-stopped:生产环境最推荐。行为和 always 类似,但一旦你手动 stop,它就不再自动拉起,便于计划内维护。系统重启后照常恢复。
配置方式与即时生效要点
创建时设置最稳妥:
-
命令行:
docker run -d --restart=unless-stopped --name api-svc nginx:alpine -
Docker Compose(v3+):
restart: unless-stopped写在 service 下,无需额外参数 -
更新已有容器:不支持直接修改 restart 策略。需
docker commit保存状态 +docker run新启,或停用旧容器后用相同参数重建
容灾演练三步走
别等真出事才试。每次上线前做一次轻量级验证:
-
模拟崩溃:进容器执行
kill 1(向 PID 1 进程发信号),观察是否按策略重启(docker ps查状态,docker logs -f看启动日志) -
模拟宿机重启:在测试机上
sudo reboot,确认容器在 Docker daemon 启动后自动恢复(注意:Docker 服务本身需设为开机自启) -
验证“手动停止”边界:对 unless-stopped 容器执行
docker stop,再docker start—— 它不该自己起来;而 always 容器停后几秒就会自动 back up
搭配健康检查才真正防住假活
重启策略只管“进程是否存在”,不管“服务是否可用”。比如 Nginx 进程活着,但 upstream 全挂了,用户请求全 502。
加 HEALTHCHECK 才能补位:
- Dockerfile 中写:
HEALTHCHECK --interval=30s --timeout=3s --retries=3 CMD curl -f http://localhost/health || exit 1 - 配合 restart 策略:当健康检查连续失败 3 次,容器会被标记 unhealthy;此时若策略是 on-failure 或更激进的,可能触发重启(取决于退出行为)
- 在 Swarm/K8s 中,healthcheck 失败还可触发滚动替换,比单纯重启更可靠


















