核心是补全模块、启用参数、排除拦截:安装kernel-modules-extra或linux-modules-extra包,modprobe overlay和br_netfilter,配置99-docker.conf启用bridge-nf-call-iptables等参数,禁用secure boot或调整selinux策略后重启docker。

宿主机升级内核后,Docker容器失效往往不是因为“内核版本太高”,而是关键安全与网络模块(如 br_netfilter、overlay、nf_nat)未随新内核自动安装或加载,导致容器启动失败、网络不通、存储驱动初始化异常。解决核心是补全模块 + 启用依赖参数 + 排除拦截机制。
确认缺失模块并安装对应内核扩展包
内核升级后,模块文件通常不会自动复制到 /lib/modules/$(uname -r)/ 目录下。需手动补装:
- RHEL/CentOS/Fedora:
sudo yum install kernel-modules-extra-$(uname -r)或dnf install kernel-modules-extra-$(uname -r) - Ubuntu/Debian:
sudo apt install linux-modules-extra-$(uname -r) - openEuler/麒麟V10:
sudo dnf install kernel-modules-extra-$(uname -r)(注意检查仓库是否启用)
安装后运行 ls /lib/modules/$(uname -r)/kernel/net/bridge/br_netfilter.ko* 和 ls /lib/modules/$(uname -r)/kernel/fs/overlayfs/overlay.ko* 验证文件存在。
手动加载模块并设置开机自启
即使模块已安装,也可能未自动加载。先测试加载:
sudo modprobe overlay && sudo modprobe br_netfilter- 若报
Module not found,说明路径或包未装对;若报Required key not available,大概率是 Secure Boot 拦截(见下文)
成功后写入开机加载配置:
echo 'overlay' | sudo tee -a /etc/modules-load.d/docker.confecho 'br_netfilter' | sudo tee -a /etc/modules-load.d/docker.conf- 重启生效,或直接
sudo systemctl restart systemd-modules-load
启用必需的内核参数并持久化
仅加载模块还不够,还需开启桥接流量转发等功能:
- 临时启用:
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1,同理设置bridge-nf-call-ip6tables和ip_forward - 永久生效:在
/etc/sysctl.d/99-docker.conf中写入三行:
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
然后执行 sudo sysctl --system 加载。
排查 Secure Boot 和 SELinux 干扰
这两类安全机制在内核升级后常成为“静默杀手”:
-
Secure Boot:会拒绝加载未签名或签名不合规的内核模块。可临时禁用测试:
sudo mokutil --disable-validation(需重启进入 MOK 管理界面确认),若 Docker 恢复正常,说明问题在此 -
SELinux:尤其在麒麟、UOS、RHEL 上,默认策略可能阻止容器挂载 overlay2 或访问
/var/lib/docker。临时关闭测试:sudo setenforce 0;若有效,需修复策略而非长期禁用,例如:sudo semanage fcontext -a -t container_file_t "/var/lib/docker(/.*)?",再sudo restorecon -Rv /var/lib/docker
完成以上步骤后,重启 Docker:sudo systemctl restart docker,再运行 docker info | grep "Storage Driver\|Cgroup" 和 docker run hello-world 验证。模块加载失败不是疑难杂症,而是典型配置断点,逐项验证即可定位根因。











