コンテナの resolv.conf は、特に指定しなかった場合にどうなる?
金融業界でも、Docker や Podman などのコンテナでのアプリケーション運用やウェブサイト運用が浸透してきました。コンテナの動作を正確に理解することは非常に重要で、リリースや構成変更の際には明確な挙動の説明が求められます。今回は、コンテナ内の DNS 参照先を指定する resolv.conf についての動作を確認します。
DockerやPodmanでコンテナを起動する際にDNSを指定しなかった場合、コンテナ内の/etc/resolv.conf
はデフォルトでホスト側の/etc/resolv.conf
がコピーされるわけではありません。ただし、動作はホストの設定に依存することがあります。
Dockerの場合
- デフォルトの動作:
- Dockerデーモンは、デフォルトでコンテナごとに新しい
/etc/resolv.conf
を作成し、以下の優先順位でDNSサーバーを決定します:- Dockerデーモンに指定されたDNSサーバー (もしあれば)
- ホストの
/etc/resolv.conf
の内容 - Google Public DNSサーバー (8.8.8.8と8.8.4.4)
そのため、ホストの
/etc/resolv.conf
の設定が使われることが多いですが、厳密にはコピーされるわけではなく、内容が参照される形になります。 - Dockerデーモンは、デフォルトでコンテナごとに新しい
- カスタムDNSの指定:
- コンテナを起動する際に明示的にDNSサーバーを指定することも可能です。例えば、
docker run
コマンドで--dns
オプションを使います。docker run --dns 1.1.1.1 --dns 1.0.0.1 my_image
- コンテナを起動する際に明示的にDNSサーバーを指定することも可能です。例えば、
Podmanの場合
- デフォルトの動作:
- Podmanもデフォルトでは新しい
/etc/resolv.conf
を作成しますが、基本的にはホストのDNS設定を反映する形になります。Podmanは、ホストの/etc/resolv.conf
の内容を参照して設定します。
- Podmanもデフォルトでは新しい
- カスタムDNSの指定:
- PodmanでもDocker同様にカスタムDNSを指定することができます。
podman run
コマンドで--dns
オプションを使います。podman run --dns 1.1.1.1 --dns 1.0.0.1 my_image
- PodmanでもDocker同様にカスタムDNSを指定することができます。
まとめ
DNSを指定しない場合、DockerもPodmanもホストの/etc/resolv.conf
の内容を参考にしてコンテナ内のDNS設定を行いますが、これはホストの設定がコピーされるというよりも、参照して新たに設定されるという形です。必要に応じてカスタムDNSを指定することで、コンテナ内のDNS設定を制御することができます。