You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Docker自定义网络下容器DNS配置失效问题咨询

这是个很常见的Docker网络配置问题,我来一步步帮你理清:

这种情况是否正常?

首先可以明确:这是完全正常的Docker行为,默认网络和自定义网络的DNS配置逻辑本来就不一样,不是bug哦。

为什么自定义网络下主机的resolv.conf不生效?

这里得先搞清楚Docker两种网络的设计差异:

  • 默认的bridge网络是Docker初始化时自动创建的“传统”网桥,它的配置比较贴近主机网络,容器会直接复用主机的DNS设置——也就是你看到的直接挂载主机/etc/resolv.conf的情况,所以默认网络里容器的DNS和主机完全一致。
  • 而自定义网络(不管是bridge类型还是其他),Docker会启用自己的内置DNS服务(就是你看到的127.0.0.11)。这个内置DNS的核心作用是实现容器之间的域名解析(比如用容器名直接访问同网络的其他容器),同时它会尝试从主机的DNS配置转发外部域名请求。但在某些环境下(比如你的OVH主机环境),可能因为主机DNS的权限限制、Docker转发逻辑的小问题,导致内置DNS没能正确转发外部解析请求,所以就出现了能ping通IP但解析不了域名的情况。

另外你看到的search ovh.net是正常继承自主机的搜索域,这部分没问题,只是DNS服务器被替换成了Docker内置的。

解决方法

给你几种不同场景下的解决方案,按需选择:

1. 单容器临时指定DNS(你已经试过的方法)

如果只是个别容器需要调整,启动时加上--dns参数就行:

docker run -it --network mynetwork --dns 213.186.33.99 busybox ping -c 1 www.google.com

2. 给自定义网络设置默认DNS

如果希望所有加入mynetwork的容器都自动用这个DNS,创建网络时直接配置:

docker network create --dns 213.186.33.99 mynetwork

要是网络已经创建了,得先删掉(确保没有容器在用它)再重建:

# 先停止并移除使用该网络的容器(如果有的话)
docker stop $(docker ps --filter network=mynetwork -q)
docker rm $(docker ps --filter network=mynetwork -aq)

# 删除旧网络并重建
docker network rm mynetwork
docker network create --dns 213.186.33.99 mynetwork

3. 全局配置所有自定义网络的默认DNS

如果想让所有新创建的自定义网络都默认用指定DNS,修改Docker的守护进程配置文件:

  1. 创建或编辑/etc/docker/daemon.json文件:
{
  "dns": ["213.186.33.99"]
}
  1. 重启Docker服务生效:
sudo service docker restart

这样之后所有自定义网络里的容器都会自动用这个DNS,内置DNS也会用它转发外部请求。

4. 排查主机DNS的可用性

如果以上方法都不想用,也可以检查下主机的/etc/resolv.conf里的DNS服务器是否能被Docker访问,或者主机有没有运行本地DNS缓存服务(比如dnsmasq)导致Docker内置DNS无法正确转发。可以看看Docker的日志(/var/log/docker.log或者sudo journalctl -u docker)有没有DNS相关的错误提示。

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

火山引擎 最新活动