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
重启策略与宿主机重启
- always 和 unless-stopped 策略的容器会在 Docker 守护进程启动时尝试启动。若依赖未就绪可能导致重启循环,可通过健康检查或编排工具控制。
- 使用
--restart=always时要小心容器因错误反复重启占用资源,建议配合日志监控。 - on-failure 策略的容器在守护进程启动时不会被自动恢复,除非容器之前是异常退出且仍保留了重启次数。
日志与调试
重启次数和最后一刻的错误信息可帮助定位问题:
# 查看容器的重启次数
docker ps -a --format "table {{.Names}}\t{{.RestartCount}}"
# 查看容器退出信息
docker inspect <容器名> --format='{{json .State}}' | jq