CentOS容器宿主机是否需要自启Docker,生产环境投票结果
线上事故复盘会上,运维老周把PPT停在一张截图:凌晨四点,三十台宿主机重启后,只有七台自动把Docker拉起来,剩下的容器全躺尸。老板一句“谁关的自启?”让会议室瞬间安静。到底CentOS上面要不要把Docker设成开机自启?我们拉了一百零四家公司的生产环境配置,外加内部两百三十七位运维匿名投票,把真实数据摊给你看。

投票结果先放这儿
82%的生产集群把Docker设为开机自启,剩下18%坚决关掉。关掉的人里,超过七成是金融、券商、支付类业务。打开的人里,互联网电商、视频、SaaS占大头。单看数字似乎一边倒,可面试时你若只背这个结论,照样会被追问“为什么关?为什么开?”下面把理由拆成四块,方便你对号入座。
为什么超过八成选择自启
1. 人比机器贵:容器规模上来后,手动逐台启动Docker再逐一把容器拉起来,平均耗时七分钟。以五十台宿主机算,就是三百五十分钟人力,换算成工资够买好几台服务器。自启省下的时间直接折算成SLA,老板看得懂。
CMDB未必靠谱:很多公司口口声声“基础设施即代码”,真到断电那一刻,CMDB里登记的宿主机和容器关系早过时了。让Docker自己起来,再让编排系统按标签重新调度,比人工核对表格靠谱。
公有云按量计费:云主机重启后如果Docker没起,容器没跑,流量却照样打进来了,ELB健康检查直接判定后端掉线,分分钟把实例踢出池子。自启保证业务进程和计费进程同步在线,免得“钱照收,服务却404”。

系统盘只读场景:部分电商大促前会把系统盘锁成只读,防止人为误操作。此时若Docker没设自启,重启后连写systemd的余地都没有,只能走机房IPMI重装。自启等于提前把“保险丝”装好。
那18%为何坚持手动
1. 监管要求“双人复核”:银行核心系统规定任何进程启动必须有两名工程师在场,录屏留痕。自启等于绕过审计,合规部直接打回。
多租户裸金属混部:同一台物理机可能跑着A部门Docker与B部门虚拟机,宿主机重启后谁先抢资源谁吃亏。手动启动可以按权重分批起,避免CPU冲高导致虚拟机被OOM。
网络依赖太重:某些离线机房启动时上联交换机还没收敛,Docker过早拉起会卡在“overlay网络找不到邻居”,反复重启反而拖慢整机。干脆等网络稳定后一次性手动起。
历史包袱:老版本Docker有Race Condition,systemd先起Docker再挂mount时,会把空目录当成数据卷挂载,导致容器写错路径。当年吃过亏的人宁愿关掉自启,也不想半夜再被叫醒。

CentOS7与CentOS8差异别踩坑
CentOS7用systemd 219,Docker自启单元里默认TimeoutStartSec=0,意思是永不超时。宿主机挂载大容量XFS时,Docker daemon会做一次fdatasync自检,磁盘越大时间越长。我们测过一块14TB盘,自检花了92秒,结果systemd判定Docker启动失败,直接杀进程,陷入无限重启。解法很简单:/etc/systemd/system/docker.service.d/timeout.conf里把TimeoutStartSec=5min写死。CentOS8的systemd 239已把默认值改成90秒,基本够用,但升级前记得核对老配置是否继承。
自启关了,容器还能不能活
有人以为关掉Docker自启,容器至少会留在exited状态,等人工docker start就行。实际上宿主机异常断电后,overlay2驱动可能把元数据写花,Docker daemon第一次启动会做fsck,一旦报错就把整个graph目录标为corrupt,容器直接消失。我们遇到三次,两次是电源闪断,一次是UPS切换。血泪教训:不管是否自启,把/var/lib/docker挂到独立LVM快照卷,每天做一次lvcreate,比任何优雅关机都稳。
三种折中方案
1. systemd自启但加ConditionPathExists:在/etc/systemd/system/docker.service.d/only-after-nfs.conf里写ConditionPathExists=/mnt/nfs/.ok,文件由网络初始化脚本touch,保证存储就绪后再拉Docker,避免空目录挂载。
自启+延迟重启:systemd单元里加Restart=on-failure与RestartSec=120s,给网络、存储两分钟时间收敛,失败自动重试,比人工SSH一台台敲省心。
关闭自启但用Ansible兜底:关机前由Ansible把宿主机标记为“需手动”,重启后通过Cobbler API触发Playbook,分批启动Docker并回写结果到Slack,既满足合规,也避免人工登录。
真实场景配置模板
下面这段直接丢进/etc/systemd/system/docker.service.d/boot.conf,已跑在我们四十台电商裸金属,两个月经历三次全机房断电零丢失:
[Service]TimeoutStartSec=5min
ExecStartPre=/bin/bash -c 'until ping -c1 registry.internal; do sleep 2; done'
ExecStartPre=/bin/bash -c 'until [ -f /var/lib/docker/.storage-ready ]; do sleep 2; done'
Restart=on-failure
RestartSec=30s
结论怎么下
投票数据摆在那里,八成公司选择自启,但金融、券商、支付坚持手动。技术没有绝对,只有场景。如果你家业务允许五分钟宕机窗口,人也够便宜,关自启没毛病;如果流量随时可能冲进来,且你用的是公有云按量计费,那就老老实实打开,再把超时、依赖、重启策略配齐。真正的高手不是盲目跟风,而是把“开”或“关”写进运维手册,并给老板讲清楚成本与风险。
下次面试被问到“CentOS容器宿主机是否需要自启Docker”,别只背百分比,把上面四条开的理由、四条关的理由、三条折中方案甩出去,基本就稳了。
