容器使用外部自定义DNS服务器的关键是绕过Docker默认DNS机制,显式指定可信DNS地址;方式包括:1.--dns参数(优先级最高);2.自定义bridge网络中统一配置--dns;3.daemon.json全局配置(慎用)。
容器使用外部自定义 DNS 服务器,关键在于绕过 Docker 默认的 DNS 机制(如内置 DNS 或宿主机 /etc/resolv.conf 的继承),显式指定可信、可控的 DNS 地址。Bridge 网络下,无论是默认 bridge 还是自定义 bridge,都支持该配置,但方式略有差异。
这是最直接、最常用的方式,适用于单次运行或脚本化部署场景。Docker 会将指定 DNS 写入容器内 /etc/resolv.conf,覆盖默认值。
docker run -d --dns 8.8.8.8 --dns 114.114.114.114 --name myapp nginx
--dns,按顺序尝试解析;优先级高于容器镜像内置或宿主机继承的 DNS--network host,--dns 会被忽略(因共享宿主机网络栈)当多个服务需共用同一套 DNS 策略(如内网 DNS、企业 AD 域控、或私有 CoreDNS),推荐在网络层级统一配置,避免每个容器重复指定。
--dns 和 --dns-search:docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 --dns 10.1.1.10 --dns-search example.local mynet
--dns)都会自动获得这些 DNS 设置docker-compose.yml 的 networks 定义中添加 driver_opts 或通过 dns 字段(需配合 network_mode: bridge 或自定义网络)适用于整个 Docker 引擎下所有容器的统一策略,比如强制走公司内部 DNS。但会影响所有容器,灵活性低,生产环境建议仅用于标准化基线。
/etc/docker/daemon.json:{"dns": ["10.20.30.40", "10.20.30.41"], "dns-search": ["corp.example.com"]}
sudo systemctl restart docker
--dns 覆盖,优先级最低配置后务必验证是否真正生效,尤其在 Java、Node.js 等对 DNS 缓存敏感的运行时中。
docker exec -it myapp cat /etc/resolv.conf —— 确认内容为你设定的 DNS 地址
docker exec myapp nslookup google.com 或 dig google.com +short
-Dnetworkaddress.cache.ttl=0 -Dnetworkaddress.cache.negative.ttl=0