Docker无法解析专用网络上的DNS

时间:2016-09-08 22:05:15

标签: docker dns dnsmasq

我的计算机位于具有私有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,但我的笔记本电脑经常切换网络。似乎应该有一种系统的方法来解决这个问题。

5 个答案:

答案 0 :(得分:14)

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

根据Docker documentation

  

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

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

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

interface=lo
interface=docker0

2 找到您的码头工具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,具体取决于您的系统和个人偏好。

答案 1 :(得分:9)

对于Ubuntu 18.04和使用systemd-resolved的其他系统,可能需要安装dnsmasq和resolvconf。 systemd-resolved为hard-coded to listen on 127.0.0.53Docker filters out any loopback address when reading resolv.conf

1 安装dnsmasq和resolvconf。

sudo apt update
sudo apt install dnsmasq resolvconf

2 编辑/etc/dnsmasq.conf并添加以下行:

interface=docker0
bind-interfaces
listen-address=172.17.0.1

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 dnsmasq restart
sudo service docker restart

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

答案 2 :(得分:2)

您知道, Docker host /etc/resolv.conf 文件复制到容器中,但删除了任何本地名称服务器。

我对此问题的解决方案是继续使用 systemd-resolvd NetworkManager ,但添加 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 查询并使用< strong> 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 以使用 systemd-resolvd 名称服务器(127.0.0.53)和主机 IP (172.17.0.1 )在 Docker 网络中 # 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/

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

sudo yum install NetworkManager-tui

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

nano /etc/resolv.conf