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

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配置

  1. 简化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
  1. 完善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:

  1. 查看当前resolv.conf:
cat /etc/resolv.conf
  1. 编辑/etc/systemd/resolved.conf:
[Resolve]
DNS=127.0.0.1
DNSStubListener=no  # 关闭DNSStubListener,避免占用127.0.0.53
  1. 重启systemd-resolved服务:
sudo systemctl restart systemd-resolved
  1. 验证resolv.conf是否已更新为nameserver 127.0.0.1

六、重启容器验证

修改完所有配置后,重启容器:

docker-compose down && docker-compose up --build -d

然后再次测试解析:

nslookup ns.main.com

内容的提问来源于stack exchange,提问作者juanl4zy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:40:28