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 を実行したら、次のように動作します。

  1. myapp_default という名称のネットワークを作成します。
  2. web 設定を使ったコンテナを作成します。これをネットワーク myapp_default に対して、web という名称で追加します。
  3. db 設定を使ったコンテナを作成します。これをネットワーク myapp_default に対して、 db という名称で追加します。

各コンテナは、これでホスト名を web あるいは db で名前解決することにより、コンテナに割り当てられた IP アドレスが分かります。たとえば、web アプリケーションのコードが URL postgres://myapp_db_1:5432 にアクセスできるようになり、PostgreSQL データベースを利用開始します。

web はポートの割り当てを明示しているため、Docker ホスト側のネットワーク・インターフェース上からも、ポート 8000 を通して外からアクセス可能です。

コンテナのアップデート

サービスの設定を変更するには、 docker-compose up を実行して、古いコンテナの削除と新しいコンテナをネットワーク下で起動します。IP アドレスは異なりますが、ホスト名は同じです。実行中のコンテナはその名前で名前解決が可能になり、新しい IP アドレスで接続できますが、古い IP アドレスは機能しなくなります。

もし古いコンテナに対して接続しているコンテナがあれば、切断されます。この状況検知はコンテナ側の責任であり、名前解決を再度行い再接続します。

マルチホスト・ネットワーキング

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/