核心是让容器运行环境与宿主机内核能力对齐,需确认内核模块(overlay2、br_netfilter等)是否存在并加载,验证/var/lib/docker所在文件系统是否支持d_type,手动配置daemon.json启用overlay2驱动,排除SELinux或Secure Boot拦截。

核心是让容器运行环境与宿主机内核能力对齐,不是“升级容器内核”——容器共享宿主机内核,所谓“不匹配”实际指宿主机内核缺失 Docker 所需模块或配置。
确认宿主机内核是否具备必要模块
Docker 依赖 overlay2、br_netfilter、nf_nat 等内核模块。升级内核后常因模块未随内核安装而缺失。
- 运行 ls /lib/modules/$(uname -r)/kernel/fs/overlayfs/,检查 overlay.ko* 是否存在;若无,说明模块未安装
- RHEL/CentOS:执行 yum install kernel-modules-extra-$(uname -r)
- Ubuntu/Debian:执行 apt install linux-modules-extra-$(uname -r)
- 加载测试:sudo modprobe overlay && sudo modprobe br_netfilter;失败时用 dmesg | tail -20 查具体原因(如 signature required、Invalid module format)
验证底层文件系统是否支持 d_type
overlay2 要求 /var/lib/docker 所在分区启用 d_type,否则启动容器会报 missing d_type support。
- 若为 XFS:运行 xfs_info /var/lib/docker | grep ftype,输出必须为 ftype=1;若为 0,需重新格式化并迁移数据
- 若为 ext4:默认支持,但建议运行 sudo fsck.ext4 -f /dev/xxx 排除元数据损坏
- 不建议使用已弃用的 overlay(非 overlay2)驱动
显式配置 Docker 存储驱动并验证初始化
Docker 不会自动降级或绕过内核限制,必须手动指定兼容驱动并确保其能完成初始化。
- 编辑 /etc/docker/daemon.json,写入:{"storage-driver": "overlay2"}
- 内核低于 3.10.0–514(如旧版 CentOS 7.2)时,overlay2 不可用,应升级内核或改用 fuse-overlayfs(需额外安装)
- 重启服务:sudo systemctl restart docker,再运行 docker info | grep "Storage Driver",确认输出为 overlay2 且无 warning
排除 SELinux、Secure Boot 等运行时拦截
某些发行版在内核升级后,SELinux 策略或 Secure Boot 设置可能阻止模块加载或挂载操作。
- 临时测试:sudo setenforce 0 关闭 SELinux,再运行 docker run hello-world;若成功,说明需更新策略
- 持久化修复示例:semanage fcontext -a -t container_file_t "/var/lib/docker(/.*)?",然后 restorecon -Rv /var/lib/docker
- Secure Boot 启用时,签名不合规的模块会被拒绝加载,可临时禁用以定位问题


















