Compose のネットワーク機能¶
注釈
Compose のネットワーク機能のサポートは実験的であり、利用するためには docker-compose --x-networking
フラグで明示する必要があります。
Compose はアプリケーションに対して、デフォルト・ ネットワーク を1つ設定します。各コンテナ上のサービスはデオフォルト・ネットワークに参加し、そのネットワーク上の他のコンテナとは 通信可能 です。しかしコンテナ名はホスト名とは独立しているため、名前では発見できません 。
注釈
アプリケーション用のネットワークには、”プロジェクト名” と同じ名前が割り当てられます。プロジェクト名とは、作業している基準の(ベースとなる)ディレクトリ名です。変更方法は コマンドラインの概要 をご覧ください。
例として、アプリケーションを置いたディレクトリ名を myapp
とし、docker-compose.yml
は次のような内容とします。
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
docker-compose --x-networking up
を実行すると、次の動作します。
myapp
という名称のネットワークを作成します。web
設定を使ったコンテナを作成します。これをネットワークmyapp
に対して、myapp_web_1
という名称で追加します。db
設定を使ったコンテナを作成します。これをネットワークmyapp
に対してmyapp_db_1
という名称で追加します。
各コンテナは、これでホスト名を myapp_web_1
あるいは myapp_db_1
で名前解決することにより、コンテナに割り当てられた IP アドレスが分かります。例えば、web
アプリケーションのコードが URL postgres://myapp_db_1:5432
にアクセスできるようになり、PostgreSQL データベースを利用開始します。
web
はポートの割り当てを明示しているため、Docker ホスト側のネットワーク・インターフェース上からも、ポート 8000 を通して外からアクセス可能です。
注釈
次のリリースでは、コンテナに対する追加エイリアスを追加します。これはプロジェクト名とコンテナのインデックス(一覧)が不要な短い名前です。コンテナの完全名は、後方互換性のためにエイリアスの1つとして残し続けます。
コンテナのアップデート¶
サービスの設定を変更するには、 docker-compose up
を実行して、古いコンテナの削除と新しいコンテナをネットワーク下で起動します。IP アドレスは異なりますが、ホスト名は同じです。実行中のコンテナはその名前で名前解決が可能になり、新しい IP アドレスで接続できますが、古い IP アドレスは機能しなくなります。
もし古いコンテナに対して接続しているコンテナがあれば、切断されます。この状況検知はコンテナ側の責任であり、名前解決を再度行い再接続します。
サービス公開方法の設定¶
デフォルトでは、コンテナの各サービスは、コンテナ名を使ってネットワーク上に公開されます。コンテナの名前を変更するには、container_name
オプションを使います。
web:
build: .
container_name: "my-web-application"
リンク¶
Docker のリンク(link)は、一方通行の単一ホスト上における通信システムです。この機能は廃止される可能性があり、アプリケーションはネットワーク機能を使うようにアップデートすべきです。多くの場合は、docker-compose.yml
で link
セクションを削除するだけです。
ネットワークドライバの指定¶
アプリケーションがネットワークを作成するとき、Compose は bridge
ドライバをデフォルトで使います。Docker Engine は、他にも革新的な overlay
ドライバを提供します。このドライバは異なったホスト上のコンテナ間で、安全な通信を実装するものです(overlay
ドライバのセットアップ方法や使い方は次のセクションをご覧ください)。他にも Docker は カスタム・ネットワーク・ドライバ のインストールも可能です。
これを使うには、--x-network-driver
フラグを指定します。
$ docker-compose --x-networking --x-network-driver=overlay up
マルチホスト・ネットワーキング¶
(TODO: Swarm とオーバレイ・ドライバについて記述)
コンテナのネットワーク・モードを変更¶
Compose は net
オプションを指定し、カスタム・ネットワーク・モードを指定できます。例えば、 net: "host"
を指定すると、コンテナは Docker ホストと同じネットワーク名前空間を使います。 net: "none"
を指定すると、ネットワーク機能を持ちません。
サービスに対して net
オプションを指定すると、そのコンテナはアプリケーションのネットワークには接続 せず 、アプリケーション内の他のサービスと通信できなくなります。
アプリケーションにおける全てのサービスで net
オプションを指定すると、ネットワークを作成しません。