推荐生产环境首选 unless-stopped:容器在 docker 守护进程重启或宿主机重启后自动拉起,但手动执行 docker stop 后不再自启;always 适合绝对不可中断的核心服务;on-failure:3 适用于依赖外部服务且需防死循环的场景;no 为默认值,适用于一次性任务。

要让 Docker 容器在异常退出或宿主机重启后自动拉起,关键不是“写个脚本轮询”,而是用好 Docker 原生的 --restart 策略,并确保底层服务支撑到位。
容器重启策略怎么选才合适
不同业务场景适合不同策略,不能一概用 always:
-
unless-stopped(推荐生产环境首选)- Docker 守护进程重启(比如 daemon 崩溃后恢复)或宿主机重启时,自动启动容器
- 但如果你手动执行过
docker stop myapp,它就不会再自启,尊重运维意图 - 适合 Web 服务、API 网关、缓存等无状态或状态可恢复的服务
-
always(慎用)- 不管容器是否被手动停过,只要 Docker daemon 启动,就强制拉起
- 适合极少数绝对不可中断的核心组件,比如集群协调器(etcd)、证书签发服务(cert-manager)
- 必须搭配
HEALTHCHECK,否则健康失败也会无限重启
-
on-failure[:max](调试/有依赖场景更安全)
OpenClaw Docker Setup下载在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 只在容器非零退出码时重启(如崩溃、OOM 被 kill 的 137 码)
- 加上限值如
on-failure:3,避免因配置错误、数据库连不上等永久性问题陷入死循环 - 适合依赖外部服务(如 MySQL、Redis)的应用,建议配合启动等待逻辑
-
no(默认值,不重启)- 适用于一次性任务、CI 构建容器、或你用 Kubernetes / systemd 等上层编排管理生命周期的情况
新建容器时直接配置 restart 策略
命令里加 --restart 参数,必须配合 -d(后台模式)才生效:
# 启动一个 Nginx,宿主机重启后自动恢复,但手动 stop 后不再拉起 docker run -d --restart unless-stopped --name web -p 80:80 nginx # 启动一个 Redis,异常退出最多重试 5 次 docker run -d --restart on-failure:5 --name cache redis # 启动一个核心服务,要求无条件复活(需配 HEALTHCHECK) docker run -d --restart always --health-cmd="redis-cli ping" --health-interval=30s redis
已有容器补设 restart 策略
无需停止容器,docker update 可实时生效(Docker 20.10+):
# 把已运行的容器设为 unless-stopped
docker update --restart unless-stopped myapp
# 查看是否设置成功
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' myapp
# 输出应为 unless-stopped、always 或 on-failure
别漏掉两个关键前提
光配 --restart 不够,下面两点必须同时满足:
-
Docker 服务本身要开机自启
运行这条命令,确保dockerd在系统启动时自动拉起:sudo systemctl enable docker
容器必须以 detached 模式(
-d)运行
前台交互模式(如docker run -it ubuntu bash)不触发任何 restart 策略,哪怕写了--restart也无效
验证和常见踩坑点
- 模拟验证:执行
sudo systemctl restart docker,然后docker ps看容器是否已运行 - 端口冲突?容器启动失败会立即重试,没延迟——建议应用内加等待逻辑(如
wait-for-it.sh)或用docker-compose的depends_on+healthcheck - 数据库类容器(PostgreSQL、MySQL)务必挂载持久化卷(
-v),否则重启后数据清空 -
docker update --restart对正在运行的容器生效,但on-failure类策略只响应“本次运行周期内”的异常退出,不保证宿主机重启后一定拉起(unless-stopped和always才支持)
不复杂但容易忽略










