自定义Docker网络故障求助:容器连通性与解析异常
Docker桥接网络故障排查与修复方案
听起来你碰到了Docker桥接网络的典型间歇性故障,这种问题通常和内核网络参数、Docker的iptables规则管理或者系统防火墙冲突有关,我结合处理过的类似案例,给你一步步的排查和修复思路:
问题复盘
先确认下你的核心问题:
- 容器无法ping通外部公网(如
8.8.8.8) - 同网络容器能解析IP但无法ping通
- 容器内DNS解析超时
- 重启Docker/服务器偶尔能解决,但无规律
- 已尝试重装Docker、清空iptables、重启网络等操作,但未彻底解决
排查与修复步骤
1. 验证内核IP转发是否开启
Docker桥接网络依赖内核的IP转发功能,这是最常见的故障点之一:
- 临时检查:
sysctl net.ipv4.ip_forward,输出应为net.ipv4.ip_forward = 1 - 如果是0,临时开启:
sysctl -w net.ipv4.ip_forward=1 - 永久生效:编辑
/etc/sysctl.conf,添加或修改为net.ipv4.ip_forward=1,然后执行sysctl -p加载配置
2. 确保Docker自动管理iptables规则
手动清空iptables后,Docker可能未重新生成必要的规则,导致网络不通:
- 检查Docker配置文件
/etc/docker/daemon.json,确保包含以下内容:{ "iptables": true, "ip-masq": true } - 如果文件不存在,直接创建;如果已有内容,添加上述键值对
- 重启Docker服务:
systemctl restart docker - 验证规则是否生成:
iptables-save | grep DOCKER,应该能看到大量DOCKER-*开头的规则
3. 检查容器路由与网关连通性
容器的网络必须指向正确的网关才能对外通信:
- 先找到你的自定义网桥名称:
docker network inspect docker_network | jq .[].Options."com.docker.network.bridge.name",输出类似docker0或者br-xxxxxx - 检查网桥的IP地址:
ip addr show <网桥名称>,确认网关IP(通常是子网的第一个IP,比如172.200.0.1) - 进入容器检查路由:
docker exec container_a ip route,应该能看到类似default via 172.200.0.1 dev eth0的默认路由 - 在容器内ping网关:
docker exec container_a ping 172.200.0.1,如果ping不通,说明网桥与容器的链路有问题,尝试删除并重建网络:docker network rm docker_network docker-compose up -d # 重新创建网络和容器
4. 修复容器DNS解析问题
DNS超时通常是因为容器没有配置正确的DNS服务器:
- 检查容器内的DNS配置:
docker exec container_a cat /etc/resolv.conf,如果是空的或者指向无效的服务器,需要手动指定 - 在
docker-compose.yml中为网络添加DNS配置:networks: default: driver: bridge ipam: driver: default config: - subnet: 172.200.0.0/16 dns: - 8.8.8.8 - 1.1.1.1 - 或者在Docker daemon全局配置
/etc/docker/daemon.json中添加默认DNS:{ "dns": ["8.8.8.8", "1.1.1.1"] } - 重启Docker和容器后,验证DNS:
docker exec container_a nslookup google.com
5. 调整系统防火墙规则(Ubuntu ufw)
Ubuntu默认的ufw防火墙可能会阻止Docker容器的网络流量:
- 检查ufw状态:
ufw status,如果是开启状态,需要添加规则允许Docker网络:ufw allow in on <网桥名称> ufw allow out on <网桥名称> ufw reload - 另外,确保ufw允许IP转发:编辑
/etc/default/ufw,设置DEFAULT_FORWARD_POLICY="ACCEPT",然后重启ufw:systemctl restart ufw
6. 确保必要的内核模块加载
Docker桥接需要br_netfilter模块支持,若未加载会导致网络异常:
- 检查模块是否加载:
lsmod | grep br_netfilter - 如果未加载,临时加载:
modprobe br_netfilter - 永久加载:编辑
/etc/modules-load.d/br_netfilter.conf,添加br_netfilter,重启系统后生效
7. 升级Docker版本(推荐)
你使用的Docker 19.03.11是比较老的版本,存在不少已知的网络bug,升级到稳定版能解决很多间歇性问题:
- 卸载旧版本(你已经试过这一步,可跳过)
- 安装最新稳定版:
curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh - 升级后重启Docker和容器,观察问题是否消失
最后排查:查看日志定位深层问题
如果上述步骤都无法解决,查看日志找线索:
- Docker服务日志:
journalctl -u docker.service -f,看启动或运行时的报错 - 内核网络日志:
dmesg | grep -i network,查找内核层面的网络异常
内容的提问来源于stack exchange,提问作者Bajzáth Dávid




