Ubuntu22.04下Docker DNS容器nslookup超时无法访问问题求助
解决Docker Compose中BIND DNS容器的nslookup超时问题
一、先验证DNS容器是否正常提供服务
当前nslookup默认指向127.0.0.53(systemd-resolved的默认地址),先跳过默认配置,直接指定DNS服务器为本地映射的53端口,测试容器是否工作:
nslookup ns.main.com 127.0.0.1
- 若该命令超时:说明DNS容器本身配置存在问题,继续看后续步骤
- 若能正常返回
127.0.0.1:说明问题出在系统默认DNS配置,直接看第五点
二、修复BIND Zone文件格式错误
你的dns/zone/main.com中SOA记录格式不符合规范,会导致BIND无法正确加载域名解析规则:
- SOA行的括号需单独换行,且缺少最小TTL字段
- Expire字段后遗漏分号
修正后的zone文件:
$ttl 86400 @ IN SOA ns.main.com. hostmaster.main.com. ( 202 ; Serial 600 ; Refresh 3600 ; Retry 12378237 ; Expire 86400 ) ; Minimum TTL @ IN NS ns.main.com. ns IN A 127.0.0.1
三、修正named.conf的路径配置
dns/named.conf中的directory配置缺少根路径,BIND会无法定位工作目录:
options { directory "/var/bind"; # 改为绝对路径 allow-transfer { "none"; }; allow-query { any; }; listen-on { any; }; listen-on-v6 { none; }; # 可选:关闭IPv6监听避免额外问题 }; zone "main.com" IN { type master; file "/etc/bind/zone/main.com"; };
四、优化DNS容器的Docker配置
- 简化Dockerfile,移除无用的openrc相关操作(容器直接启动named,无需init系统):
FROM alpine:latest RUN apk add --no-cache bind # 确保named用户有权限读取挂载的配置文件 RUN mkdir -p /etc/bind/zone && chown -R named:named /etc/bind/zone /var/bind
- 完善docker-compose配置,添加权限控制与健康检查:
services: nginx: build: context: ./nginx/ ports: - 80:80 volumes: - ./nginx/html/:/usr/share/nginx/html/ - ./nginx/conf.d/:/etc/nginx/conf.d/ dns: build: context: ./dns/ restart: always ports: - "53:53/tcp" - "53:53/udp" volumes: - ./dns/named.conf:/etc/bind/named.conf - ./dns/zone/:/etc/bind/zone/ user: named # 直接用named用户运行,避免权限冲突 command: named -c /etc/bind/named.conf -g -u named healthcheck: test: ["CMD", "dig", "@127.0.0.1", "ns.main.com"] interval: 10s timeout: 5s retries: 3
五、调整系统默认DNS配置(可选)
若验证DNS容器正常,但默认nslookup仍超时,说明Ubuntu的systemd-resolved仍在接管默认DNS:
- 查看当前resolv.conf:
cat /etc/resolv.conf
- 编辑
/etc/systemd/resolved.conf:
[Resolve] DNS=127.0.0.1 DNSStubListener=no # 关闭DNSStubListener,避免占用127.0.0.53
- 重启systemd-resolved服务:
sudo systemctl restart systemd-resolved
- 验证resolv.conf是否已更新为
nameserver 127.0.0.1
六、重启容器验证
修改完所有配置后,重启容器:
docker-compose down && docker-compose up --build -d
然后再次测试解析:
nslookup ns.main.com
内容的提问来源于stack exchange,提问作者juanl4zy
相关产品推荐
相关产品推荐

