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

blu*_*ast 9 dns dnsmasq ubuntu docker

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
Run Code Online (Sandbox Code Playgroud)

容器的/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
Run Code Online (Sandbox Code Playgroud)

似乎 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)
Run Code Online (Sandbox Code Playgroud)

如下:

docker run \
    -it \
    --name ubuntu.bionic \
    --restart always \
    --dns 172.17.0.1 \
    ubuntu:bionic
Run Code Online (Sandbox Code Playgroud)

但是 dns 不起作用:

root@ubuntu:/# apt-get update
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease        
  Temporary failure resolving 'security.ubuntu.com'
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

listen-address=127.0.0.1,172.17.0.1
Run Code Online (Sandbox Code Playgroud)

我仍然不喜欢我需要两次提供docker0接口的 IP 地址,一次用于我要创建的每个容器的命令,以及配置。docker rundnsmasq

编辑2

我可以告诉docker默认情况下使用我的本地 DNS 服务器(它在容器中运行,并且可以访问docker0界面中的其他容器:)172.17.0.1

» sudo cat /etc/docker/daemon.json
{
    "dns": ["172.17.0.1", "8.8.8.8"]
}
Run Code Online (Sandbox Code Playgroud)

然后重启 docker 守护进程:

sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

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

Eug*_*ash 5

dnsmasq如果 Docker 容器位于用户定义的网络上,您可以使用主机的本地 DNS 解析器(例如)。在这种情况下,容器/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    
Run Code Online (Sandbox Code Playgroud)

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