我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
,并且我将被迫重新配置docker
和dnsmasq
重建容器。
答案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+)。