Dockerコンテナ通信完全ガイド:bridge、hostネットワークとDNS解決の実践

「WebコンテナからDBコンテナに接続できない… IP直打ちは動くのに…」
Dockerを始めたばかりの人が必ずぶつかる壁、それが**コンテナ間の通信(Networking)**です。
localhostが使えないことはわかった。でも、コンテナ名で指定しても繋がらない。なぜ?
答えは簡単です。デフォルトのネットワークを使っているからです。
この記事では、Dockerネットワークの仕組みを解き明かし、コンテナ同士が「名前」で呼び合える正しい設定方法を解説します。古い--linkコマンドはもう忘れましょう。
なぜデフォルトのbridgeネットワークはダメなのか?
Dockerをインストールすると、自動的にbridgeというネットワークが作られます。何も指定せずにコンテナを起動すると、全員ここに入ります。
docker run -d --name my-db mysql
docker run -d --name my-app node-appしかし、このデフォルトbridgeネットワークには致命的な欠点があります:DNS名前解決機能がありません。
つまり、my-appの中からping my-dbとしても、「unknown host」になります。IPアドレス(例:172.17.0.2)なら繋がりますが、IPアドレスはコンテナを再起動するたびに変わる可能性があります。これでは使えません。
正解:カスタムBridgeネットワークを使う
解決策は非常にシンプル。「自分でネットワークを作る」だけです。
ユーザーが作成したカスタムbridgeネットワークには、自動DNS解決機能が備わっています。これを使えば、コンテナ名がそのままホスト名として使えます。
手順1:ネットワークを作成する
docker network create my-net手順2:コンテナをネットワークに参加させる
# データベース
docker run -d --name db --network my-net mysql
# アプリケーション
docker run -d --name app --network my-net node-app手順3:名前で通信する
これで、appコンテナの中からdbという名前でデータベースにアクセスできます。
# アプリケーションコンテナ内
ping db
# PING db (172.18.0.2): 56 data bytes
# 64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.04 ms魔法のようですが、これがDockerの標準的な使い方です。
Docker Composeなら自動でやってくれる
dockerコマンドを直接叩く場合は手動作成が必要ですが、Docker Composeを使うと、このベストプラクティスがデフォルトで適用されます。
version: '3.8'
services:
web:
image: nginx
db:
image: postgresdocker-compose upを実行すると、Dockerは自動的にプロジェクト名_defaultというネットワークを作成し、全てのサービスをそこに参加させます。
そのため、webコンテナからはdbというホスト名でデータベースにアクセスできます。何も設定しなくても、最初からDNSが効いているのです。これがComposeが推奨される理由の一つです。
その他のネットワークモード
Bridge以外にも、知っておくべきネットワークモードがあります。
Hostネットワーク (--network host)
コンテナのネットワーク隔離を解除し、ホストマシンのネットワークインターフェースを直接共有します。
- メリット:ポートマッピング不要(-p 8080:80とか要らない)、ネットワークオーバーヘッドがない(最速)。
- デメリット:ポートの競合が起きやすい。セキュリティ隔離が弱い。
- 用途:ネットワーク性能がクリティカルな場合や、大量のポートを使う場合。
注意:MacとWindowsのDocker Desktopでは、Hostネットワークモードは期待通りに動作しません(仮想マシン層があるため)。Linux専用と考えてください。
Noneネットワーク (--network none)
ネットワークインターフェースを一切持ちません(localhostのみ)。
- 用途:セキュリティが最優先される、通信を必要としないバッチ処理コンテナなど。
コンテナ間通信のベストプラクティス
- デフォルトbridgeは使わない:必ず
docker network createで作ったカスタムネットワークを使う。 - IPアドレスは使わない:IPは揮発性です。常にコンテナ名(ホスト名)を使う。
- 古い
--link機能は使わない:これはDeprecated(非推奨)機能です。 - Docker Composeを使う:ネットワーク管理が自動化され、ミスが減ります。
結論
コンテナ間通信のトラブルは、ほとんどの場合「名前解決ができない」ことが原因です。
そしてその原因は「デフォルトのbridgeネットワークを使っている」ことです。
今日からは、必ずdocker network createを使うか、Docker Composeを使って、快適な「名前で呼び合える」環境を作りましょう。
Dockerカスタムネットワーク構築フロー
コンテナ名での名前解決を実現するためのカスタムネットワーク作成と接続手順
⏱️ Estimated time: 5 min
- 1
Step1: ネットワークを作成する
コマンド:docker network create <ネットワーク名>
例:docker network create app-net
解説:
• デフォルトのbridgeネットワークではなく、カスタムネットワークを作成します。
• カスタムネットワークには自動DNS解決機能があります。 - 2
Step2: コンテナ起動時にネットワークを指定する
コマンド:docker run --network <ネットワーク名> ...
例:
docker run -d --name mysql-db --network app-net mysql
docker run -d --name my-web --network app-net nginx
解説:
• 作成したネットワークに参加させます。
• --nameで付けたコンテナ名が、DNS名(ホスト名)になります。 - 3
Step3: 接続確認
コマンド:docker exec -it <Webコンテナ名> ping <DBコンテナ名>
例:docker exec -it my-web ping mysql-db
解説:
• コンテナ名でpingが通ることを確認します。
• アプリケーションの設定ファイルでも、DBホスト名としてコンテナ名(mysql-db)を指定できます。
FAQ
なぜコンテナ名でpingしてもunknown hostになるのですか?
解決策:docker network createで新しいネットワークを作るか、Docker Composeを使用してください。
--linkオプションは使ってはいけませんか?
かつてはコンテナを接続するための主要な方法でしたが、現在はカスタムネットワーク機能に置き換えられました。将来のバージョンで削除される可能性があるため、使用すべきではありません。
Docker Composeの場合はどうすればいいですか?
Docker Composeはデフォルトでプロジェクトごとのカスタムネットワークを自動作成します。サービス名(services:の下に書いた名前)がそのままホスト名として使えます。
特別な設定なしで we-app から db にアクセスできます。
ホストマシンのlocalhostに接続したい場合は?
host.docker.internal という特別なホスト名を使用してください(Mac/Windows)。Linuxの場合は--add-host設定が必要です。詳しくは「Dockerコンテナからホストへのアクセス」の記事を参照してください。
2 min read · 公開日: 2025年12月17日 · 更新日: 2026年1月22日
関連記事
Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践

Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践
Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド

Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド
Next.js ユニットテスト実践:Jest + React Testing Library 完全設定ガイド


コメント
GitHubアカウントでログインしてコメントできます