Docker 容器的 restart policy 配置

FreeGuideOnline 最新 2026-07-05

bash docker run --restart=no nginx


### always —— 总是重启
无论容器以何种状态码退出,Docker 都会无限次地尝试重启它。Docker 守护进程启动时也会自动启动这些容器。
```bash
docker run --restart=always nginx
  • 即使容器正常退出(退出码 0),也会被重启。
  • 适用于需要持续运行的后台服务。

on-failure[:max-retries] —— 仅失败时重启

只有当容器以非零状态码退出时,Docker 才会重启。可以通过可选参数 max-retries 限制重启次数。

# 失败时无限重启
docker run --restart=on-failure nginx

# 最多重启 3 次
docker run --restart=on-failure:3 nginx
  • 退出码为 0 表示正常退出,不会触发重启。
  • 达到最大重试次数后容器会保持停止状态,需要手动干预。

unless-stopped —— 永不停止的容器

always 类似,但区别在于:如果容器是手动停止的(docker stop),Docker 守护进程重启后不会自动启动该容器;而 always 策略会忽略手动停止状态。

docker run --restart=unless-stopped nginx
  • 如果容器因手动停止或 Docker 守护进程重启前已被停止,守护进程重启后不会恢复。
  • 适用于大多数长期运行的服务,兼顾灵活性和自动化。

配置方式

docker run 时指定

使用 --restart 参数直接设置策略。

# 启动一个重启策略为 always 的 Redis 容器
docker run -d --name my-redis --restart=always redis:7

在 Docker Compose 中配置

docker-compose.yml 中使用 restart 字段。语法与命令行稍有不同,重试次数用 max_attempts 指定。

version: "3.8"
services:
  web:
    image: nginx
    restart: unless-stopped
  db:
    image: postgres:15
    restart: on-failure:5   # Compose v3 支持简写
  worker:
    image: my-worker:latest
    restart: on-failure
    # 也可用 deploy 方式指定最多尝试次数
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3

注意:restart: on-failure:5 在较新版本的 docker-compose 中已支持,但为了兼容,可使用 deploy.restart_policy 方式。

查看和修改重启策略

查看策略

使用 docker inspect 查看某容器的 RestartPolicy。

docker inspect <容器名或ID> --format='{{.HostConfig.RestartPolicy}}'

输出示例:{always 0}{on-failure 3} 等。

修改已有容器的重启策略

可以通过 docker update 动态调整一个正在运行或已停止容器的重启策略。

docker update --restart=unless-stopped <容器名>
  • 修改立即生效,无需重启容器。
  • 该命令也可用于更改 on-failure 的重试次数。

实际操作演示

场景 1:部署一个总是需要运行的 Web 服务

docker run -d --name web-server --restart=always -p 80:80 nginx:alpine

容器意外退出或主机重启后,Docker 会自动拉起。

场景 2:部署一个可能因临时故障退出的任务型容器,且只允许重试 3 次

docker run --rm --name task-runner --restart=on-failure:3 alpine sh -c "exit 1"

容器运行后退出码为 1,Docker 会重启,重复直到达到 3 次上限,容器最终停止。

场景 3:使用 unless-stopped 避免手动停止后再次启动

docker run -d --name my-app --restart=unless-stopped my-app:latest
docker stop my-app
# 重启 Docker 守护进程(或重启主机)
sudo systemctl restart docker
# 检查容器状态,my-app 不会自动启动,因为是被手动停止的
docker ps -a

重启策略与宿主机重启

  • alwaysunless-stopped 策略的容器会在 Docker 守护进程启动时尝试启动。若依赖未就绪可能导致重启循环,可通过健康检查或编排工具控制。
  • 使用 --restart=always 时要小心容器因错误反复重启占用资源,建议配合日志监控。
  • on-failure 策略的容器在守护进程启动时不会被自动恢复,除非容器之前是异常退出且仍保留了重启次数。

日志与调试

重启次数和最后一刻的错误信息可帮助定位问题:

# 查看容器的重启次数
docker ps -a --format "table {{.Names}}\t{{.RestartCount}}"

# 查看容器退出信息
docker inspect <容器名> --format='{{json .State}}' | jq