私のマシンは、プライベート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
を設定することもできますが、ラップトップはネットワークを頻繁に切り替えます。この問題を解決する体系的な方法があるはずです。
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
2。Docker 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
のいずれかです。
Ubuntu 18.04、およびsystemd-resolvedを使用する他のシステムの場合、dnsmasqおよびresolvconfのインストールが必要になる場合があります。 systemd-resolvedは 127.0.0.53でリッスンするようにハードコードされています 、および resolv.confの読み取り時にループバックアドレスを除外するDocker です。
1。dnsmasqと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を解決できるようになります。
Ubuntu 18.04 LTSには十分でした:
Sudo service network-manager restart
Sudo resolvconf -u
Sudo service dnsmasq restart
Sudo service docker restart