Docker Compose でのネットワークの定義と管理
ネットワークはサービス間のコミュニケーションを可能にします。
デフォルトで Compose はアプリケーションに対して一つのネットワークを用意します。
一つのサービスの元にある複数コンテナーは、互いにデフォルトのネットワークによって結びついています。
そして双方向に、それぞれから他方へネットワーク到達可能であり、サービス名を使って検出可能になっています。
トップレベルの networks 要素は、ネットワークへの名前づけを行い、複数サービス間でのネットワーク利用を可能とします。
複数のサービス間において一つのネットワークを共有するためには、トップレベル要素 services 内にある networks 属性を使って明示的に各サービスからのアクセスを許可しなければなりません。
トップレベル要素 networks には追加の文法があって、より詳細な制御を行えるようになっています。
例
基本的な例
以下の例では実行時にネットワーク front-tier と back-tier が生成されて、frontend サービスが front-tier と back-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
attachable を true に設定すると、そのネットワークに対してスタンドアローンコンテナーおよびサービスが接続できるようになります。
スタンドアローンコンテナーがそのネットワークに接続すると、サービスや他のスタンドアローンコンテナーの間での通信が可能となります。
networks:
mynet1:
driver: overlay
attachable: truedriver
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
enable_ipv4 は IPv4 アドレス割り当てを無効にする際に用いられます。
networks:
ip6net:
enable_ipv4: false
enable_ipv6: trueenable_ipv6
enable_ipv6 は IPv6 アドレス割り当てを有効にします。
networks:
ip6net:
enable_ipv6: trueexternal
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: trueipam
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 はデフォルトで外部ネットワークへの接続機能を提供します。
internal を true に設定すると、外部からは独立したネットワークを生成します。
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.project と com.docker.compose.network というラベルを設定します。
name
name はネットワークに対してカスタムな名前を設定します。
name フィールドには、ネットワークを参照するために特殊文字も含めて指定することができます。
name は記述されたものがそのまま用いられるものであり、プロジェクト名によってスコープされるものではありません。
networks:
network1:
name: my-app-netexternal プロパティとともに指定することが可能であり、Compose が必ず用いなければならないプラットフォーム内のネットワークを定義できます。
利用にあたっては通常はパラメーターを用いるので、Compose ファイルでは実行時の特定の値をハードコーディングする必要はありません。
networks:
network1:
external: true
name: "${NETWORK_ID}"さらなる情報
この他の例については Compose におけるネットワーク を参照してください。