Docker 容器自启动策略说明与常用命令

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               = 不自动启动
相关推荐
灯澜忆梦1 小时前
【docker】#3 | 数据卷挂载
运维·docker·容器
像风一样自由20209 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体
sxgzzn9 小时前
如何利用电缆故障定位在线监测系统提升供电安全?
运维·重构·无人机·开关柜局放在线监测·gis局放在线监测
mengchanmian10 小时前
VSFTP 服务器搭建(Centos)
运维·服务器·centos
别动我齐刘海12 小时前
Linux 系统调试学习1
linux·运维·服务器·c++·学习·机器学习·机器人
陈陈CHENCHEN13 小时前
【Kubernetes】纯 IPv6 K8s 用 socat 打通 IPv4 服务
云原生·容器·kubernetes
不像程序员的程序媛13 小时前
linux常见文本操作命令
linux·运维·服务器
wangbing112513 小时前
开发指南149-IotDB-常用命令
linux·运维·iotdb
Dovis(誓平步青云)13 小时前
常用命令藏得太深?怎么做一个快捷命令坞
运维·前端·自动化·音视频·prometheus