Em *_*dih 7 networking dns docker
在一台有 IP 的机器上192.168.100.6,我可以运行一个 docker 容器并在容器内没有问题地执行 dns:
$ docker run --rm -it xenial-networking bash
root@255c2ffc38cb:/# dig registry.mynet
; <<>> DiG 9.10.3-P4-Ubuntu <<>> registry.mynet
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1540
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;registry.mynet. IN A
;; ANSWER SECTION:
registry.mynet. 0 IN A 192.168.100.16
;; Query time: 0 msec
;; SERVER: 192.168.100.16#53(192.168.100.16)
;; WHEN: Thu May 17 07:54:28 UTC 2018
;; MSG SIZE rcvd: 61
Run Code Online (Sandbox Code Playgroud)
(如您所见,它registry.mynet与 dns 服务器在同一主机中,192.168.100.16)
供参考,解析器在docker容器中配置如下:
root@255c2ffc38cb:/# 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 192.168.100.16
nameserver 192.168.100.4
nameserver 192.168.100.3
nameserver 192.168.100.2
search openstacklocal
Run Code Online (Sandbox Code Playgroud)
(这是 docker 主机中解析器配置的副本),根据这些规则
在服务器实际运行的192.168.100.16机器DNS上(作为 docker 服务,请参见下面的 compose 配置),同样不起作用:尽管解析器配置完全相同:我收到了“来自意外来源的回复”,并且无名称解析:
root@e7de85671e86:/# dig registry.mynet
;; reply from unexpected source: 172.17.0.1#53, expected 192.168.100.16#53
; <<>> DiG 9.10.3-P4-Ubuntu <<>> registry.mynet
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 12820
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;registry.mynet. IN A
;; AUTHORITY SECTION:
. 10800 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018051700 1800 900 604800 86400
;; Query time: 97 msec
;; SERVER: 192.168.100.4#53(192.168.100.4)
;; WHEN: Thu May 17 07:58:25 UTC 2018
;; MSG SIZE rcvd: 120
Run Code Online (Sandbox Code Playgroud)
这个容器的解析器配置是一样的:
root@e7de85671e86:/# 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 192.168.100.16
nameserver 192.168.100.4
nameserver 192.168.100.3
nameserver 192.168.100.2
search openstacklocal
Run Code Online (Sandbox Code Playgroud)
为什么回复来自172.17.0.1.
dns服务的compose配置如下:
dnsmasq:
image: andyshinn/dnsmasq:2.78
volumes:
- ./dnsmasq/conf/dnsmasq.conf:/etc/dnsmasq.conf
- ./dnsmasq/conf/dnsmasq.d:/etc/dnsmasq.d
- ./dnsmasq/conf/hosts:/etc/hosts
network_mode: "host"
cap_add:
- NET_ADMIN
restart: always
command: --log-facility=- --log-queries=extra --all-servers --conf-file=/etc/dnsmasq.conf
Run Code Online (Sandbox Code Playgroud)
将有问题的 docker 主机(192.168.100.16机器)中的解析器更改为:
$ 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 172.17.0.1
nameserver 192.168.100.4
nameserver 192.168.100.3
nameserver 192.168.100.2
search openstacklocal
Run Code Online (Sandbox Code Playgroud)
摆脱了这个问题。我仍然不明白为什么192.168.100.16名称服务器在192.168.100.16主机中运行的容器中无法正常工作(在主机本身中它工作正常)
小智 0
我有同样的问题。
对于面临同样问题的每个人:
我在 Linux(特别是 Ubuntu)中工作,我在我的主机上设置了 dnsmasq。相同的设置适用于 Mac,但在 Linux 中,即使我使用正确的 IP 地址指向我的计算机(不是 localhost/127.0.0.1),内部容器也无法解析到我的本地 dnsmasq。基本上与上面的设置相同。它不起作用。
当我专门network: bridge在我的所有服务中使用后,现在连接了相同的IP。因此,问题是,Linux 中 docker 引擎中的默认网络默认情况下未连接到主机接口。为此,我们必须专门使用桥接网络。现在,为什么它可以在 Mac 上运行?我不知道。可能是因为 Mac 中的主机接口默认是桥接的。
| 归档时间: |
|
| 查看次数: |
5930 次 |
| 最近记录: |