Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker无法解析专用网络上的DNS_Docker_Dns_Dnsmasq - Fatal编程技术网

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

Docker无法解析专用网络上的DNS,docker,dns,dnsmasq,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

我的机器位于一个带有专用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
容器

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

很明显,谷歌的公共DNS服务器不会解析我的私人DNS请求。我知道我可以用
docker--dns 192.168.0.1
强制它,或者在
/etc/default/docker
中设置
docker\u OPTS=“--dns 192.168.0.1”
,但我的笔记本电脑经常切换网络。似乎应该有一个系统的方法来解决这个问题

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

根据报告:

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

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

一,。创建/编辑
/etc/dnsmasq.conf
†并添加以下行:

interface=lo
interface=docker0
interface=docker0
bind-interfaces
listen-address=172.17.0.1
二,。查找您的docker IP(在本例中为
172.17.0.1
):

三,。创建/编辑
/etc/resolvconf/resolv.conf.d/tail
,并添加此行:

nameserver 172.17.0.1
nameserver 172.17.0.1
四,。重新启动网络,更新
resolv.conf
,重新启动docker:

sudo service network-manager restart
sudo resolvconf -u
sudo service docker restart
sudo service network-manager restart
sudo resolvconf -u
sudo service dnsmasq restart
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
,具体取决于您的系统和个人偏好。

对于Ubuntu 18.04和其他使用systemd的系统,可能需要安装dnsmasq和resolvconf。系统D已解决,并且

一,。安装dnsmasq和resolvconf

sudo apt update
sudo apt install dnsmasq resolvconf
二,。查找您的docker IP(在本例中为172.17.0.1):

三,。编辑
/etc/dnsmasq.conf
并添加以下行:

interface=lo
interface=docker0
interface=docker0
bind-interfaces
listen-address=172.17.0.1
四,。创建/编辑
/etc/resolvconf/resolv.conf.d/tail
,并添加此行:

nameserver 172.17.0.1
nameserver 172.17.0.1
五,。重新启动网络,更新
resolv.conf
,重新启动docker:

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

您的容器现在可以从主机正在使用的任何DNS服务器解析DNS。

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

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

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

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

sudo yum install NetworkManager-tui
分步指南:

  • 使/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
    
    [主要]
    #NetworkManager将把DNS配置推送到systemd
    dns=systemd已解析
    #NetworkManager永远不会向/etc/resolv.conf写入任何内容
    rc管理器=非托管
    
  • 安装dnsmasq
    sudo apt get-y安装dnsmasq
  • 在/etc/dnsmasq.conf中配置dnsmasq,以监听DNS来自Docker的查询,并使用systemd resolvd名称服务器
    
    #使用docker0接口
    接口=docker0
    #显式指定要侦听的地址
    收听地址=172.17.0.1
    #看起来dnsmasq服务启动时docker0接口不可用,因此它会失败。此选项使动态创建的接口以与默认接口相同的方式工作。
    绑定动态
    #设置systemd解析的DNS服务器
    服务器=127.0.0.53
    
  • 编辑/etc/resolv.conf以在Docker网络中使用systemd resolvd名称服务器(127.0.0.53)和主机IP(172.17.0.1)
    
    #systemd解析名称服务器
    名称服务器127.0.0.53
    #docker主机ip
    名称服务器172.17.0.1
    
  • 重新启动服务
    
    sudo服务网络管理器重启
    sudo服务dnsmasq重启
    sudo服务docker重启
    

有关更多信息,请参阅我的帖子(西班牙语)

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

sudo yum install NetworkManager-tui
并重新配置了我的
resolv.conf
,默认DNS为
8.8.8

nano /etc/resolv.conf

这是一个很好的解决方案。将DNS服务器添加到
/etc/docker/daemon.json
中。在我进行更改后,这项操作非常有效,但在重新启动时,我得到了
dnsmasq:无法为172.17.0.1创建侦听套接字。无法分配请求的地址
,必须再次手动运行
服务dnsmasq restart
。您遇到这个问题了吗?使用bind dynamic更改绑定接口。看起来dnsmasq服务启动时docker0接口不可用,因此它会失败。此选项使动态创建的接口以与默认接口相同的方式工作。@rubensa这对我不起作用。我得到
无法设置--bind接口和--bind dynamic
,而在.conf文件中没有
绑定接口。我也试过了