ユーザ定義ネットワーク用の内蔵 DNS サーバ

このセクションで扱う情報は、内蔵 DNS サーバ(embedded DNS server)をユーザ定義ネットワーク上で操作する方法です。ユーザ定義ネットワークに接続したコンテナは、 DNS の名前解決の仕方がデフォルトの bridge ネットワークとは異なります。

注釈

後方互換性を維持するため、デフォルトの bridge ネットワークにおける DNS 設定方法は何も変わりません。デフォルトの bridge ネットワークにおける DNS 設定に関する詳しい情報は コンテナの DNS を設定 をご覧ください。

Docker 1.10 では、docker デーモンに内蔵 DNS サーバが実装されました。これはコンテナ作成時の有効な 名前 (name) もしくは ネット・エイリアス (net-alias) または リンク (link) の別名を元にしたサービス・ディスカバリを提供します。Docker がコンテナ内で DNS 設定を管理する手法は、次のバージョンの Docker から変更になります。そのため、コンテナ内にある /etc/hosts/etc/resolv.conf のようなファイルを考慮する必要はなくなり、これらのファイルはそのままにし、以下で挙げる Docker のオプションが指定できます。

複数のコンテナに対するオプションは、コンテナのドメインネーム・サービス(DNS)に影響を与えます。

  • --name=CONTAINER-NAME--name で設定するコンテナ名は、ユーザ定義 Docker ネットワーク内でディスカバリ用に使われます。内蔵 DNS サーバは、このコンテナ名と(コンテナが接続するネットワーク上の) IP アドレスに対応し続けます。
  • --net-alias=エイリアス名 … ユーザ定義ネットワーク内では、コンテナを見つける(ディスカバリする)ためには、この上にある --name に加えて1つまたは複数の --net-alias が指定できます(あるいは、 docker network connect コマンドで --alias を使います )。内蔵 DNS サーバは、指定したユーザ定義ネットワーク内において、全てのコンテナ・エイリアス名(別名)と IP アドレスを対応し続けます。 docker network connect コマンドで --alias を使うことで、ネットワーク毎に別々のエイリアス名が利用できます。
  • --link=コンテナ名:エイリアス … このオプションをコンテナの run (実行)時に指定すると、内蔵 DNS は エイリアス 名の追加エントリを指定します。これは コンテナ名 を指定したコンテナの IP アドレスに対して、別の名前でアクセスできるようにします。内蔵 DNS では --link が指定されると、 --link が指定されたコンテナの中から、唯一の結果のみ返します。これにより、内部のプロセスがコンテナの名前や IP アドレスを知らなかったとしても、新しいコンテナに接続できるようにします。
  • --dns=[IPアドレス...] … コンテナから名前解決のリクエストがあっても内蔵 DNS サーバが解決できない時に、DNS クエリを --dns オプションで指定した IP アドレスに転送します。 --dns の IP アドレスは内蔵 DNS サーバによって管理されるため、コンテナ内の /etc/resolv.conf ファイルを変更しません。
  • --dns-search=ドメイン名... … コンテナ内部で使うホスト名にドメイン名が含まれていない時に、検索用に使うドメイン名を指定します。 --dns-search オプションは内蔵 DNS サーバによって管理されるため、コンテナ内の /etc/resolv.conf ファイルを変更しません。
  • --dns-opt=オプション... … DNS リゾルバが使うオプションを設定します。これらオプションは内蔵 DNS サーバによって管理されるため、コンテナ内の /etc/resolv.conf ファイルを編集しません。利用可能なオプションについては、 resolv.conf のドキュメントをご覧ください。

--dns=IPアドレス...--dns-search=ドメイン名...--dns-opt=オプション... の指定がなければ、 Docker はホストマシン上( docker デーモンの実行環境 )の /etc/resolv.conf を使います。この時、Docker デーモンは、ホスト上のオリジナル・ファイル上にある nameserver のエントリ、ここにある localhost の IP アドレス全てをフィルタします。

フィルタリングが必要なのは、コンテナのネットワークから、ホスト上の localhost のアドレス全てに到達できるとは限らないためです。フィルタリング後は、コンテナ内の /etc/resolv.conf ファイルに nameserver のエントリは一切無くなります。そしてデーモンはコンテナの DNS 設定にパブリックな Google DNS ネームサーバ( 8.8.8.8 と 8.8.4.4 )を追加します。デーモンで IPv6 が有効であれば、パブリックな Google の IPv6 DNS ネームサーバ( 2001:4860:4860::8888 と 2001:4860:4860::8844 )を追加します。

注釈

ホスト側のローカルホストにあるリゾルバにアクセスするには、コンテナ内から DNS サーバに到達可能になるように、ローカルホスト以外からも接続可能になるよう、リッスンする必要があります。

参考

Embedded DNS server in user-defined networks
https://docs.docker.com/engine/userguide/networking/configure-dns/