Docker Overlay网络无法解析容器名称问题求助
排查Overlay网络DNS解析失败的实用思路
我之前碰到过几乎一模一样的Overlay网络DNS故障,结合你的场景(两台配置完全一致的主机,一台正常一台解析失败),问题肯定不是Docker核心配置的锅,大概率是Swarm集群状态、主机网络栈或者Overlay底层组件的异常,下面是一步步的排查方向:
一、先确认Swarm节点的健康状态
虽然你说配置一致,但先排除Swarm集群的状态异常:
- 执行
docker node ls,检查故障节点的状态是不是Ready,有没有Down或者Unreachable的标记 - 执行
docker swarm inspect,对比正常节点的输出,看故障节点的NodeStatus.Addr是不是正确的主机IP,集群的ClusterID是否和正常节点一致 - 如果故障节点是worker,重新获取join token:
docker swarm join-token worker,确认节点的join参数没有过期或错误
二、验证Overlay网络依赖的端口连通性
Overlay网络需要主机间三个端口完全互通,这是最常见的故障点:
- 先ping正常主机的Swarm节点IP,确认基础网络没问题
- 用
nc检查必备端口:# 检查Swarm管理端口(TCP) nc -zv 正常主机IP 2377 # 检查节点发现端口(TCP/UDP) nc -zv 正常主机IP 7946 nc -zv -u 正常主机IP 7946 # 检查VXLAN隧道端口(UDP) nc -zv -u 正常主机IP 4789 - 检查故障主机的防火墙(firewalld/iptables),确认这三个端口已经放行——毕竟问题是昨天才出现的,很可能是防火墙规则被更新了
- 对比正常主机,检查故障主机是否存在
docker_gwbridge和VXLAN虚拟网卡:ip link show | grep -E "(docker_gwbridge|vxlan)",如果缺失,说明Docker网络组件初始化失败
三、排查Docker内置DNS服务的状态
Overlay网络的DNS解析完全依赖Docker内置的DNS服务(127.0.0.11),重点检查这个服务:
- 在故障主机的测试容器里执行
cat /etc/resolv.conf,看nameserver是不是127.0.0.11,有没有被其他配置篡改 - 直接指定Docker DNS查询:
nslookup test.DNS.name 127.0.0.11,如果还是失败,说明内置DNS服务在故障主机上异常 - 尝试重启Docker服务:
systemctl restart docker,然后重新创建网络和测试容器——有时候Docker进程僵死会导致DNS服务失效 - 查看Docker日志找报错:
journalctl -u docker.service | grep -iE "dns|overlay|swarm",比如有没有“failed to initialize DNS server”或者“VXLAN tunnel setup failed”这类信息
四、检查Overlay网络的本地配置
虽然创建命令一致,但还是要确认故障主机的网络状态:
- 执行
docker network inspect test_network,对比正常主机的输出,看IPAM.Config子网是否一致,Containers里有没有测试容器的信息 - 清理残留的异常网络:
docker network prune,删除所有未使用的网络后重新创建test_network再测试 - 极端情况:Docker网络本地数据库损坏,备份
/var/lib/docker/network/files/local-kv.db后删除,然后重启Docker(注意:删除会丢失所有自定义网络,需要重新创建)
五、排查主机系统层面的异常
Docker严重依赖主机的网络栈,检查系统参数:
- 对比正常主机的
sysctl参数:# 必须开启IP转发 sysctl net.ipv4.ip_forward # 建议开启bridge的iptables调用 sysctl net.bridge.bridge-nf-call-iptables - 查看内核日志找硬件/驱动异常:
dmesg | grep -iE "vxlan|docker|iptables",比如VXLAN模块加载失败或者iptables规则冲突 - 检查时间同步:
timedatectl status,如果故障主机和正常主机时间偏差过大,Swarm的Raft协议会出现同步问题,导致网络状态异常
补充测试:缩小故障范围
你可以先在故障主机上创建一个bridge网络测试:
docker network create test_bridge docker run --rm -d --name test1 --network test_bridge nginx docker run --rm -it --network test_bridge busybox ping test1
如果bridge网络的DNS解析正常,说明问题只局限在Overlay网络的Swarm相关组件上,能大幅缩小排查范围。
内容的提问来源于stack exchange,提问作者Johannes Gesenhues
相关产品推荐
相关产品推荐

