Docker Compose でのネットワークの定義と管理

ネットワークはサービス間のコミュニケーションを可能にします。 デフォルトで Compose はアプリケーションに対して一つのネットワークを用意します。 一つのサービスの元にある複数コンテナーは、互いにデフォルトのネットワークによって結びついています。 そして双方向に、それぞれから他方へネットワーク到達可能であり、サービス名を使って検出可能になっています。 トップレベルの networks 要素は、ネットワークへの名前づけを行い、複数サービス間でのネットワーク利用を可能とします。

複数のサービス間において一つのネットワークを共有するためには、トップレベル要素 services 内にある networks 属性を使って明示的に各サービスからのアクセスを許可しなければなりません。 トップレベル要素 networks には追加の文法があって、より詳細な制御を行えるようになっています。

基本的な例

以下の例では実行時にネットワーク front-tierback-tier が生成されて、frontend サービスが front-tierback-tier の各ネットワークに接続されます。

services:
  frontend:
    image: example/webapp
    networks:
      - front-tier
      - back-tier

networks:
  front-tier:
  back-tier:

応用的な例

services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # ドライバーオプションの指定
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
  backend:
    # カスタムドライバーの利用
    driver: custom-driver

上の例では Compose ファイルにカスタムネットワークを二つ定義しています。 proxy サービスは db サービスとは分離されています。 なぜなら両者は共通するネットワークを一つも共有していないからです。 app のみが両者とのやり取りができます。

デフォルトネットワーク

Compose ファイルが明示的にネットワークを宣言していない場合、Compose は暗に default ネットワークを使います。 明示的な networks 宣言のないサービスは Compose によってこの default ネットワークに接続されます。

services:
  some-service:
    image: foo

上の例は実際には以下と同じです。

services:
  some-service:
    image: foo
    networks:
      default: {}
networks:
  default: {}

default ネットワークは明示的な宣言を通じてカスタマイズが可能です。

networks:
  default:
    name: a_network # カスタム名を利用
    driver_opts:    # ネットワーク生成のためドライバーに受け渡すオプション
      com.docker.network.bridge.host_binding_ipv4: 127.0.0.1

オプションに関しては Docker Engine ドキュメント を参照してください。

属性

attachable

attachabletrue に設定すると、そのネットワークに対してスタンドアローンコンテナーおよびサービスが接続できるようになります。 スタンドアローンコンテナーがそのネットワークに接続すると、サービスや他のスタンドアローンコンテナーの間での通信が可能となります。

networks:
  mynet1:
    driver: overlay
    attachable: true

driver

driver はそのネットワークが用いるドライバーを指定します。 ドライバーがプラットフォーム上で利用不能である場合には Compose がエラーを返します。

networks:
  db-data:
    driver: bridge

ドライバーやその指定可能オプションについての詳細は ネットワークドライバー を参照してください。

driver_opts

driver_opts はキーバリューペアによるオプションリストを指定するものであり、ドライバーにこれが受け渡されます。 オプションはドライバー固有のものを指定します。

networks:
  frontend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"

詳しくは ネットワークドライバーのドキュメント を参照してください。

enable_ipv4

必要条件: Docker Compose 2.33.1 およびそれ以降

enable_ipv4 は IPv4 アドレス割り当てを無効にする際に用いられます。

  networks:
    ip6net:
      enable_ipv4: false
      enable_ipv6: true

enable_ipv6

enable_ipv6 は IPv6 アドレス割り当てを有効にします。

  networks:
    ip6net:
      enable_ipv6: true

external

true が設定された場合、以下となります。

  • external は、このネットワークのライフサイクルを外部のアプリケーションが制御することを指定するものです。 Compose はそのように設定されたネットワークは生成しません。 そしてネットワークが存在しなければエラーを返します。
  • 名前以外の属性は一切無効になります。 Compose が他の属性を検出した場合、Compose ファイルが不適切であるものとして受け入れません。

以下の例において proxy は外部に対してのゲートウェイとして位置づけられます。 Compose はネットワークを作りにいくことはしません。 その代わりに outside という既存ネットワーク用のプラットフォームを探しに行きます。 そして proxy というサービスコンテナーをそこに貼り付けます。

services:
  proxy:
    image: example/proxy
    networks:
      - outside
      - default
  app:
    image: example/app
    networks:
      - default

networks:
  outside:
    external: true

ipam

ipam はカスタマイズした IPAM 設定を指定します。 これはプロパティをいくつか持ったオブジェクトです。 各プロパティは任意に設定します。

  • driver: デフォルトではないカスタマイズした IPAM ドライバー。
  • config: 0 個またはいくつかの設定が行われた要素リストです。要素としては以下があります。
    • subnet: CIDR フォーマットによるサブネットでありネットワークセグメントを表現します。
    • ip_range: コンテナー に対して割り当てる IP アドレスの範囲。
    • gateway: マスターサブネットに対する IPv4 または IPv6 ゲートウェイ。
    • aux_addresses: ホスト名から IP アドレスへのマッピングのためにネットワークドライバーが用いる補助 IPv4 または IPv6 アドレス。
  • options: キーバリューマッピングによる表現されるドライバー固有のオプション。
networks:
  mynet1:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
          ip_range: 172.28.5.0/24
          gateway: 172.28.5.254
          aux_addresses:
            host1: 172.28.1.5
            host2: 172.28.1.6
            host3: 172.28.1.7
      options:
        foo: bar
        baz: "0"

internal

Compose はデフォルトで外部ネットワークへの接続機能を提供します。 internaltrue に設定すると、外部からは独立したネットワークを生成します。

labels

labels を用いることで、コンテナーにメタデータを追加します。 配列または辞書形式のデータを指定できます。

推奨されるのは逆引き DNS 記法を用いることであり、他のソフトウェアが利用するラベルとの衝突を避けることができます。

networks:
  mynet1:
    labels:
      com.example.description: "Financial transaction network"
      com.example.department: "Finance"
      com.example.label-with-empty-value: ""
networks:
  mynet1:
    labels:
      - "com.example.description=Financial transaction network"
      - "com.example.department=Finance"
      - "com.example.label-with-empty-value"

Compose が com.docker.compose.projectcom.docker.compose.network というラベルを設定します。

name

name はネットワークに対してカスタムな名前を設定します。 name フィールドには、ネットワークを参照するために特殊文字も含めて指定することができます。 name は記述されたものがそのまま用いられるものであり、プロジェクト名によってスコープされるものではありません。

networks:
  network1:
    name: my-app-net

external プロパティとともに指定することが可能であり、Compose が必ず用いなければならないプラットフォーム内のネットワークを定義できます。 利用にあたっては通常はパラメーターを用いるので、Compose ファイルでは実行時の特定の値をハードコーディングする必要はありません。

networks:
  network1:
    external: true
    name: "${NETWORK_ID}"

さらなる情報

この他の例については Compose におけるネットワーク を参照してください。