Docker Compose部署Pi-hole与Unbound后主机DNS解析失败求助
使用Docker Compose部署Pi-hole+Unbound后,主机无法正常解析域名,执行dig pi-hole.net返回SERVFAIL状态。Pi-hole日志显示查询已转发至Unbound,但最终解析失败。
主机执行dig的输出:
mlino@PIhole-2:/# dig pi-hole.net ; <<>> DiG 9.16.44-Debian <<>> pi-hole.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 58616 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;pi-hole.net. IN A ;; Query time: 3999 msec ;; SERVER: 127.0.0.11#53(127.0.0.11) ;; WHEN: Fri Feb 09 19:02:24 -03 2024 ;; MSG SIZE rcvd: 29
当前docker-compose.yaml配置:
pihole: container_name: pihole image: pihole/pihole:latest hostname: PIhole-2 depends_on: - unbound ports: - "53:53/tcp" - "53:53/udp" - "80:80/tcp" - "443:443/tcp" environment: TZ: 'America/Recife' WEBPASSWORD: 'XXXXXXXXXXX' FTLCONF_LOCAL_IPV4: 172.16.65.70 PIHOLE_DNS_: 172.21.200.3#5335 DNSSEC: true dns: 127.0.0.1 volumes: - './etc-pihole:/etc/pihole' - './etc-dnsmasq.d:/etc/dnsmasq.d' restart: unless-stopped unbound: container_name: unbound image: "mvance/unbound:latest" hostname: unbound restart: unless-stopped ports: - "5335:53/tcp" - "5335:53/udp" networks: pihole_dns_network: ipv4_address: 172.21.200.3 networks: pihole_dns_network: name: "pihole_dns_network" ipam: driver: default config: - subnet: 172.21.200.0/24 gateway: 172.21.200.1 ip_range: 172.21.200.1/24
环境:Ubuntu 23.04,已关闭系统DNS解析器,/etc/resolv.conf设置为:
nameserver 127.0.0.1
1. 修正Pi-hole容器的网络配置
当前Pi-hole未加入自定义的pihole_dns_network,导致无法直接访问Unbound的静态IP172.21.200.3。修改pihole服务配置,添加网络声明:
pihole: # 其他配置保持不变 networks: pihole_dns_network: ipv4_address: 172.21.200.2 # 分配同子网内的固定IP
2. 移除Pi-hole的dns: 127.0.0.1配置
该配置会强制Pi-hole容器使用自身DNS,可能引发循环解析问题,直接删除这一段配置。
3. 验证Unbound的可达性
进入Pi-hole容器,测试能否正常访问Unbound:
docker exec -it pihole dig @172.21.200.3 -p 5335 pi-hole.net
如果返回正常解析结果,说明Unbound工作正常;如果失败,检查Unbound容器日志排查问题:
docker logs unbound
常见问题为Unbound的DNSSEC配置或根区域文件未正确加载,可尝试重启Unbound容器:
docker restart unbound
4. 解决Docker内置DNS的干扰
从dig输出可见,查询请求被发送到了127.0.0.11(Docker内置DNS),而非127.0.0.1的Pi-hole。需要修改Docker配置避免抢占主机DNS端口:
编辑/etc/docker/daemon.json(不存在则创建):
{ "dns": ["127.0.0.1"], "dns-opts": ["edns0"], "dns-search": [] }
重启Docker服务:
sudo systemctl restart docker
同时确保/etc/resolv.conf为静态文件,防止被systemd-resolved覆盖:
sudo rm /etc/resolv.conf sudo echo "nameserver 127.0.0.1" > /etc/resolv.conf sudo chattr +i /etc/resolv.conf # 锁定文件防止被自动修改
5. 验证主机解析
重启所有容器后,在主机执行以下命令验证解析功能:
dig @127.0.0.1 pi-hole.net
若返回正常IP结果,说明问题已解决。
内容的提问来源于stack exchange,提问作者Marcio Lino

