header image

枝折

Docker のネットワークドライバーについて

Container

CREATED: 2026 / 04 / 29 Wed

UPDATED: 2026 / 04 / 29 Wed

Docker のネットワークドライバー(bridge / host / none)について。

Docker のネットワークドライバー

Docker はコンテナのネットワーク接続を管理するために「ネットワークドライバー」という仕組みを使っています。 どのドライバーを使うかによって、コンテナがホストや他のコンテナとどう通信するかが変わってくるのですが、ここでは bridgehostnone を中心に触れます。

ネットワーク機能(networking) の概要

bridge

bridge は Docker のデフォルトのネットワークドライバーです。 コンテナを起動するときに --network を指定しなければ自動的に bridge ネットワークに接続されます。

bridge ネットワークではホスト上にプライベートな仮想ネットワークが作られ、そこにコンテナが接続されます。 コンテナ同士は IP アドレスで通信することができますが、ユーザー定義の bridge ネットワークを利用する場合はコンテナ名で通信することもできます。

また、動的ポートマッピングに対応しており、コンテナ側のポートは固定しつつホスト側のポートをランダムに割り当てることができます。 これにより、同じポートを使うコンテナを同一ホスト上で複数同時に起動することができます。

デフォルト bridge とユーザー定義 bridge の違い

Docker を起動するとデフォルトの bridge ネットワークが作られます。 これとは別に、docker network create で作成したユーザー定義の bridge ネットワークがあります。

これらの一番大きな違いは名前解決です。 ユーザー定義 bridge ではコンテナ名による自動 DNS 解決がサポートされており、同じネットワークに所属しているコンテナにはコンテナ名でアクセスできます。 一方、デフォルト bridge ではこの DNS 解決がサポートされておらず、コンテナ名でアクセスするには --link オプションが必要でした(現状 deprecated の機能)。

bridge ネットワークでの名前解決

前述の通り、ユーザー定義 bridge ではコンテナ名による名前解決が自動で機能します。

# ユーザー定義 bridge ネットワークを作成
docker network create my-network

# コンテナを起動してネットワークに接続
docker run -d --name app --network my-network my-app-image
docker run -d --name db --network my-network postgres

この状態だと app コンテナの中から db という名前でデータベースに接続することができます。 コンテナの ID アドレスは再起動時などに変動するため、いちいち IP アドレスをハードコーディングせずとも、コンテナ名を使って通信先を特定することができます。

デフォルト bridge でも --link を使えばコンテナ名で通信できましたが、基本的に名前解決させたい場合は bridge を使えば良いです。

bridge ネットワークと L2 スイッチ

Docker の bridge ネットワークは、内部的に Linux の仮想ブリッジ(デフォルトは docker0)として実装されています。 この仮想ブリッジは L2 スイッチとして動作します。

L2 スイッチは OSI 参照モデルのデータリンク層(L2)で動作するネットワーク機器で、MAC アドレスを基に通信先を決定します。

Docker では各コンテナに veth ペア(仮想 Ethernet インターフェース)が割り当てられ、これによりコンテナ側の eth0 とホスト側の docker0 ブリッジが接続されます。 同じ bridge ネットワーク上のコンテナ間の通信は、この docker0 が MAC アドレスをもとに L2 レベルで転送します。

コンテナA (eth0) <--veth--> [docker0 (L2 bridge)] <--veth--> コンテナB (eth0)

異なるネットワーク間の通信は iptables によるルーティング(L3)が介在しますが、同一 bridge 内であればパケット転送は L2 スイッチで行われます。

host

host ドライバーを使うと、コンテナはホストのネットワークを共有します。 つまり、コンテナとホストのネットワーク名前空間が同一になる、ということです。

docker run --network host nginx

これを実行すると nginx はポートのマッピング(-p)なしにホストの 80 番ポートで直接通信を受け付けます。 なので、この状態で別の 80 番ポートのサーバーをホストで起動すると、競合が発生します。

none

none はその名の通り、コンテナに一切のネットワークインターフェースを持たせないドライバーです。

docker run --network none alpine

コンテナは完全にネットワーク的に孤立した状態になります。 ネットワークアクセスが不要なバッチ処理や、セキュリティ上の理由で外部との通信を一切させたくない場合に使えます。

Docker Compose でのネットワーク設定

Docker Compose を使うと、プロジェクトごとに自動でユーザー定義 bridge ネットワークが作成されます。 同じ docker-compose.yml に定義されたサービスは特に設定しなくてもサービス名で互いに通信できるようになります。

services:
  app:
    build: .
    ports:
      - '3000:3000'
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: password

この場合、app サービスから db というホスト名でデータベースに接続できます。 自動で各サービス名がホスト名となります。

また、ネットワークを明示的に定義することもできます。

services:
  app:
    build: .
    ports:
      - '3000:3000'
    networks:
      - frontend
      - backend
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: password
    networks:
      - backend
  nginx:
    image: nginx:alpine
    ports:
      - '80:80'
    networks:
      - frontend

networks:
  frontend:
  backend:

こんな感じで複数のネットワークを定義して、サービスごとに接続するネットワークを分けることができます。 appfrontendbackend 両方に接続していて、dbbackend にしか接続していないので nginx から直接 db に通信することはできません。

を仕舞い

参考資料📕 Docker コンテナ・ネットワークの理解 ネットワーク機能(networking) の概要 Docker ブリッジネットワークの使用 — Docker-docs-ja ドキュメント Dockerのネットワークを理解する | さくらのナレッジ レイヤ2(L2)スイッチとは?概要やL3スイッチとの違いなどを解説 L2スイッチとL3スイッチの基本知識

おまけ: Amazon ECS のネットワークモード

Amazon ECS でタスクを起動するときにもネットワークモードを指定します。 ECS のタスク定義では networkMode として bridgehostawsvpcnone が選べます。

bridgehostnone は ECS on EC2 でのみ使えるモードです。 awsvpc は EC2 と Fargate の両方に対応しており、AWS が推奨するモードです。

awsvpc

タスクごとに ENI(Elastic Network Interface)が割り当てられ、VPC 内のプライベート IP アドレスと DNS 名が付与されます。 EC2 インスタンスと同等のネットワーク設定をタスク単位で持てるので、Security Group でタスクレベルの細かいアクセス制御ができます。 Fargate では awsvpc のみ対応しているため、事実上の標準モードです。

bridge

Docker の bridge ネットワークと同じ仕組みで、EC2 インスタンス上の仮想ネットワーク(docker0)を経由してコンテナが通信します。 複数タスクが同じポートを使いたい場合は、動的ポートマッピング(ホスト側ポートをランダム割り当て)で対応します。 docker0 を経由するぶんだけオーバーヘッドが発生するので、パフォーマンス面では hostawsvpc に劣ります。

host

コンテナがホスト EC2 インスタンスのネットワークスタックをそのまま使います。 Docker の host ドライバーと同じで、コンテナのポートが EC2 の ENI に直接マッピングされます。 bridge であれば docker0 が動的ポートマッピングでホスト上に同一ポートを開放するコンテナを複数建てることができますが、host の場合はそれができません。 host の場合、タスク定義に hostPort を明示的に指定する必要があり、動的ポートマッピングを行うことができません。 それゆえ、同一ホストで同じタスクを複数起動するとポート競合が起きてスケールアウトが難しくなります。

none

ECS でもネットワーク接続なしのモードが使えます。外部との通信が一切不要なバッチ処理などに使います。

参考資料📕 タスクネットワーク - Amazon ECS 開発者ガイド Amazon ECSのネットワークモードをまとめてみた