見出し画像

dockerネットワーク別のコンテナDNS設定(resolv.conf/hosts)を調べてみた

最近仕事でdockerコンテナから外部のDNSサーバを利用する設定を追加する必要がありました。

dockerコンテナでDNSサーバを指定する場合、/etc/resolv.confファイルに

nameserver XX.XX.XX.XX

とDNSサーバのIPアドレスを定義することで実現可能です。

この/etc/resolv.confはdockerコンテナ内で定義する必要があるのですが、コンテナ起動時にホストOS側の同様のファイルをコピーしてくる機能があることを知りました。

ただし、ネットワークモードによってコピーする/しないの挙動が異なるらしいので、ネットワークモード別の挙動を確認してみました。(/etc/hostsもコピーが走る場合があるため、同時に実験しました)

ネットワークモードは以下の4種類を確認

・bridge
・host
・none
・ユーザ定義(bridge)

※各モードの特徴は上のURLページ参考

実験環境

dockerバージョン:Docker version 19.03.12, build 48a66213fe
OS:WSL 2 (Ubuntu 18.04.4 LTS)

実験結果

/etc/resolv.conf

 →bridge/host/noneモードでdocker起動時にコピーされた

 ※docker restart時はbridge/hostのみ再読み込み

/etc/hosts

 →hostモードのみdocker起動および再起動時にコピーされた

実験内容

1.ホスト側の/etc/hosts、/etc/resolv.confを修正

2.host/bridge/none/ユーザ定義(今回はisolated_nwという名前のネットワークを作成)の4種類のコンテナを作成

docker run -itd --name=bridge nginx
docker run -itd --name=host --net=host busybox
docker run -itd --name=none --net=none busybox
docker network create --driver bridge isolated_nw
docker run --net=isolated_nw -itd --name=isolated_nw nginx


3.それぞれ、どのファイルがコピーされているか確認する

diff <(docker exec bridge cat /etc/resolv.conf) <(cat /etc/resolv.conf) | wc -l
diff <(docker exec host cat /etc/resolv.conf) <(cat /etc/resolv.conf)| wc -l
diff <(docker exec none cat /etc/resolv.conf) <(cat /etc/resolv.conf)| wc -l
diff <(docker exec isolated_nw cat /etc/resolv.conf) <(cat /etc/resolv.conf)| wc -l

diff <(docker exec bridge cat /etc/hosts) <(cat /etc/hosts)| wc -l
diff <(docker exec host cat /etc/hosts) <(cat /etc/hosts)| wc -l
diff <(docker exec none cat /etc/hosts) <(cat /etc/hosts)| wc -l
diff <(docker exec isolated_nw cat /etc/hosts) <(cat /etc/hosts)| wc -l

ホスト側のファイルを適当に修正してコンテナの再起動後、変更が反映されているか確認

echo "127.1.1.1 TEST" >> /etc/hosts
echo "nameserver 127.1.1.1" >> /etc/resolv.conf

docker restart bridge
docker restart host
docker restart none
docker restart isolated_nw

diff <(docker exec bridge cat /etc/resolv.conf) <(cat /etc/resolv.conf) | wc -l
diff <(docker exec host cat /etc/resolv.conf) <(cat /etc/resolv.conf)| wc -l
diff <(docker exec none cat /etc/resolv.conf) <(cat /etc/resolv.conf)| wc -l
diff <(docker exec isolated_nw cat /etc/resolv.conf) <(cat /etc/resolv.conf)| wc -l

diff <(docker exec bridge cat /etc/hosts) <(cat /etc/hosts)| wc -l
diff <(docker exec host cat /etc/hosts) <(cat /etc/hosts)| wc -l
diff <(docker exec none cat /etc/hosts) <(cat /etc/hosts)| wc -l
diff <(docker exec isolated_nw cat /etc/hosts) <(cat /etc/hosts)| wc -l



以上。

よろしければサポートお願いします!頂いたサポート費は、執筆活動に使わせて頂きます。