Docker 重启策略详解
2 分钟阅读
Docker 容器的重启策略有四种:no、always、on-failure、unless-stopped。
| 情况 | no | always | on-failure | unless-stopped |
|---|---|---|---|---|
| 容器正常退出 (0 状态) | 不重启 | 重启 | 不重启 | 重启 |
| 容器非正常退出 (非 0 状态) | 不重启 | 重启 | 重启 | 重启 |
手动停止 (docker stop) | 不重启 | 不重启 | 不重启 | 不重启 |
| Docker 服务重启 (如系统重启) | 不重启 | 重启 | 不重启 | 不重启 |
下面通过一个 demo 来演示它们的区别。
准备测试环境
创建一个名为 test.sh 的脚本,5 秒后自动退出:
创建 Dockerfile 将其打包进镜像:
构建镜像:
no
容器 5 秒后退出,docker daemon 不做任何处理。
结论:容器退出后不重启。
always
容器退出后 docker daemon 自动重启。虽然每次生命周期只有 5 秒,但不断重启,表面上像一直在运行。
如果手动 docker stop 停止,不会自动重启。但重启 Docker daemon 后,容器会再次启动。
结论:除非手动停止,否则总是重启。重启 Docker daemon 也会触发。
on-failure
容器退出后触发重启。容器退出后触发重启。当重启达到 3 次上限后不再重启。
注意:Docker 认为容器成功启动至少需运行 10 秒。脚本 5 秒就退出,触发重启的次数会持续累加直到上限(参考Docker 官方文档)。
结论:仅在容器非正常退出时重启,可设置最大重试次数。
unless-stopped
表现和 always 一样——容器退出后自动重启。区别在于:手动 docker stop 停止后,重启 Docker daemon 时容器不会自动启动,而 always 会。
结论:与 always 类似,但手动停止后重启 Docker 不会再次启动。
如何选择
no:一次性任务、调试环境,不需要自动重启always:Web 服务、数据库等需要持续运行的服务on-failure:脚本任务、批处理作业,只在出错时重试unless-stopped:和always类似,但希望手动停止后不再被 Docker 重启时使用