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
以上。
よろしければサポートお願いします!頂いたサポート費は、執筆活動に使わせて頂きます。