Docker 使用主机的 DNS 而不是 /etc/resolv.conf 中提到的 DNS
Docker uses the DNS of the host instead of the DNS mentioned in /etc/resolv.conf
我正在使用 Ubuntu 1804,我已经创建了一个 ubuntu docker 并在其上配置了 samba。每当我 运行
root@dc2:/# host -t A dc2.sample.example.com
我收到这个错误
;; reply from unexpected source: 192.168.0.29#53, expected 172.17.0.1#53
Host dc2.sample.example.com not found: 3(NXDOMAIN)
192.168.0.29是我主机在wlps网络接口上的IP。
172.17.0.1 是 docker.
的 IP
我的docker上的/etc/resolv.conf是
root@dc2:/# cat /etc/resolv.conf
nameserver 172.17.0.1
search sample.example.com
nameserver 8.8.8.8
ifconfig里面的docker显示这个
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:67ff:fe78:f1f1 prefixlen 64 scopeid 0x20<link>
ether 02:42:67:78:f1:f1 txqueuelen 0 (Ethernet)
RX packets 16281 bytes 887008 (887.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24325 bytes 111088731 (111.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp6s0f1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 08:97:98:71:66:a2 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 29556327 bytes 2561211141 (2.5 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 29556327 bytes 2561211141 (2.5 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.29 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::5e1a:ef44:3912:319c prefixlen 64 scopeid 0x20<link>
ether 5c:87:9c:c2:77:34 txqueuelen 1000 (Ethernet)
RX packets 97406 bytes 133018627 (133.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28369 bytes 4610340 (4.6 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
据我了解,它正在使用 wifi(wlp0s20f3) 网络接口。如果我关闭我主机上的 wifi 并 运行 相同的命令,我得到
root@dc2:/# host -t A dc2.sample.example.com
;; reply from unexpected source: 127.0.0.1#53, expected 172.17.0.1#53
;; Warning: ID mismatch: expected ID 52940, got 62153
dc2.sample.example.com has address 172.17.0.1
我尝试使用 --dns 172.17.0.1
而 运行 使用 docker。
注意
我运行宁 docker 与
sudo docker run -d
--net=host
--dns 172.17.0.1
-v /etc/krb5.conf:/etc/krb5.conf -v /dev/urandom:/dev/random
--name kerb
--cap-add SYS_ADMIN
-h dc2
--add-host dc2.sample.example.com:172.17.0.1 --add-host dc2:172.17.0.1
-e BOOTSTRAP=0
kerb:kerb
您可以定义 docker 个网络,以便让两个 docker 在同一个网络中;或使用 host.docker.internal 通过主机 ip 从一个到另一个进行访问。 --net=host 不需要。如果你定义了一个docker-network,你可以把docker名字放在resolv.conf比内部IP更好。
/etc/resolv.conf
root@dc2:/# cat /etc/resolv.conf
nameserver yourdockername
search sample.example.com
nameserver 8.8.8.8
创建一个docker网络:
docker network create -d bridge mynetwork
docker run --network=mynetwork ...
(代替--net=host) 其余同
那是因为如果您使用 --net=host
,您 docker 中的所有接口都与您的主机在 docker run
之前的接口相同。此外,您没有将 resolv.conf
从主机安装到 docker,因此无法路由它。
还有其他方法可以做到这一点,但我建议您使用 docker-proxy
和 docker networks
来做到这一点:创建一个 vnet 并使用 docker 名称而不是 IP 地址访问他们的 docker .
我正在使用 Ubuntu 1804,我已经创建了一个 ubuntu docker 并在其上配置了 samba。每当我 运行
root@dc2:/# host -t A dc2.sample.example.com
我收到这个错误
;; reply from unexpected source: 192.168.0.29#53, expected 172.17.0.1#53
Host dc2.sample.example.com not found: 3(NXDOMAIN)
192.168.0.29是我主机在wlps网络接口上的IP。 172.17.0.1 是 docker.
的 IP我的docker上的/etc/resolv.conf是
root@dc2:/# cat /etc/resolv.conf
nameserver 172.17.0.1
search sample.example.com
nameserver 8.8.8.8
ifconfig里面的docker显示这个
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:67ff:fe78:f1f1 prefixlen 64 scopeid 0x20<link>
ether 02:42:67:78:f1:f1 txqueuelen 0 (Ethernet)
RX packets 16281 bytes 887008 (887.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24325 bytes 111088731 (111.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp6s0f1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 08:97:98:71:66:a2 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 29556327 bytes 2561211141 (2.5 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 29556327 bytes 2561211141 (2.5 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.29 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::5e1a:ef44:3912:319c prefixlen 64 scopeid 0x20<link>
ether 5c:87:9c:c2:77:34 txqueuelen 1000 (Ethernet)
RX packets 97406 bytes 133018627 (133.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28369 bytes 4610340 (4.6 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
据我了解,它正在使用 wifi(wlp0s20f3) 网络接口。如果我关闭我主机上的 wifi 并 运行 相同的命令,我得到
root@dc2:/# host -t A dc2.sample.example.com
;; reply from unexpected source: 127.0.0.1#53, expected 172.17.0.1#53
;; Warning: ID mismatch: expected ID 52940, got 62153
dc2.sample.example.com has address 172.17.0.1
我尝试使用 --dns 172.17.0.1
而 运行 使用 docker。
注意
我运行宁 docker 与
sudo docker run -d
--net=host
--dns 172.17.0.1
-v /etc/krb5.conf:/etc/krb5.conf -v /dev/urandom:/dev/random
--name kerb
--cap-add SYS_ADMIN
-h dc2
--add-host dc2.sample.example.com:172.17.0.1 --add-host dc2:172.17.0.1
-e BOOTSTRAP=0
kerb:kerb
您可以定义 docker 个网络,以便让两个 docker 在同一个网络中;或使用 host.docker.internal 通过主机 ip 从一个到另一个进行访问。 --net=host 不需要。如果你定义了一个docker-network,你可以把docker名字放在resolv.conf比内部IP更好。
/etc/resolv.conf
root@dc2:/# cat /etc/resolv.conf
nameserver yourdockername
search sample.example.com
nameserver 8.8.8.8
创建一个docker网络:
docker network create -d bridge mynetwork
docker run --network=mynetwork ...
(代替--net=host) 其余同
那是因为如果您使用 --net=host
,您 docker 中的所有接口都与您的主机在 docker run
之前的接口相同。此外,您没有将 resolv.conf
从主机安装到 docker,因此无法路由它。
还有其他方法可以做到这一点,但我建议您使用 docker-proxy
和 docker networks
来做到这一点:创建一个 vnet 并使用 docker 名称而不是 IP 地址访问他们的 docker .