T-CREATOR

Dockerネットワークの仕組みと使い方:bridge / host / overlayの違いとは?

Dockerネットワークの仕組みと使い方:bridge / host / overlayの違いとは?

Dockerで複数のコンテナを連携させるには、ネットワークの仕組みを理解することが重要です。

ネットワークモードの選定次第で、セキュリティ、パフォーマンス、スケーラビリティに大きな影響を与えるため、ぜひ使い分けの知識を習得しておきたいところです。

Dockerネットワークの基礎知識

Dockerは、コンテナ間通信や外部アクセスの方法を制御するために独自の仮想ネットワークを提供しています。

Dockerインストール直後には、以下のようなネットワークが自動で生成されます:

ネットワーク名ドライバー説明
bridgebridgeデフォルトの仮想ネットワーク。複数コンテナ間で通信可能
hosthostホストOSのネットワークと共有(Linux限定)
nonenullネットワーク無し
overlayoverlay複数ホスト間にまたがる分散ネットワーク(Swarm専用)

以下で主要な3種類について詳しく解説していきます。

bridgeネットワークの仕組みと使い方

bridge はDockerのデフォルトネットワークで、もっともよく使われるモードです。

同一ホスト内で複数のコンテナをつなぎたいときに便利で、名前解決やポートフォワーディングにも対応しています。

特徴

  • ホストとは独立した仮想ネットワーク上で動作
  • docker run 時のポート指定が必要(例:-p 8080:80
  • カスタムブリッジネットワークならコンテナ名解決が可能

デフォルトのbridgeとカスタムbridgeの違い

項目デフォルトbridgeカスタムbridge
名前解決不可可能(コンテナ名で通信)
IP範囲固定自由に設定可能
セキュリティ設定固定ファイアウォールルール追加可能

デフォルトbridgeの例

bashdocker run -d --name web1 -p 8080:80 nginx
docker run -d --name web2 -p 8081:80 nginx

これはホストマシンのポート8080と8081を、それぞれ2つのnginxコンテナにバインドします。ただし、web1からweb2へはIP直打ちでしか通信できません。

カスタムbridgeネットワークの作成と接続

bashdocker network create \
  --driver bridge \
  my_custom_bridge

このネットワーク上に2つのコンテナを起動します。

bashdocker run -d --name web1 --network my_custom_bridge nginx
docker run -d --name web2 --network my_custom_bridge nginx

この状態では、web1 コンテナから web2curl http://web2 のように名前解決が可能となります。

ポートフォワーディングと外部アクセス

bashdocker run -d --name web --network my_custom_bridge -p 8080:80 nginx

このように -p オプションを指定することで、ホスト側から http://localhost:8080 でアクセス可能になります。

ブリッジネットワークの確認

以下のコマンドでネットワークの一覧が確認できます:

bashdocker network ls

詳細情報を確認したい場合は:

bashdocker network inspect my_custom_bridge

不要になったネットワークの削除

bashdocker network rm my_custom_bridge

hostネットワークの仕組みとユースケース

host ドライバーは、コンテナがホストマシンと同じネットワーク空間を共有する特殊なモードです。

特にパフォーマンスを最重視する場合や、特定のポートバインディングの回避が必要なケースで活用されます。

特徴

  • ホストのIPアドレスをそのまま使用
  • ポートバインドが不要(-p なしでそのまま公開される)
  • Linux環境専用(macOS/Windowsでは機能しません)
  • 他のコンテナとは分離されており、名前解決は不可

利用例

以下はhostネットワークモードを使ったnginxの起動例です。

bashdocker run -d --name host-nginx --network host nginx

この場合、localhost:80 にアクセスすることでnginxに接続できます。

注意点

  • 他のサービスとポート競合するリスクがある
  • ネットワークの分離性がなくなるためセキュリティリスクが高い

適したケース

ユースケース理由
モニタリングツールホストのすべてのネットワークインターフェースにアクセスできるため
VPNやネットワークゲートウェイ複雑なルーティング設定が不要
レガシーなポート要件を持つアプリケーションNAT変換を省略できる

詳しくは公式ドキュメントをご参照ください:host network driver


overlayネットワークの仕組みと使い方

overlay は、複数のDockerホスト間でコンテナを接続するための分散型ネットワークです。

Docker Swarm(またはDocker Enterprise)モードでのみ使用でき、クラスタ全体での通信を実現します。

特徴

  • 異なるホスト上のコンテナ間で通信可能
  • 暗号化されたVXLANトンネルを利用
  • Swarmモードでのサービスディスカバリが自動化されている
  • セキュアなマルチホスト構成に最適

準備:Swarmクラスタの初期化

まずSwarmモードを初期化します。

bashdocker swarm init

overlayネットワークの作成

bashdocker network create \
  --driver overlay \
  --attachable \
  my_overlay_net

--attachable をつけることで、サービスだけでなく単独のコンテナもネットワークに接続可能になります。

サービスのデプロイ

bashdocker service create \
  --name web \
  --network my_overlay_net \
  -p 8080:80 \
  nginx

この例では、Swarmノード群のいずれかにアクセスすれば、適切にサービスへルーティングされます。

マルチホストでの通信例(2ノード以上)

ホスト名コンテナ名ネットワーク
hostAapp-amy_overlay_net
hostBapp-bmy_overlay_net

これらは ping app-b によって相互に名前解決と通信が可能です。

セキュリティ対策

overlayネットワークはTLSと暗号化によって保護されており、安全な分散通信を実現しています。

公式ドキュメントでも高く推奨されております:overlay network driver


ネットワーク戦略の選定指針

使用目的推奨ネットワークモード
同一ホストで複数コンテナ通信bridge
シンプルなシングルコンテナ公開host
マルチホスト構成overlay
外部ネットワークアクセスを遮断したいnone

用途に応じて適切なネットワークを選ぶことで、セキュリティとパフォーマンスのバランスを最適化できます。


実践Tipsと注意点

DNS名前解決ができない?

デフォルトのbridgeでは名前解決が効かないため、カスタムネットワークの利用が推奨されます。

bashdocker network create --driver bridge mynet

コンテナ間通信ができない?

ファイアウォール設定やホストのネットワークポリシー(特にAWSやGCP)を確認する必要があります。

Swarmでoverlayが動かない?

以下の項目を確認してください:

  • docker swarm init を実行したか
  • 複数ノード間で --advertise-addr を適切に指定したか
  • ポート 2377, 7946, 4789 が開放されているか

まとめ

Dockerのネットワーク機能は非常に柔軟で、適切に使い分けることで、開発効率・運用効率・セキュリティすべてを高めることが可能です。

モード特徴主な用途
bridge仮想ネットワークでの通信同一ホスト内のマイクロサービス連携
hostホストのネットワークを共有パフォーマンス重視、特殊アプリ
overlay複数ホスト間通信Docker Swarmクラスタの構築

より詳しくはDocker公式ドキュメントのネットワークガイドをご参照ください:

公式ドキュメントリンク

記事Article

もっと見る