5.1 Dockerのデフォルトブリッジとカスタムブリッジの違い|DNS名前解決まで徹底解説

【第2章】イメージとコンテナの基本操作

Dockerのデフォルトブリッジとカスタムブリッジの違い|DNS名前解決まで徹底解説

第4章まではコンテナ1個を起動する話が中心でした。第5章からはコンテナ同士をつなぐ/外から叩くネットワークの世界に入ります。最初に知っておきたい決定的な違いが「デフォルトブリッジ」と「カスタムブリッジ」です。

結論を先に言うと:本番・開発問わず、常にカスタムブリッジを使うべき。その理由は「コンテナ名で通信できるかどうか」にあります。

💡 この記事のゴール
① Docker がデフォルトで用意する3つのネットワークを把握
② デフォルトブリッジでは「コンテナ名で通信できない」ことを実験で確認
③ カスタムブリッジを作って「コンテナ名で通信できる」ことを確認
④ なぜその違いが生まれるか(自動DNSの有無)を理解

目次

  1. Docker の3つのデフォルトネットワーク
  2. デフォルトブリッジの問題点
  3. カスタムブリッジの作り方
  4. 実験:名前で通信できる/できないを確かめる
  5. なぜこの違いが生まれるのか(自動DNS)
  6. 実務での使い方
  7. まとめ

1. Docker の3つのデフォルトネットワーク

Docker をインストールすると、最初から3つのネットワークが用意されています。

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
abc123...      bridge    bridge    local    ← 今回の主役。-network 指定なしで使われる
def456...      host      host      local    ← ホストのネットワーク名前空間をそのまま使う
ghi789...      none      null      local    ← ネットワーク無効化(lo だけ)
ネットワーク 役割 いつ使う?
bridge デフォルトのNATブリッジ 「何も指定しない」と自動で使われる(非推奨)
host ホストのネットワークを共有 性能最優先・ポート衝突に注意(5-5で詳しく)
none 外部通信なし・loのみ バッチ処理など隔離したいとき

このうち bridge が「デフォルトブリッジ」。一方、自分で docker network create して作るブリッジは「カスタムブリッジ(user-defined bridge)」と呼ばれます。どちらも同じ bridge ドライバを使いますが、挙動は大きく違います。


2. デフォルトブリッジの問題点

一番の問題は:コンテナ名でお互いを呼び出せないことです。

【デフォルトブリッジ:コンテナ名解決なし】
📦 app
172.17.0.2

❌ ping db
📦 db
172.17.0.3

db という名前では解決できない(IPアドレス直打ちしかない)

デフォルトブリッジには自動のDNS名前解決機能がないため、コンテナ A から B に通信したいとき、B のIPアドレスを直接指定する必要があります。IPはコンテナ起動のたびに変わる可能性があるので、実質使い物になりません。

⚠️ 昔は --link があった
Dockerの初期はデフォルトブリッジで docker run --link db:db というオプションで相手のホスト名を解決する仕組みがありました。しかし現在は非推奨。将来削除される可能性があるレガシー機能です。公式ドキュメントも「カスタムブリッジを使ってください」と明言しています。

3. カスタムブリッジの作り方

たった1コマンドです。

$ docker network create mynet
abc123def456...

$ docker network ls
NETWORK ID     NAME     DRIVER    SCOPE
abc123...      bridge   bridge    local
def456...      host     host      local
ghi789...      none     null      local
jkl012...      mynet    bridge    local     ← 新しいカスタムブリッジ

コンテナを起動するときに --network mynet を付けるだけで、このネットワーク上に配置されます。

docker run -d --name app --network mynet nginx
docker run -d --name db  --network mynet postgres:16 -e POSTGRES_PASSWORD=secret

4. 実験:名前で通信できる/できないを確かめる

4-1. デフォルトブリッジでの挙動

# デフォルトブリッジで2つのコンテナを起動
docker run -d --name alpha alpine sleep 3600
docker run -d --name beta  alpine sleep 3600

# alpha から beta へ名前で ping
docker exec alpha ping -c 2 beta
# → ping: bad address 'beta'     ❌ 名前解決できない

# IP で ping すれば通る(確認用)
docker exec alpha ping -c 2 $(docker inspect -f '{{.NetworkSettings.IPAddress}}' beta)
# → 64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.1 ms     ✅ IPならOK

4-2. カスタムブリッジでの挙動

# カスタムブリッジを作る
docker network create mynet

# 同じ mynet 上に2つのコンテナを起動
docker run -d --name alpha --network mynet alpine sleep 3600
docker run -d --name beta  --network mynet alpine sleep 3600

# alpha から beta へ名前で ping
docker exec alpha ping -c 2 beta
# → PING beta (172.18.0.3): 56 data bytes
# → 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.1 ms     ✅ 名前で解決できる🎉
✅ 実証完了
同じ bridge ドライバのネットワークなのに、デフォルト(bridge)とカスタム(mynet)では名前解決の可否が真逆になりました。

4-3. 後片付け

docker rm -f alpha beta
docker network rm mynet

5. なぜこの違いが生まれるのか(自動DNS)

カスタムブリッジだけが、Docker 内蔵の組み込みDNSサーバ127.0.0.11)を使ったコンテナ名の自動解決を提供します。

【カスタムブリッジ:コンテナ内の名前解決】
カスタムブリッジ「mynet」
📦 alpha
/etc/resolv.conf
nameserver 127.0.0.11

━ beta はどこ? ━▶
🔎 Docker内蔵DNS
127.0.0.11
「beta = 172.18.0.3」

↑ 同じ mynet 上のコンテナ名→IP を Docker が自動で応答

各コンテナの /etc/resolv.conf を覗くと、DNSサーバが 127.0.0.11(Docker内蔵DNS)に設定されています。このDNSが、同じカスタムブリッジに参加している他コンテナの名前を IP に解決してくれます。

$ docker exec alpha cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

$ docker exec alpha nslookup beta
Server:		127.0.0.11
Address:	127.0.0.11#53

Non-authoritative answer:
Name:	beta
Address: 172.18.0.3
💡 複数カスタムブリッジ間は隔離
mynet-amynet-b を作り、片方に alpha、もう片方に beta を置くと、alpha は beta を名前でも IP でも参照できません(別ネットワークだから)。逆にこれを使うと、フロントエンド用ネットワークバックエンド用ネットワークを明確に分離できて便利です(5-3で詳しく)。

6. 実務での使い方

「Webアプリ + DB」の典型的な構成をカスタムブリッジで組む例:

# 1. ネットワークを作る
docker network create app-net

# 2. DB(先に起動)
docker run -d --name db --network app-net \
  -e POSTGRES_PASSWORD=secret postgres:16

# 3. アプリ(DBにホスト名「db」で接続)
docker run -d --name app --network app-net \
  -p 3000:3000 \
  -e DATABASE_URL="postgres://postgres:secret@db:5432/postgres" \
  myapp

重要なのは DATABASE_URL=postgres://...@db:5432/... の部分。IPではなくコンテナ名「db」で接続先を指定できています。DB コンテナを再起動しても IP が変わっても、アプリ側の設定はそのまま動きます。

💡 Docker Compose は自動でカスタムブリッジを作る
docker compose up すると、Compose は自動的にプロジェクト専用のカスタムブリッジを作り、全サービスをそこに参加させます。だから compose.yml 内で service 名で通信できるわけです(第6章で詳しく)。内部的には今回学んだ仕組みがそのまま使われています。

7. まとめ

観点 デフォルトブリッジ カスタムブリッジ
名前 bridge 任意(app-net 等)
作成 最初から存在 docker network create
コンテナ名で通信 ❌ 不可 ✅ 可能(自動DNS)
ネットワーク分離 全部同じネット ネットワークごとに分離
推奨度 使わない 常にこれ
✅ 次のステップ
5-2 コンテナ間通信で、今回学んだ自動DNS名前解決の仕組みをもう一段深掘り。複数ネットワークへの参加・エイリアス・依存の扱いを通じて、実戦的なマルチコンテナ構成を組めるようになります。

参考リンク


Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました