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