Dockerのデフォルトブリッジとカスタムブリッジの違い|DNS名前解決まで徹底解説
第4章まではコンテナ1個を起動する話が中心でした。第5章からはコンテナ同士をつなぐ/外から叩くネットワークの世界に入ります。最初に知っておきたい決定的な違いが「デフォルトブリッジ」と「カスタムブリッジ」です。
結論を先に言うと:本番・開発問わず、常にカスタムブリッジを使うべき。その理由は「コンテナ名で通信できるかどうか」にあります。
① Docker がデフォルトで用意する3つのネットワークを把握
② デフォルトブリッジでは「コンテナ名で通信できない」ことを実験で確認
③ カスタムブリッジを作って「コンテナ名で通信できる」ことを確認
④ なぜその違いが生まれるか(自動DNSの有無)を理解
目次
- Docker の3つのデフォルトネットワーク
- デフォルトブリッジの問題点
- カスタムブリッジの作り方
- 実験:名前で通信できる/できないを確かめる
- なぜこの違いが生まれるのか(自動DNS)
- 実務での使い方
- まとめ
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. デフォルトブリッジの問題点
一番の問題は:コンテナ名でお互いを呼び出せないことです。
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)を使ったコンテナ名の自動解決を提供します。
各コンテナの /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-a と mynet-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 up すると、Compose は自動的にプロジェクト専用のカスタムブリッジを作り、全サービスをそこに参加させます。だから compose.yml 内で service 名で通信できるわけです(第6章で詳しく)。内部的には今回学んだ仕組みがそのまま使われています。
7. まとめ
| 観点 | デフォルトブリッジ | カスタムブリッジ |
|---|---|---|
| 名前 | bridge |
任意(app-net 等) |
| 作成 | 最初から存在 | docker network create |
| コンテナ名で通信 | ❌ 不可 | ✅ 可能(自動DNS) |
| ネットワーク分離 | 全部同じネット | ネットワークごとに分離 |
| 推奨度 | 使わない | 常にこれ |
5-2 コンテナ間通信で、今回学んだ自動DNS名前解決の仕組みをもう一段深掘り。複数ネットワークへの参加・エイリアス・依存の扱いを通じて、実戦的なマルチコンテナ構成を組めるようになります。
参考リンク
- Bridge network driver(Docker公式) — ブリッジネットワークの一次情報源。
- Networking with standalone containers(公式チュートリアル) — カスタムブリッジを作って2コンテナ接続する公式例。



コメント