ユーザ定義ネットワーク用の内部 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=コンテナ名
…--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/