最直接有效的方式是启动容器时用--dns参数指定dns服务器ip,它会写入/etc/resolv.conf且优先级最高,可覆盖宿主机、daemon.json及自定义网络配置;支持ipv4/ipv6,不支持域名,多地址按序生效,推荐优先使用内网dns。
最直接有效的方式是启动容器时用 --dns 参数指定 dns 服务器 ip,它会写入容器的 /etc/resolv.conf,且优先级最高,能覆盖其他所有 dns 来源。
单次运行:用 --dns 指定解析服务器
适合调试、CI/CD 或临时需求。多个 --dns 按顺序写入,前面的优先使用:
docker run --dns 114.114.114.114 --dns 8.8.8.8 -it alpine nslookup baidu.com- DNS 地址必须是可达的 IPv4 或 IPv6(如
--dns 2001:4860:4860::8888),不支持域名 - 内网 DNS(如
192.168.1.100)通常更稳定,尤其涉及私有服务或镜像仓库时
全局生效:修改 daemon.json 配置
适用于所有新创建的容器统一走某套 DNS(比如公司内网 DNS):
- 编辑
/etc/docker/daemon.json,加入:{ "dns": ["192.168.1.1", "114.114.114.114"], "dns-search": ["corp.local"], "dns-opts": ["ndots:2"] } - 保存后执行
sudo systemctl restart docker - 该配置可被单个容器的
--dns覆盖,但对已有容器不生效
服务发现场景:用自定义网络 + 内嵌 DNS
当你需要容器之间通过服务名互相访问(如 web、db),推荐创建自定义网络:
-
docker network create mynet后,容器自动使用内嵌 DNS127.0.0.11 - 同网络下的容器名和
--network-alias可直接解析,无需额外配置 - 若还需解析公网域名,需配合
--dns或全局 daemon.json 设置,因为127.0.0.11默认不递归查询外部域名
Docker Compose 中声明 DNS
适合编排环境,配置方式与 docker run 一致,写在服务层级:
-
dns:列出 DNS 地址dns_search:设置搜索域(访问api时自动尝试api.internal.example.com)dns_opt:传入 DNS 客户端选项(如timeout:2) - 示例片段:
services:<br> app:<br> image: ubuntu<br> dns: ["192.168.10.50", "8.8.8.8"]<br> dns_search: ["internal.example.com"]











