Docker Bridge网络排错需分层定位:先确认容器是否同属一网络(默认bridge不支持容器名解析,须用自定义bridge),再验证DNS解析、iptables规则、内核模块(如br_netfilter)及底层连通性(ping IP、telnet端口)。

Docker Bridge 网络排错,关键不是试来试去,而是按逻辑分层定位:先确认容器是否在同一个网络里,再看通信路径上哪一环断了。
确认容器是否接入同一 bridge 网络
容器间通信失效,80% 是因为没连到同一个网络。默认的 `bridge` 网络不支持容器名解析,必须用自定义 bridge 才能通过服务名访问。- 运行
docker network ls查看当前网络列表,确认目标容器所属网络名称 - 用
docker inspect <容器名> | grep NetworkMode检查网络模式是否为bridge - 执行
docker network inspect <网络名>,核对Containers字段是否包含所有待互通的容器
如果某个容器不在目标网络中,用这条命令补上:docker network connect <网络名> <容器名>
验证 DNS 解析是否生效
自定义 bridge 网络才启用内置 DNS,容器才能用服务名(如 `redis`、`db`)互相访问。- 进入容器执行
nslookup redis或ping redis,看能否解析出 IP - 若解析失败,检查
/etc/resolv.conf中 nameserver 是否为127.0.0.11(Docker 内置 DNS 地址) - 不要手动修改容器内 resolv.conf,Docker 会自动注入;若被覆盖,说明启动时加了
--dns参数或 daemon.json 配置异常
常见误区:在默认 bridge 网络里硬写 --link,已过时且功能受限,应直接换用自定义网络。
检查 iptables 和内核模块是否就绪
Bridge 网络依赖内核模块和 iptables 规则转发流量。ARM64 或旧版 Ubuntu 上容易缺失关键模块。- 运行
lsmod | grep br_netfilter,确保br_netfilter已加载(否则桥接流量被内核丢弃) - 若无输出,执行
sudo modprobe br_netfilter并写入/etc/modules持久化 - 检查
iptables -t nat -L DOCKER是否存在规则;若为空,重启 Docker 服务常可自动重建 - 在 Ubuntu 上,确认
ufw已禁用或已放行容器子网(如sudo ufw allow from 172.18.0.0/16)
测试底层连通性是否正常
绕过 DNS 和应用层,直击网络栈是否通畅。- 容器内
ping <另一容器IP>—— 若不通,说明二层转发失败(网桥或 veth 异常) - 宿主机上
ping <容器IP>—— 若不通,可能是 docker0 网桥未启用或 IP 冲突 - 容器内
telnet <容器IP> <端口>或nc -zv <IP> <端口>—— 确认服务真正在监听且未绑定127.0.0.1
注意:很多服务默认只监听 localhost,需改配置为 0.0.0.0,否则即使网络通也无法连接。
不复杂但容易忽略


















