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 run
dnsmasq
我可以告诉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
的接口,我将被迫重新配置docker
和dnsmasq
,并重建容器。
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+)。