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)
-
web
とsidecar
は同一の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