升级docker后启动失败主因是新版本对内核模块(overlay、br_netfilter)、cgroup版本及sysctl参数要求更严,需依次补全模块、启用bridge-nf参数、回退cgroup v1、绕过secure boot/selinux拦截。

升级 Docker 后启动失败,常不是 Docker 本身出错,而是新版本对内核模块和参数更严格——尤其依赖 overlay、br_netfilter 和 cgroup 控制能力。修复重点是补模块、调参数、绕拦截。
检查并加载必需的内核模块
新 Docker(尤其是 20.10+)默认要求 overlay 和 br_netfilter 模块已加载。若缺失,容器无法创建或网络不通:
- 运行
lsmod | grep -E 'overlay|br_netfilter'查看是否已加载 - 若无输出,手动加载:
sudo modprobe overlay && sudo modprobe br_netfilter - 加载失败且提示
Required key not available,大概率是 Secure Boot 阻止签名模块加载,需临时禁用:sudo mokutil --disable-validation(重启后按提示操作) - 确保开机自动加载:向
/etc/modules-load.d/docker.conf写入两行:overlaybr_netfilter
配置 bridge-nf 参数启用网络转发
Docker 容器间及与宿主机通信依赖 netfilter 对桥接流量的处理。内核升级后这些参数常被重置为 0:
- 检查当前值:
sysctl net.bridge.bridge-nf-call-iptables和net.bridge.bridge-nf-call-ip6tables,应为1 - 临时启用:
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1等同理设其他项 - 永久生效:在
/etc/sysctl.d/99-docker.conf中添加:net.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1
然后执行sudo sysctl --system
适配 cgroup 版本差异(尤其 Ubuntu 22.04+)
Ubuntu 22.04 及更新系统默认启用 cgroup v2,但旧版 Docker(如 docker.io 包)仅支持 v1,会导致 cgroups not available 错误:
- 确认当前模式:
cat /proc/1/cgroup | head -n1—— 若含unified即 v2 - 强制回退到 cgroup v1:编辑
/etc/default/grub,修改GRUB_CMDLINE_LINUX行,追加:cgroup_enable=memory swapaccount=1 systemd.unified_cgroup_hierarchy=0 - 更新 GRUB 并重启:
sudo update-grub && sudo reboot - 验证:重启后再次检查
/proc/1/cgroup,应显示name=systemd或name=开头的多行(v1 格式)
验证存储驱动与 SELinux/Secure Boot 干扰
即使模块和参数就位,仍可能因底层不兼容失败:
- 运行
docker info | grep "Storage Driver",确认显示overlay2;若报错或显示aufs,检查/etc/docker/daemon.json是否明确指定:{"storage-driver": "overlay2"} - CentOS/RHEL 用户需注意 SELinux:若
setenforce 0后 Docker 可启动,说明策略拦截,可改为宽松模式:sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config - Secure Boot 未关闭时,
modprobe可能静默失败,务必结合dmesg | grep -i "secure\|modprobe"查日志确认











