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               = 不自动启动
相关推荐
Decay__13 小时前
17_MySQL 监控体系构建 —— mysqld_exporter + Prometheus + Grafana 全栈实战
运维·数据库·sql·mysql·架构
天远数科13 小时前
零信任架构实战:基于天远全能家政风险报告构建自动化即时到家保洁与短工抢单安全核验网关
运维·人工智能·架构·自动化
源图客13 小时前
解决CentOS操作系统网络异常问题
linux·运维·centos
分布式存储与RustFS13 小时前
K8s 集群备份落到自建对象存储:Velero 接 RustFS 配置指南
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
梅孔立15 小时前
Docker 容器网络不通:Tomcat 无法解析 MySQL、Nginx 无法反代 Tomcat 的生产级排查与治理
网络·docker·tomcat
镜子AI1 天前
镜子AI 技术复盘:三条自动化链路上的“停止条件“设计
运维·人工智能·自动化
tianyuanwo1 天前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
螺蛳粉 螺蛳粉1 天前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
知已难寻1 天前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
huainingning1 天前
Windows syslog日志服务器搭建与模拟器对接
运维·服务器·智能路由器