37

我的机器位于具有专用 DNS 服务器的专用网络上,以及用于 DNS 解析的专用区域。我可以从我的主机解析该区域上的主机,但我无法从我的主机上运行的容器解析它们。

主持人

root@host:~# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1

root@host:~# ping privatedomain.io
PING privatedomain.io (192.168.0.101) 56(84) bytes of data.

容器

root@container:~# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

nameserver 8.8.8.8
nameserver 8.8.4.4

root@container:~# ping privatedomain.io
ping: unknown host privatedomain.io

很明显,Google 的公共 DNS 服务器无法解析我的私有 DNS 请求。我知道我可以使用docker --dns 192.168.0.1或设置强制它DOCKER_OPTS="--dns 192.168.0.1"/etc/default/docker但我的笔记本电脑经常切换网络。似乎应该有一个系统的方法来解决这个问题。

4

8 回答 8

37

Docker/etc/resolv.conf通过复制主机来填充/etc/resolv.conf,并过滤掉任何本地名称服务器,例如 127.0.1.1。如果之后没有域名服务器,Docker 将添加 Google 的公共 DNS 服务器(8.8.8.8 和 8.8.4.4)。

根据Docker 文档

注意:如果您需要访问主机的 localhost 解析器,则必须修改主机上的 DNS 服务以侦听可从容器内访问的非 localhost 地址。

主机上的 DNS 服务是 dnsmasq,因此如果您让 dnsmasq 侦听您的 docker IP 并将其添加到 resolv.conf,docker 将配置容器以将其用作名称服务器。

1 . 创建/编辑/etc/dnsmasq.conf†</sup> 并添加以下行:

interface=lo
interface=docker0

2 . 找到您的 docker IP(在本例中为172.17.0.1):

root@host:~# ifconfig | grep -A2 docker0
docker0   Link encap:Ethernet  HWaddr 02:42:bb:b4:4a:50  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0

3 . 创建/编辑/etc/resolvconf/resolv.conf.d/tail并添加这一行:

nameserver 172.17.0.1

4 . 重启网络,更新resolv.conf,重启docker:

sudo service network-manager restart
sudo resolvconf -u
sudo service docker restart

您的容器现在将能够从主机使用的任何 DNS 服务器解析 DNS。

† 路径可能是/etc/dnsmasq.conf/etc/dnsmasq.conf.d/docker.conf/etc/NetworkManager/dnsmasq.conf或 ,/etc/NetworkManager/dnsmasq.d/docker.conf具体取决于您的系统和个人偏好。

于 2016-09-08T22:05:15.293 回答
27

对于 Ubuntu 18.04 和其他使用 systemd-resolved 的系统,可能需要安装 dnsmasq 和 resolvconf。systemd-resolved 被硬编码以监听 127.0.0.53,并且Docker 在读取 resolv.conf 时过滤掉任何环回地址

1 . 安装 dnsmasq 和 resolvconf。

sudo apt update
sudo apt install dnsmasq resolvconf

2 . 找到您的 docker IP(在本例中为 172.17.0.1):

root@host:~# ifconfig | grep -A2 docker0
docker0   Link encap:Ethernet  HWaddr 02:42:bb:b4:4a:50  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0

3 . 编辑/etc/dnsmasq.conf并添加这些行:

interface=docker0
bind-interfaces
listen-address=172.17.0.1

4 . 创建/编辑/etc/resolvconf/resolv.conf.d/tail并添加这一行:

nameserver 172.17.0.1

5 . 重启网络,更新resolv.conf,重启docker:

sudo service network-manager restart
sudo resolvconf -u
sudo service dnsmasq restart
sudo service docker restart

您的容器现在将能够从主机使用的任何 DNS 服务器解析 DNS。

于 2018-10-01T17:34:33.673 回答
7

如您所知,Docker将主机 /etc/resolv.conf文件复制到容器,但删除任何本地名称服务器。

我对这个问题的解决方案是继续使用systemd-resolvdNetworkManager但添加dnsmasq并使用它将Docker容器DNS查询“转发”到systemd-resolvd

分步指南:

  • 使/etc/resolv.conf成为“真实”文件 sudo rm /etc/resolv.conf sudo touch /etc/resolv.conf
  • 创建文件/etc/NetworkManager/conf.d/systemd-resolved-for-docker.conf告诉NetworkManager通知systemd-resolvd但不要触及/etc/resolv.conf [main] # NetworkManager will push the DNS configuration to systemd-resolved dns=systemd-resolved # NetworkManager won’t ever write anything to /etc/resolv.conf rc-manager=unmanaged
  • 安装dnsmasq sudo apt-get -y install dnsmasq
  • /etc/dnsmasq.conf中配置dnsmasq以侦听来自Docker的DNS查询并使用systemd-resolvd名称服务器 # Use interface docker0 interface=docker0 # Explicitly specify the address to listen on listen-address=172.17.0.1 # Looks like docker0 interface is not available when dnsmasq service starts so it fails. This option makes dynamically created interfaces work in the same way as the default. bind-dynamic # Set systemd-resolved DNS server server=127.0.0.53
  • 编辑/etc/resolv.conf以在Docker网络 中使用systemd-resolvd名称服务器 (127.0.0.53) 和主机IP (172.17.0.1) # systemd-resolvd name server nameserver 127.0.0.53 # docker host ip nameserver 172.17.0.1
  • 重启服务 sudo service network-manager restart sudo service dnsmasq restart sudo service docker restart

有关更多信息,请参阅我的帖子(西班牙语)https://rubensa.wordpress.com/2020/02/07/docker-no-usa-los-mismos-dns-que-el-host/

于 2020-02-07T12:10:59.887 回答
0

我在我们的 docker 容器中遇到了 DNS 解析器的问题。我尝试了很多不同的东西,最后,我发现我在Hostgator 中的 CentOS VPS 没有默认安装 NetworkManager-tui (nmtui),我只是安装并重新启动它

sudo yum install NetworkManager-tui

并将我resolv.conf的默认 DNS 重新配置为8.8.8.8.

nano /etc/resolv.conf
于 2021-03-20T11:21:55.333 回答
0

如果您使用的是 VPN,则 VPN 协议可能会附加到超出您的专用网络上配置的 MTU 的出站数据包。

典型的 MTU 为 1500。

尝试将此内容添加到 /etc/docker/daemon.json

{
  "mtu": 1300,
  "dns": ["<whatever DNS server you need in your private network>"]
}

然后systemctl restart docker

于 2021-10-28T18:55:32.070 回答
0

我的案例中有许多来自 docker hub 的图像(nodered、syncthing 和另一个):

  • 容器在非 root 用户下运行
  • 容器内的 /etc/resolv.conf 权限为 600,由 root 拥有

所以我的解决方案很简单

root@container:~# chmod 644 /etc/resolv.conf

利润!:))

于 2022-01-12T20:11:50.250 回答
0

我的 systemctl status docker 中有相同的错误消息。我运行一个 Nextcloud 和一个 nextcloud nginx 代理容器,并使用 docker compose 来安装它。它工作了好几个月,没有出现大问题,但在星期五它无法访问。服务器已关闭。我重新启动了它,我的 icecast2 实例工作正常,并在这个星期天用于我们教堂的服务。但是码头集装箱不见了。docker ps -a 没有显示任何内容,我无法像往常一样通过 docker exec 访问 nextcloud。我有错误消息:

No non-localhost DNS nameservers are left in resolv.conf. Using default external servers: [nameserver 8.8.8.8 nameserver 8.8.4.4]"
Feb 06 19:04:58 ncxxxxxxxxx dockerd[21551]: time="2022-02-06T19:04:58.894366765Z" level=info msg="IPv6 enabled; Adding default IPv6 external servers: [nameserver 2001:4860:4860::8888 nameserver 2001:4860:4860::8844]

我的 resolv.conf 看起来像这样:

GNU nano 4.8
/etc/resolv.conf
nameserver 127.0.0.53 
options edns0 trust-ad
search fritz.box
于 2022-02-06T19:14:57.280 回答
-2

对于 Ubuntu 18.04 LTS 来说已经足够了:

sudo service network-manager restart
sudo resolvconf -u
sudo service dnsmasq restart
sudo service docker restart
于 2019-06-27T11:02:15.407 回答