Docker容器无法解析内网域名,因默认不继承宿主机DNS且127.0.0.11转发器可能屏蔽私有DNS;需显式配置:①运行时用--dns指定(最高优先级);②daemon.json设全局DNS;③自定义网络预设DNS并复用。

当你在内网环境中运行Docker容器,却无法解析公司内部域名(如 gitlab.intra、registry.internal)时,宿主机的DNS配置往往不被容器继承,或被Docker内置的127.0.0.11转发器屏蔽——这时必须显式为容器指定一个可达的、支持私有域名的DNS服务器地址。
启动容器时用 --dns 参数直接指定
这是最常用、优先级最高的方式,适用于单次调试、CI/CD流水线或临时部署场景。Docker会将你指定的IP写入容器的 /etc/resolv.conf,完全覆盖其他来源配置。
执行命令:docker run --dns 192.168.5.10 --dns 114.114.114.114 -it alpine nslookup gitlab.intra
多个 --dns 参数按从左到右顺序写入 resolv.conf,系统优先使用第一个;【DNS地址必须是IPv4或IPv6地址,不支持域名】
若同时使用 -p、-v 等参数,--dns 必须放在镜像名之前,否则会被忽略。
通过 daemon.json 设置全局默认DNS
适合所有容器统一使用某套DNS策略的生产环境,比如全部走内网CoreDNS或强制绕过公网DNS污染。
第一步:编辑 /etc/docker/daemon.json 文件,添加 dns 字段:
{ "dns": ["192.168.5.10", "8.8.8.8"] }
第二步:保存后执行 sudo systemctl restart docker,使配置生效
第三步:验证是否加载成功:sudo cat /var/run/docker/netns/default | grep -i dns(该命令不可靠)→ 更稳妥的方式是启动一个新容器并检查其 /etc/resolv.conf
注意:该配置对已运行的容器无效,只影响后续新创建的容器;如果某次 docker run 显式用了 --dns,则会覆盖 daemon.json 中的设置。
在自定义网络中预设DNS并复用
当你需要一组容器(如 web + api + db)共享同一套DNS解析策略,并启用服务发现时,推荐先创建带DNS配置的自定义桥接网络。
方法一:使用 docker network create 命令
docker network create --driver bridge --subnet 172.20.0.0/16 --dns 192.168.5.10 my-internal-net
方法二:启动容器时绑定该网络
docker run -d --name web --network my-internal-net nginx
进入容器验证:docker exec web cat /etc/resolv.conf → 应看到 nameserver 192.168.5.10
【自定义网络中的 --dns 设置无法被容器内手动修改 /etc/resolv.conf 覆盖,除非用 --privileged 启动】


















