1. restart policy 是什么
Docker 的 --restart 参数用于控制容器的自动重启行为。
它主要影响以下几种情况:
- 容器异常退出后,是否自动重启
- Docker 服务重启后,容器是否自动启动
- 服务器开机后,容器是否自动启动
- 手动
docker stop后,是否还会被 Docker 自动拉起
2. 常用自启动策略说明
| 策略 | 含义 | 是否推荐 | 适合场景 |
|---|---|---|---|
no |
不自动重启 | 测试容器可用 | 临时容器、测试任务 |
always |
总是自动重启 | 谨慎使用 | 必须长期运行,且不希望停掉的服务 |
unless-stopped |
除非手动停止,否则自动重启 | 推荐 | 大多数服务器后台服务 |
on-failure |
只有异常退出时才重启 | 按需使用 | 脚本任务、批处理任务 |
on-failure:N |
异常退出最多重启 N 次 | 按需使用 | 防止容器无限重启 |
3. 各策略详细说明
3.1 no
bash
docker update --restart no 容器名或ID
含义:
- 不自动重启
- Docker 服务重启后不会自动启动
- 系统开机后不会自动启动
适合:
- 临时测试容器
- 手动启动的工具容器
- 不希望开机自动运行的容器
3.2 always
bash
docker update --restart always 容器名或ID
含义:
- 容器异常退出后会自动重启
- Docker 服务重启后会自动启动
- 系统开机后会自动启动
- 即使你曾经手动
docker stop停止过它,Docker 服务重启后也可能再次拉起它
适合:
- 必须长期运行的基础服务
- 不希望被意外停掉的服务
例如:
- nginx
- mysql
- redis
- gitlab
- zentao
- minio
注意:
always 的行为比较强硬。你手动停掉容器后,如果 Docker 服务或服务器重启,它仍可能再次启动。
3.3 unless-stopped
bash
docker update --restart unless-stopped 容器名或ID
含义:
- 容器异常退出后会自动重启
- Docker 服务重启后会自动启动
- 系统开机后会自动启动
- 如果你手动执行过
docker stop,Docker 会记住这个状态,不会再自动拉起它
适合:
- 公司内部长期运行服务
- 希望开机自动启动,但又尊重手动停止操作的容器
例如:
- 禅道 zentao
- GitLab
- Wiki
- MinIO
- MySQL
- PostgreSQL
- Redis
- Nginx
推荐:
bash
docker update --restart unless-stopped zentao
这是服务器环境中最常用、也最符合直觉的策略。
3.4 on-failure
bash
docker update --restart on-failure 容器名或ID
含义:
- 只有容器异常退出时才自动重启
- 正常退出不会自动重启
- 异常退出一般指进程返回码不是
0
适合:
- 任务型容器
- 批处理脚本
- 只希望崩溃后自动恢复的程序
3.5 on-failure:N
bash
docker update --restart on-failure:3 容器名或ID
含义:
- 容器异常退出后自动重启
- 最多重启 3 次
- 超过次数后不再重启
适合:
- 防止程序错误导致容器无限重启
- 批处理任务
- 不稳定服务的排查阶段
4. 查看单个容器的自启动策略
bash
docker inspect -f '{{.Name}} {{.HostConfig.RestartPolicy.Name}}' 容器名或ID
示例:
bash
docker inspect -f '{{.Name}} {{.HostConfig.RestartPolicy.Name}}' zentao
可能输出:
text
/zentao unless-stopped
说明 zentao 容器当前使用的是 unless-stopped 策略。
5. 查看所有容器的自启动策略
bash
docker inspect -f '{{.Name}} {{.HostConfig.RestartPolicy.Name}}' $(docker ps -aq)
示例输出:
text
/nginx unless-stopped
/mysql unless-stopped
/zentao no
/minio always
6. 同时查看容器状态
Docker 默认的 docker ps -a 看不到 restart policy,但可以先查看容器运行状态:
bash
docker ps -a
也可以用简洁格式:
bash
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
如果要同时看自启动策略,使用:
bash
docker inspect -f '{{.Name}} {{.State.Status}} {{.HostConfig.RestartPolicy.Name}}' $(docker ps -aq)
示例输出:
text
/nginx running unless-stopped
/mysql running unless-stopped
/zentao exited no
/minio running always
7. 设置容器开机自动启动
推荐使用:
bash
docker update --restart unless-stopped 容器名或ID
示例:
bash
docker update --restart unless-stopped zentao
8. 关闭容器开机自动启动
bash
docker update --restart no 容器名或ID
示例:
bash
docker update --restart no zentao
9. 设置为 always
bash
docker update --restart always 容器名或ID
示例:
bash
docker update --restart always zentao
10. 设置为 on-failure
bash
docker update --restart on-failure 容器名或ID
示例:
bash
docker update --restart on-failure zentao
限制最多重启 3 次:
bash
docker update --restart on-failure:3 zentao
11. 批量设置所有容器为 unless-stopped
谨慎执行,确认所有容器都需要开机自启动后再使用。
bash
docker update --restart unless-stopped $(docker ps -aq)
12. 批量关闭所有容器自启动
谨慎执行。
bash
docker update --restart no $(docker ps -aq)
13. 推荐使用原则
服务器长期服务
推荐:
bash
--restart unless-stopped
适合:
- 禅道
- Wiki
- GitLab
- MinIO
- MySQL
- PostgreSQL
- Redis
- Nginx
原因:
- 服务器重启后会自动恢复服务
- Docker 服务重启后会自动恢复服务
- 手动停掉后不会被强行拉起
特别关键的服务
可以考虑:
bash
--restart always
但要注意:
- 即使手动停止过,Docker 重启后也可能再次启动
- 不如
unless-stopped符合日常运维习惯
任务型容器
推荐:
bash
--restart on-failure
或:
bash
--restart on-failure:3
适合:
- 一次性任务
- 定时任务
- 批处理脚本
- 数据同步任务
临时测试容器
推荐:
bash
--restart no
14. 常用命令速查
查看单个容器 restart policy
bash
docker inspect -f '{{.Name}} {{.HostConfig.RestartPolicy.Name}}' zentao
查看所有容器 restart policy
bash
docker inspect -f '{{.Name}} {{.HostConfig.RestartPolicy.Name}}' $(docker ps -aq)
查看所有容器状态和 restart policy
bash
docker inspect -f '{{.Name}} {{.State.Status}} {{.HostConfig.RestartPolicy.Name}}' $(docker ps -aq)
设置容器为推荐自启动策略
bash
docker update --restart unless-stopped zentao
设置容器为 always
bash
docker update --restart always zentao
设置容器为异常退出自动重启
bash
docker update --restart on-failure zentao
设置异常退出最多重启 3 次
bash
docker update --restart on-failure:3 zentao
关闭容器自启动
bash
docker update --restart no zentao
15. 建议结论
一般公司内部服务器服务,建议统一使用:
bash
docker update --restart unless-stopped 容器名
例如:
bash
docker update --restart unless-stopped zentao
记忆方式:
text
always = 永远自动启动,哪怕你之前手动停过
unless-stopped = 除非你手动停过,否则自动启动
on-failure = 只有异常退出才自动启动
no = 不自动启动