Docker容器无法访问宿主机DNS服务器问题求助
Docker容器无法访问宿主机AdGuard DNS的解决方案
问题背景
宿主机IP为192.168.1.2,运行AdGuard DNS容器;路由器通过dnsmasq推送192.168.1.2和9.9.9.9作为DNS服务器,宿主机DNS功能正常,/etc/resolv.conf配置如下:
cat /etc/resolv.conf nameserver 192.168.1.2 nameserver 9.9.9.9
但Docker容器存在以下异常:
- 容器内执行
nslookup www.google.com 192.168.1.2提示;; connection timed out; no servers could be reached - 直接执行
nslookup www.google.com或nslookup www.google.com 127.0.0.11需等待4秒才生效,实际是fallback到9.9.9.9 - 容器可正常访问宿主机其他服务(如
wget 192.168.10.120:9000),通过容器名adguard执行nslookup www.google.com adguard解析正常,手动为容器添加192.168.1.2作为DNS也无法解决问题
解决方案
1. 检查AdGuard容器端口绑定
确保AdGuard的UDP/TCP 53端口绑定到宿主机的192.168.1.2网卡,而非仅127.0.0.1:
# 查看容器端口映射详情 docker inspect adguard | grep -A 10 "Ports"
正确的映射应为192.168.1.2:53->53/udp和192.168.1.2:53->53/tcp。若为127.0.0.1:53->53/udp,则容器无法通过LAN IP访问。
若使用docker-compose部署,修改docker-compose.yml的ports配置:
services: adguard: # 其他配置省略 ports: - "192.168.1.2:53:53/udp" - "192.168.1.2:53:53/tcp" # 其他端口配置
重启容器:
docker-compose restart adguard
2. 放行宿主机防火墙规则
允许Docker容器所在子网访问宿主机53端口:
- 若使用ufw:
ufw allow in from 172.17.0.0/16 to any port 53 proto udp ufw allow in from 172.17.0.0/16 to any port 53 proto tcp
- 若使用firewalld:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="172.17.0.0/16" port port="53" protocol="udp" accept' --permanent firewall-cmd --add-rich-rule='rule family="ipv4" source address="172.17.0.0/16" port port="53" protocol="tcp" accept' --permanent firewall-cmd --reload
3. 配置Docker全局DNS指向AdGuard容器
利用容器名解析的优势,配置Docker全局DNS优先使用AdGuard容器:
编辑/etc/docker/daemon.json(若不存在则新建):
{ "dns": ["adguard", "9.9.9.9"] }
重启Docker服务:
systemctl restart docker
新创建的容器会默认使用AdGuard作为首选DNS,规避LAN IP的路由问题。
4. 验证修复
在容器内执行以下命令验证:
nslookup www.google.com 192.168.1.2
若能正常解析则问题解决;直接执行nslookup www.google.com应秒出结果,无4秒等待。
内容的提问来源于stack exchange,提问作者JeanPaul
相关产品推荐
相关产品推荐

