Compose のネットワーク機能¶
注釈
このドキュメントが適用されるのは Compose ファイル・フォーマットのバージョン2 を使う場合です。ネットワーク機能はバージョン1(過去)の Compose ファイルではサポートされていません。
デフォルトでは、Compose はアプリケーションに対して ネットワーク を1つ設定します。各コンテナ上のサービスはデフォルト・ネットワークに参加したら、同一ネットワーク上の他のコンテナから接続できるようになります。また、ホスト名とコンテナ名でも発見可能になります。
注釈
アプリケーション用のネットワークには、"プロジェクト名" と同じ名前が割り当てられます。プロジェクト名とは、作業している基準の(ベースとなる)ディレクトリ名です。このプロジェクト名は --project-name
フラグ か COMPOSE_PROJECT_NAME
環境変数 で変更できます。
例として、アプリケーションを置いたディレクトリ名を myapp
とし、docker-compose.yml
は次のような内容とします。
version: '2'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
docker-compose up
を実行したら、次のように動作します。
myapp_default
という名称のネットワークを作成します。web
設定を使ったコンテナを作成します。これをネットワークmyapp_default
に対して、web
という名称で追加します。db
設定を使ったコンテナを作成します。これをネットワークmyapp_default
に対して、db
という名称で追加します。
各コンテナは、これでホスト名を web
あるいは db
で名前解決することにより、コンテナに割り当てられた IP アドレスが分かります。たとえば、web
アプリケーションのコードが URL postgres://db:5432
にアクセスできるようになり、PostgreSQL データベースを利用開始します。
web
はポートの割り当てを明示しているため、Docker ホスト側のネットワーク・インターフェース上からも、ポート 8000 を通して外からアクセス可能です。
コンテナのアップデート¶
サービスの設定を変更するには、 docker-compose up
を実行して、古いコンテナの削除と新しいコンテナをネットワーク下で起動します。IP アドレスは異なりますが、ホスト名は同じです。実行中のコンテナはその名前で名前解決が可能になり、新しい IP アドレスで接続できますが、古い IP アドレスは機能しなくなります。
もし古いコンテナに対して接続しているコンテナがあれば、切断されます。この状況検知はコンテナ側の責任であり、名前解決を再度行い再接続します。
リンク(links)¶
Docker のリンク(link)は、一方通行の単一ホスト上における通信システムです。この機能は廃止される可能性があり、アプリケーションはネットワーク機能を使うようにアップデートすべきです。多くの場合は、docker-compose.yml
で link
セクションを削除するだけです。
リンク機能(links)とは、他のサービスから到達可能なエイリアス(別名)を定義するものです。サービス間で通信するために必要ではありません。すなわち、デフォルトでは、あらゆるサービスはサービス名を通して到達できます。以下の例では、 web
から db
に到達するには、ホスト名の db
と(エイリアスの) database
が使えます。
version: '2'
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
詳しい情報は links リファレンス をご覧ください。
マルチホスト・ネットワーキング¶
Compose アプリケーションを Swarm クラスタにデプロイする 時に、ビルトインの overlay
ドライバを使い、複数のホストを通してコンテナ間の通信を可能にできます。そのために
アプリケーションのコードや Compose ファイルを書き換える必要はありません。
Swarm クラスタのセットアップの仕方は、 複数のホストでネットワーク機能を使う方法 を参考にしてください。デフォルトは overlay
ドライバを使いますが、任意のドライバを指定可能です。詳しくは後述します。
カスタム・ネットワークの指定¶
デフォルトのアプリケーション用のネットワークを使う代わりに、自分で任意のネットワーク指定が可能です。そのためには、トップレベルの networks
キーを(Composeファイルで)使います。これにより、より複雑なトポロジのネットワーク作成や、 カスタム・ネットワーク・ドライバ やオプションを指定できます。また、Compose によって管理されない、外部に作成したネットワークにサービスも接続できます。
サービス・レベル の networks
キーを使うことで、各サービスがどのネットワークに接続するか定義できます。このキーは トップ・レベル の networks
キー直下にあるエントリ一覧から名前を参照するものです。
以下の Compose ファイルの例では、2つのカスタム・ネットワークを定義しています。 proxy
サービスと db
サービスは独立しています。これは共通のネットワークに接続していないためです。 app
のみが両方と通信できます。
version: '2'
services:
proxy:
build: ./proxy
networks:
- front
app:
build: ./app
networks:
- front
- back
db:
image: postgres
networks:
- back
networks:
front:
# Use a custom driver
driver: custom-driver-1
back:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
ネットワークでは、接続したネットワーク上で IPv4 アドレスと IPv6 アドレスの両方、またはいずれか を設定できます。
ネットワーク設定オプションに関する詳しい情報は、以下のリファレンスをご覧ください。
デフォルト・ネットワークの設定¶
自分でネットワークを定義する場合、しない場合どちらでも、アプリケーション全体に適用できるデフォルトのネットワークを networks
の直下の default
エントリで定義できます。
version: '2'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
既存のネットワークを使う¶
コンテナを既存のネットワークに接続したい場合は、 external
オプション を使います。
networks:
default:
external:
name: my-pre-existing-network
[プロジェクト名]_default
という名称のネットワークを作成しようとしなくても、Compose は my-pre-existing-network
という名称のネットワークを探し出し、コンテナのアプリケーションを接続できます。
参考
- Networking in Compose
- https://docs.docker.com/compose/networking/