コンテナの resolv.conf は、特に指定しなかった場合にどうなる?

金融業界でも、Docker や Podman などのコンテナでのアプリケーション運用やウェブサイト運用が浸透してきました。コンテナの動作を正確に理解することは非常に重要で、リリースや構成変更の際には明確な挙動の説明が求められます。今回は、コンテナ内の DNS 参照先を指定する resolv.conf についての動作を確認します。

DockerやPodmanでコンテナを起動する際にDNSを指定しなかった場合、コンテナ内の/etc/resolv.confはデフォルトでホスト側の/etc/resolv.confがコピーされるわけではありません。ただし、動作はホストの設定に依存することがあります。

Dockerの場合

  1. デフォルトの動作:
    • Dockerデーモンは、デフォルトでコンテナごとに新しい/etc/resolv.confを作成し、以下の優先順位でDNSサーバーを決定します:
      1. Dockerデーモンに指定されたDNSサーバー (もしあれば)
      2. ホストの/etc/resolv.confの内容
      3. Google Public DNSサーバー (8.8.8.8と8.8.4.4)

    そのため、ホストの/etc/resolv.confの設定が使われることが多いですが、厳密にはコピーされるわけではなく、内容が参照される形になります。

  2. カスタムDNSの指定:
    • コンテナを起動する際に明示的にDNSサーバーを指定することも可能です。例えば、docker runコマンドで--dnsオプションを使います。
      docker run --dns 1.1.1.1 --dns 1.0.0.1 my_image

Podmanの場合

  1. デフォルトの動作:
    • Podmanもデフォルトでは新しい/etc/resolv.confを作成しますが、基本的にはホストのDNS設定を反映する形になります。Podmanは、ホストの/etc/resolv.confの内容を参照して設定します。
  2. カスタムDNSの指定:
    • PodmanでもDocker同様にカスタムDNSを指定することができます。podman runコマンドで--dnsオプションを使います。
      podman run --dns 1.1.1.1 --dns 1.0.0.1 my_image

まとめ

DNSを指定しない場合、DockerもPodmanもホストの/etc/resolv.confの内容を参考にしてコンテナ内のDNS設定を行いますが、これはホストの設定がコピーされるというよりも、参照して新たに設定されるという形です。必要に応じてカスタムDNSを指定することで、コンテナ内のDNS設定を制御することができます。