🍣

Docker Composeのnetwork_mode解説

に公開

Dockerには複数のネットワークモードがありますが、docker runで利用するだけでなく、Docker Composeファイル(docker-compose.yml)のnetwork_mode設定でも柔軟に制御できます。コンテナ間の通信やホストOSとの通信の方法を、環境やセキュリティ要件に合わせて最適化できるのが大きなメリットです。

  • bridgeモード(デフォルト)
  • hostモード
  • containerモード / serviceモード
  • noneモード

1. bridgeモード(デフォルト)

Dockerではコンテナを起動するとき、特にnetwork_modeを指定しなければ自動的にbridgeモードが使われます。ここではDocker独自のブリッジネットワークが作成され、コンテナはそこに接続されます。

1.1 特徴

  • 隔離環境
    コンテナはホストOSから独立したネットワーク名前空間を持ち、172.x.x.xなどのIPアドレスが割り当てられます。
  • 外部アクセスにはポートフォワーディングが必要
    通常、ホストOSからコンテナにアクセスするために-p 80:80のような形でポートを明示的に公開する必要があります。
  • コンテナ間通信
    同一ブリッジ上にあるコンテナ同士は、コンテナ名やIPアドレスを用いて直接通信が可能になります。

1.2 docker-compose.yml例

version: "3.8"
services:
  app:
    image: nginx:1.27
    ports:
      - "80:80"               # ホストの80番をコンテナの80番にフォワーディング
    networks:
      - default               # デフォルトネットワーク(bridge)を使用

この例では、appサービスをデフォルトのbridgeネットワークに接続した上で、ホストの80番ポートからコンテナの80番ポートに流れるトラフィックを受け取るようにしています。

1.3 イメージ図(Mermaid)

  • HostOS: ホストOS。ここに対してポート80でアクセスを行うと、Dockerのポートフォワーディングによってコンテナが処理を受け取ります。
  • Docker Bridge: デフォルトで作成されるbridgeネットワーク。コンテナには172.18.x.xのようなIPが割り当てられるのが一般的です。

2. hostモード

hostモードを使用すると、コンテナはホストOSと同じネットワーク名前空間を共有します。これは、Dockerをインストールしたホストのネットワーク設定そのものを利用するということです。

2.1 特徴

  • ポートマッピング不要
    ホストとコンテナが同じネットワークスタックを使うため、コンテナのサービスはホストのポートそのものを利用します。
  • ネットワークの隔離がなくなる
    セキュリティの観点やポート競合に注意が必要です。ホストOSの80番ポートをコンテナが直接使う場合、ホスト側で同じポートをすでに使っている別のアプリケーションと競合する可能性があります。
  • パフォーマンス上のメリット
    一部のケースではネットワークのオーバーヘッドが減り、速度が向上することもあります。

2.2 docker-compose.yml例

version: "3.8"
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    network_mode: host
    # portsセクションは不要、無視される

この例では、network_mode: hostを指定するだけで、ホストOSと同じネットワーク環境を共有します。そのため、ホストOSの5432番ポートを直接使用します。

2.3 イメージ図(Mermaid)

  • Windowsなど他の環境からホストOS(WSL2やLinux)に対して5432番ポートでアクセスすると、そのままPostgreSQLに接続できます。
  • ポートマッピング指定 (ports:) は不要であり、設定してもDockerが無視します。

3. containerモード / serviceモード

このモードでは、あるコンテナが別のコンテナとネットワーク名前空間を共有します。Composeにおいてはnetwork_mode: service:<サービス名>という形で指定できます。

3.1 特徴

  • 同じIPアドレス・ポート空間を共有
    複数のコンテナが同一のネットワーク名前空間を使うため、コンテナ間の通信はlocalhost:<port>のように行えます。
  • sidecarパターン
    ログ収集やデバッグ、監視エージェントなど、本来のアプリコンテナとは別の目的で動作するコンテナを「sidecar」として起動するときに有用です。

3.2 docker-compose.yml例

version: "3.8"
services:
  web:
    image: nginx:1.27
    expose:
      - "80"  # 内部通信用のポート公開

  sidecar:
    image: alpine:3.20
    command: ["sh", "-c", "apk add --no-cache curl && tail -f /dev/null"]
    network_mode: service:web
  • network_mode: service:webを指定すると、このsidecarコンテナはwebサービスと同じネットワーク名前空間で動作します。
  • sidecarコンテナは、curl http://localhost:80のようにアクセス可能です。

3.3 イメージ図(Mermaid)

  • websidecarは同一のIPアドレスを共有し、ポート空間も完全に共通となります。
  • sidecarコンテナが停止するとwebコンテナには影響はありませんが、webコンテナが落ちるとそのネットワーク空間も消滅するため、sidecar側でもネットワークが使えなくなる点に注意が必要です。

4. noneモード

noneモードは文字通りネットワークスタックを切り離し、コンテナがまったくネットワークを持たない状態にします。

4.1 特徴

  • 完全にネットワークアクセスを遮断
    内部・外部のいずれとも通信できません。
  • セキュリティ目的
    ネットワークをまったく利用しないバッチ処理や、非常に高いセキュリティが要求される場面で有効です。

4.2 docker-compose.yml例

version: "3.8"
services:
  calc:
    image: python:3.12-slim
    command: ["python", "-c", "print'3.14159'"]
    network_mode: none
  • この場合、calcコンテナはインターネットに一切接続できません。
  • 外部ライブラリをダウンロードする必要がある場合は事前に完了させておきましょう。

4.3 イメージ図(Mermaid)

  • 何のネットワークインターフェースも存在しない状態です。

5. まとめ

Docker Composeでのnetwork_modeは、コンテナのネットワーク設計を簡潔に記述できる非常に強力なオプションです。

モード 記述例 用途 注意点
bridge (指定なし)
networks:
デフォルトモード。多数のユースケース ポート転送をしないとホストOSから到達不可
host network_mode: host WSL2上のDB、軽量コンテナなど ポート競合に注意、隔離がなくなる
container /
service
network_mode: service:<name> sidecarパターン、APMやデバッグ 共有先コンテナが落ちるとネットワーク消失
none network_mode: none バッチ処理、ネット不要のワークロード 外部アクセスが必要な処理には不向き

5.1 選定のポイント

  • セキュリティとパフォーマンスのバランス
    隔離が強いほどセキュリティは高まりますが、パフォーマンスや利便性が犠牲になる場合もあります。
  • ネットワーク競合
    ポートを共有する場合は重複がないか要確認です。
  • 動作確認
    実際にdocker compose up -dしてからdocker ps, ifconfig, netstat などで動作を検証するのがおすすめです。

おわりに

本記事ではDocker Composeのnetwork_modeに焦点をあて、主な4つのモード(bridge、host、container/service、none)について解説しました。
アプリケーションの要件やセキュリティポリシーに応じて、最適なモードを選択することで、安全かつ効率的にコンテナ間通信を管理できます。ぜひプロジェクトで試してみてください!

Discussion