自定义桥接网络的Docker容器如何使用宿主机dnsmasq作为DNS服务
问题根因
Docker内置DNS服务(127.0.0.11)默认会过滤宿主机resolv.conf中的127.0.0.0/8段地址,替换为公共DNS服务器,导致容器的内部域名请求根本不会转发到宿主机本地运行的dnsmasq服务。同时dnsmasq默认仅监听127.0.0.1回环地址,即使Docker转发了请求,dnsmasq也无法接收来自Docker桥接网段的DNS查询。
修复方案
- 调整dnsmasq监听配置
首先查询自定义桥接网络的网关地址:
docker network inspect mycustomnet | grep Gateway
假设返回网关地址为172.18.0.1,修改dnsmasq.conf新增如下配置:
# 同时监听本地回环和Docker桥接网关地址 listen-address=127.0.0.1,172.18.0.1 bind-interfaces
重启dnsmasq服务生效:
systemctl restart dnsmasq
放开宿主机防火墙对Docker网段的53端口访问限制:
# 注意替换为你实际的自定义桥接网段 iptables -I INPUT -s 172.18.0.0/16 -p udp --dport 53 -j ACCEPT
- 修改Docker Compose配置指定DNS
两种配置方式二选一即可:
- 方式一:全局配置自定义网络的默认DNS
networks: mycustomnet: driver: bridge driver_opts: com.docker.network.dns: 172.18.0.1
- 方式二:单独为服务指定DNS
services: mycontainer: networks: - mycustomnet dns: - 172.18.0.1 - 8.8.8.8 # 可选备用公网DNS
- 重新部署服务生效
docker-compose up -d --force-recreate
DNS校验方法
- 进入容器执行
cat /etc/resolv.conf,确认nameserver配置符合预期 - 执行
dig test.example,返回结果的SERVER:字段即为实际响应请求的DNS服务器地址,同时可查看A记录是否返回正确结果 - 无dig命令时可使用
nslookup test.example,输出的Address:行即为当前使用的DNS服务器地址
内容的提问来源于stack exchange,提问作者bazzilic
相关产品推荐
相关产品推荐

