HOWTO · Docker
Docker Compose にネットワーク モードを追加する
この記事では、Docker Compose でネットワーク モードを使用してネットワークを定義および設定する方法について説明します。
このページの内容
Compose ファイルでサービスの network_mode をそのサービスの設定内に記述します。特定のネットワーク名前空間をサービスに使わせたい場合に選択してください。network_mode を省略し、networks もカスタマイズしなければ、Docker Compose はサービスをプロジェクトのデフォルトネットワークに接続します。このネットワークでは、サービス同士がサービス名で通信できます。サービス間通信を有効にするだけなら、独自のネットワークモードは必要ありません。プロジェクトのデフォルトネットワークの動作については、Docker の Compose ネットワーキングガイドを参照してください。
Compose サービスで使う Docker ネットワークモードを選ぶ
サービスが使用するネットワーク名前空間に応じて、モードを選びます。
bridgeは Docker 組み込みのデフォルトブリッジネットワークを使います。名前付きネットワークや、Compose プロジェクトのデフォルトネットワークを選択するものではありません。サービスを名前付き Compose ネットワークに接続する場合は、代わりにnetworksを設定します。hostは、対応環境ではホストのネットワーク名前空間を共有するため、サービスのネットワーク分離が変わります。noneはサービスのネットワークを無効にします。service:<service-name>は、別の Compose サービスのネットワーク名前空間を共有します。container:<container-name-or-id>は、Docker コンテナを参照します。
これらのモードでは、接続性と分離の動作がそれぞれ異なります。特に、同じサービスに network_mode と networks を設定しないでください。Compose では、互いに排他的なオプションとして扱われます。Compose サービスのリファレンスでは network_mode が説明され、サービスの networks リファレンスでは別のネットワーク接続設定が説明されています。以下の例は設定構文を示すもので、Docker エンジンでの実行確認はされていません。
Docker Compose で network_mode を設定する
サービスのエントリー内に network_mode を置き、モードの値か参照形式のいずれかを指定します。たとえば、app というサービスでホストモードを使う場合、インデントした services:、 app:、 network_mode: host の各行で表せます。実際の Compose ファイルではインデントを保ち、イメージなど、そのサービスに必要なほかの設定も追加してください。
次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
service = "app"
mode = "host"
print(f"services:\n {service}:\n network_mode: {mode}")
services:
app:
network_mode: host
host は、用途に応じて bridge、none、service:<service-name>、または container:<container-name-or-id> に置き換えます。山括弧で囲まれた部分はプレースホルダーです。service: の後には実際の Compose サービス名を、container: の後にはコンテナ名または ID を指定します。たとえば service:api は api という名前のサービスを参照します。Docker ネットワーク名や ID は、どちらの参照にも使えません。
docker network ls は Docker ネットワークとその名前、IDを一覧表示します。コンテナや Compose サービスは一覧表示しないため、その出力から service: や container: に指定する値は分かりません。利用可能なネットワークの確認に使い、サービスやコンテナの識別子の検索には使わないでください。上記の形式では、ネットワーク名や ID だけでは network_mode の参照になりません。
network_mode を有効にする目的だけで、Compose のトップレベルに version を追加する必要はありません。現在の Compose のバージョンと名前に関するリファレンスでは、トップレベルの version フィールドは非推奨と説明されています。Compose は、サポートする Compose 形式に基づいてファイルを検証します。
Docker Swarm のネットワーキングを考慮する
上記の Compose サービス設定と Swarm サービスのネットワーキングは、別々の設定方法です。ここで示す Swarm のパターンでは、サービスを networks キーで接続し、既存のネットワークを外部ネットワークとして宣言します。Compose 構文では、サービスの app: networks: [host] のようなエントリーと、host を指定して external: true を設定するトップレベルの networks エントリーを使います。host は実際の外部ネットワーク名に置き換えてください。これはサービスをネットワークに接続する設定です。networks と network_mode が相互に置き換え可能であることや、そのネットワークがあらゆるモードに対応することを示すものではありません。Compose ネットワーキングガイドでは Compose のネットワーク接続が説明されています。外部ネットワークを参照する前に、デプロイ環境の Swarm 設定でネットワークを作成するか、既存のものを確認してください。
選択したネットワークモードを確認する
Compose ファイルを見直し、network_mode が対象のサービス内に置かれていること、値が適切なモード形式であること、参照するサービスやコンテナが実行環境に存在することを確認します。Swarm の場合は、外部ネットワークが存在し、サービスの networks に正確な名前が指定されていることを確認してください。docker network ls は実行した Docker ホスト上のネットワーク名と ID を表示できますが、Compose ファイルの妥当性や、サービス間の通信可否までは検証しません。この記事では、これらの設定を稼働中の Docker 環境でテストしたとは述べていません。