告诉docker使用主机系统中的DNS服务器

告诉docker使用主机系统中的DNS服务器

dnsmasq在主机上运行,​​我想让docker容器使用它,而不是默认 Google 服务器8.8.8.8

我的主机/etc/resolv.conf如下所示:

» 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.0.1
search mydomain.net

容器的/etc/resolv.conf外观如下:

root@ubuntu:/# 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
search mydomain.net

nameserver 8.8.8.8
nameserver 8.8.4.4

看起来,docker 正在重用主机的/etc/resolv.conf但丢弃该127.0.0.1条目,而是添加 Google 的名称服务器。

我尝试添加引用该docker0接口的 DNS 条目:

» ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 02:42:8e:65:b0:88  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:8eff:fe65:b088/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:55824 errors:0 dropped:0 overruns:0 frame:0
          TX packets:74365 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:15702804 (15.7 MB)  TX bytes:60639605 (60.6 MB)

如下:

docker run \
    -it \
    --name ubuntu.bionic \
    --restart always \
    --dns 172.17.0.1 \
    ubuntu:bionic

但 DNS 不起作用:

root@ubuntu:/# apt-get update
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease        
  Temporary failure resolving 'security.ubuntu.com'

我如何使用docker容器来使用主机系统中的dns服务器?

编辑

看来我需要告诉dnsmasq绑定到docker0接口:

listen-address=127.0.0.1,172.17.0.1

我仍然不喜欢需要提供docker0接口的 IP 地址两次,一次用于docker run命令每个容器我想创建它,也想进行配置dnsmasq

编辑2

我可以docker默认使用我的本地 DNS 服务器(它在容器中运行,并且可以通过接口访问其他容器docker0:)172.17.0.1

» sudo cat /etc/docker/daemon.json
{
    "dns": ["172.17.0.1", "8.8.8.8"]
}

然后重新启动docker守护进程:

sudo service docker restart

我仍然有点担心docker可能会决定更改接口的 IP 地址docker0,并且我将被迫重新配置dockerdnsmasq重建容器。

答案1

你可以使用主机的本地 DNS 解析器(例如dnsmasq),如果你的 Docker 容器位于用户定义网络。在这种情况下,容器/etc/resolv.conf将拥有名称服务器127.0.0.11(即 Docker 的嵌入式 DNS 服务器),能够正确转发DNS请求到主机的环回地址。

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

如果你使用docker-compose,它将自动为你的服务设置自定义网络(使用文件格式v2+)。但请注意,虽然docker-compose在用户定义的网络中运行容器,但它仍然在默认网络。要使用自定义网络进行构建,您可以network构建配置(需要文件格式3.4+)。

相关内容