web-dev-qa-db-ja.com

Dockerはプライベートネットワーク上のDNSを解決できません

私のマシンは、プライベートDNSサーバーとDNS解決のためのプライベートゾーンを備えたプライベートネットワーク上にあります。ホストマシンからこのゾーンのホストを解決できますが、ホストマシンで実行されているコンテナからは解決できません。

ホスト

root@Host:~# 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.1.1

root@Host:~# ping privatedomain.io
PING privatedomain.io (192.168.0.101) 56(84) bytes of data.

コンテナ

root@container:~# 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 8.8.8.8
nameserver 8.8.4.4

root@container:~# ping privatedomain.io
ping: unknown Host privatedomain.io

GoogleのパブリックDNSサーバーがプライベートDNS要求を解決しないことはかなり明らかです。 docker --dns 192.168.0.1で強制することも、DOCKER_OPTS="--dns 192.168.0.1"/etc/default/dockerを設定することもできますが、ラップトップはネットワークを頻繁に切り替えます。この問題を解決する体系的な方法があるはずです。

16
wizulus

Dockerは、ホストの/etc/resolv.confをコピーし、127.0.1.1などのローカルネームサーバーを除外することにより、/etc/resolv.confを生成します。その後ネームサーバーが残っていない場合、DockerはGoogleのパブリックDNSサーバー(8.8.8.8および8.8.4.4)を追加します。

Dockerドキュメント によると:

:ホストのlocalhostリゾルバーへのアクセスが必要な場合、ホスト上のDNSサービスを変更して、到達可能な非localhostアドレスをリッスンする必要がありますコンテナ内から。

ホスト上のDNSサービスはdnsmasqであるため、dnsmasqでdocker IPをリッスンさせ、それをresolv.confに追加すると、dockerはそれをネームサーバーとして使用するようにコンテナを設定します。

1作成/編集/etc/dnsmasq.conf 次の行を追加します。

interface=lo
interface=docker0

2Docker IPを見つけます(この場合、172.17.0.1):

root@Host:~# ifconfig | grep -A2 docker0
docker0   Link encap:Ethernet  HWaddr 02:42:bb:b4:4a:50  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0

3/etc/resolvconf/resolv.conf.d/tailを作成/編集し、次の行を追加します。

nameserver 172.17.0.1

4ネットワークを再起動し、resolv.confを更新し、Dockerを再起動します。

Sudo service network-manager restart
Sudo resolvconf -u
Sudo service docker restart

これで、ホストマシンが使用しているDNSサーバーからコンテナがDNSを解決できるようになります。

†パスは、システムおよび個人の好みに応じて、/etc/dnsmasq.conf/etc/dnsmasq.conf.d/docker.conf/etc/NetworkManager/dnsmasq.conf、または/etc/NetworkManager/dnsmasq.d/docker.confのいずれかです。

21
wizulus

Ubuntu 18.04、およびsystemd-resolvedを使用する他のシステムの場合、dnsmasqおよびresolvconfのインストールが必要になる場合があります。 systemd-resolvedは 127.0.0.53でリッスンするようにハードコードされています 、および resolv.confの読み取り時にループバックアドレスを除外するDocker です。

1dnsmasqとresolvconfをインストールします。

Sudo apt update
Sudo apt install dnsmasq resolvconf

2/etc/dnsmasq.confを編集して、次の行を追加します。

interface=docker0
bind-interfaces
listen-address=172.17.0.1

3/etc/resolvconf/resolv.conf.d/tailを作成/編集し、次の行を追加します。

nameserver 172.17.0.1

4ネットワークの再起動、resolv.confの更新、dockerの再起動:

Sudo service network-manager restart
Sudo resolvconf -u
Sudo service dnsmasq restart
Sudo service docker restart

これで、コンテナは、ホストマシンが使用しているDNSサーバーからDNSを解決できるようになります。

12
wizulus

Ubuntu 18.04 LTSには十分でした:

Sudo service network-manager restart
Sudo resolvconf -u
Sudo service dnsmasq restart
Sudo service docker restart
0
Mexidense