You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:47:34