先检查内核模块是否加载:overlay(overlay2驱动前提)、br_netfilter(桥接网络必需)、nf_nat(端口映射依赖);缺失任一模块会导致Docker静默失败,可用lsmod | grep 模块名验证,未加载则用modprobe临时启用并写入/etc/modules-load.d/docker.conf持久化。

docker启动报Failed to connect to bus或Cannot connect to the Docker daemon,先查内核模块
这类错误往往不是Docker服务本身坏了,而是底层支撑没起来。overlay、br_netfilter、nf_nat 这几个模块缺一不可,尤其 overlay 是 overlay2 存储驱动的运行前提。没加载就启动Docker,服务会静默失败或卡在初始化阶段。
检查哪些模块是否已加载
直接用 lsmod 看输出有没有关键模块:
-
lsmod | grep overlay—— 必须有输出,否则overlay2驱动无法工作 -
lsmod | grep br_netfilter—— 影响桥接网络和 iptables 规则生效 -
lsmod | grep nf_nat—— 容器端口映射(-p)依赖它
如果某项无输出,说明模块未加载。注意:有些发行版(如 CentOS 7)默认不自动加载 br_netfilter,即使内核支持也得手动触发。
手动加载并设为开机自启
临时加载用 modprobe,但重启后失效。要持久化,得写进模块加载配置:
- 执行
sudo modprobe overlay br_netfilter nf_nat先让当前会话跑起来 - 创建配置文件:
echo -e "overlay\nbr_netfilter\nnf_nat" | sudo tee /etc/modules-load.d/docker.conf - 验证是否写入成功:
cat /etc/modules-load.d/docker.conf - 无需重启系统,但需确保下次启动时自动加载 —— 这步比改
/etc/default/grub更轻量且通用
特别注意:旧内核(overlay 模块,此时不能硬加,得升级内核或降级改用 aufs(已废弃,不推荐)。
加载后仍不生效?检查内核配置是否编译进内核
模块能 modprobe 成功,不代表内核真的支持。有些定制内核把 CONFIG_OVERLAY_FS=m 编译成模块但没打包进 initramfs,或者干脆设为 n(禁用)。这时 lsmod 查不到,modprobe 也会报 Module not found。
- 查编译选项:
zcat /proc/config.gz | grep CONFIG_OVERLAY_FS(若存在) - 或看
/boot/config-$(uname -r)文件:grep CONFIG_OVERLAY_FS /boot/config-$(uname -r) - 期望输出是
CONFIG_OVERLAY_FS=m或=y;如果是=n,说明内核不支持,换内核是唯一解
这个点最容易被跳过 —— 你反复 modprobe 失败,其实不是命令不对,而是内核根本没留这个门。


















