コンテナーのネットワーク

コンテナーが利用するネットワークの種類は、ブリッジオーバーレイMacvlan ネットワーク、カスタムネットワークプラグインとさまざまですが、コンテナーの内部から見ればどれも同じです。 コンテナーからすれば、ネットワークインターフェースに IP アドレスがあり、ゲートウェイ、ルーティングテーブル、DNS サービス、その他のネットワークリソースがあるだけのことです。 (もちろんコンテナーが none ネットワークドライバーを用いる場合は除きます。) ここでは、コンテナーから見たネットワーク関連のもろもろについて示します。

公開ポート

docker createdocker runを使ってコンテナーを生成、実行した際には、デフォルトではどのポートも外部に向け公開はされません。 Docker 外部にあるサービスに向けて、あるいはコンテナーネットワークに接続していない別のコンテナーに向けてポートを利用可能とするには、--publishまたは-pフラグを用います。 これを行うと、コンテナーから外部にある Docker ホストに向けたポート割り当てを実現するファイアウォールルールが生成されます。 以下がその例です。

フラグ値 内容説明
-p 8080:80 コンテナーの TCP ポート 80 を Docker ホスト上のポート 8080 に割り当てます。
-p 192.168.1.100:8080:80 コンテナーの TCP ポート 80 を Docker ホストの IP 192.168.1.100 への接続時のポート 8080 に割り当てます。
-p 8080:80/udp コンテナーの UDP ポート 80 を Docker ホスト上のポート 8080 に割り当てます。
-p 8080:80/tcp -p 8080:80/udp コンテナーの TCP ポート 80 を Docker ホスト上のポート 8080 に割り当てます。またコンテナーの UDP ポート 80 を Docker ホスト上のポート 8080 に割り当てます。

IP アドレスとホスト名

コンテナーが接続する Docker ネットワークのすべてに対して、デフォルトで個々に IP アドレスが割り振られます。 そしてその IP アドレスは、そのネットワークにある IP プールから割り振られます。 したがって Docker デーモンは各コンテナーに対して、実質的に DHCP サーバーとして振る舞うことになります。 各ネットワークには、デフォルトのサブネットマスクとゲートウェイがそれぞれに存在します。

コンテナーを起動する際に、ただ 1 つのネットワークに接続させるには --network フラグを使います。 実行中のコンテナーを複数ネットワークに接続するなら docker network connect を使います。 --network フラグを用いてコンテナーを起動すると、そのネットワーク上においてコンテナーに対する IP アドレスを指定することができます。 その場合には --ip または --ip6 フラグを使います。

既存のコンテナーをそれまでとは違うネットワークに接続するには docker network connect を用いますが、 コマンド実行の際に --ip または --ip6 フラグを用いれば、そのネットワーク上での IP アドレスを指定することができます。

同じような話として、コンテナーのホスト名にはコンテナー ID がデフォルトで割り当てられますが、--hostname を使えばホスト名をオーバーライドすることができます。 既存のネットワークに docker network connect を使って接続する際に --alias フラグを使うと、そのネットワーク上においてコンテナーの別名を指定することができます。

DNS サービス

コンテナーなデフォルトで、ホスト上の設定ファイル /etc/resolv.conf によって定義された DNS 設定を受け継ぎます。 コンテナーがデフォルトの bridge ネットワークを利用する場合は、その設定ファイルがコピーされます。 この一方で カスタムネットワーク を利用するコンテナーの場合は、Docker の埋め込み DNS サーバーを利用します。 これはホスト上において設定された DNS サーバーに対して、外部 DNS ルックアップをフォワードします。

/etc/hosts においてカスタムホストが定義されていても、これは受け継がれません。 追加的なホスト定義をコンテナーに受け渡すには、docker run のリファレンスドキュメント内にある、コンテナーのホストファイルへのエントリー追加 を参照してください。 このような設定は、コンテナーごとにオーバーライドすることができます。

フラグ 内容説明
--dns DNS サーバーの IP アドレス。複数の DNS サーバーを指定する場合は --dns フラグを複数回指定します。指定した IP アドレスにコンテナーから接続できない場合、Google の公開 DNS サーバー 8.8.8.8 を追加すれば、コンテナーがインターネットドメインを解決できるようになります。
--dns-search 完全修飾ドメイン名でないホスト名を検索するための DNS 検索ドメイン。複数の DNS サーチプレフィックスを指定するする場合は、--dns-search フラグを複数回指定します。
--dns-opt DNS オプションとその値を表わすキーバリューペア。適用するオプションについては、オペレーティングシステムにおける resolv.conf のドキュメントを参照してください。
--hostname コンテナーそのものが利用するホスト名。特に指定がない場合は、デフォルトでコンテナーID がホスト名になります。

プロキシーサーバー

コンテナーにおいてプロキシーサーバーを利用する必要がある場合は、プロキシーサーバーの利用 を参照してください。

networking, container, standalone