コンテナを2つ起動したのに、お互いに通信できない。そんな経験はありませんか。
Dockerのネットワークは、bridge・host・noneという3種類の仕組みを理解すれば迷わなくなります。
この記事では、コンテナ間通信の仕組みからdocker networkコマンドの基本操作、繋がらないときのトラブルシューティングまで、実務での失敗も交えて解説します。
読み終える頃には、ネットワーク周りのエラーに落ち着いて対処できるようになっているはずです。
Dockerネットワークとは?コンテナ間通信の仕組み
Dockerネットワークとは、コンテナ同士やコンテナとホストが通信するための仮想的な通信経路です。
コンテナは通常、ホストOSから隔離された環境で動きます。そのままではコンテナ同士は互いの存在を知りません。
ネットワークという共通の土台を用意することで、初めてコンテナ間の通信が成立します。
なぜコンテナにネットワークが必要なのか
複数のコンテナで1つのアプリケーションを構築する場面は珍しくありません。Webサーバーとデータベースを別コンテナで動かす構成が代表例です。
この場合、WebサーバーのコンテナからデータベースのコンテナへSQLを送る通信経路が必要になります。
ネットワークが無ければ、コンテナはそれぞれ孤立した箱のままです。
Dockerが自動作成する3種類のネットワーク
Dockerをインストールすると、bridge・host・noneという3種類のネットワークが最初から用意されます。
docker network lsコマンドを実行すれば、この3つが確認できます。
何も指定せずにコンテナを起動すると、自動的にbridgeネットワークに接続される仕組みです。
docker network ls
bridgeネットワークの仕組みと使い方
bridgeは、Dockerで最もよく使うネットワークモードです。
コンテナごとに仮想的なIPアドレスが割り当てられ、同じbridgeネットワーク内のコンテナ同士が通信できます。
デフォルトbridgeとカスタムbridgeの違い
Dockerインストール時に自動生成されるbridgeネットワークは「デフォルトbridge」と呼ばれます。
一方、docker network createで自分で作成するネットワークは「カスタムbridge」です。
両者の最大の違いは名前解決の可否にあります。
デフォルトbridgeではコンテナ名での通信ができませんが、カスタムbridgeなら可能です。実務ではほぼ確実にカスタムbridgeを使います。
コンテナ名で通信できる内蔵DNSの仕組み
カスタムbridgeネットワークには、Dockerの内蔵DNSサーバーが組み込まれています。
同じネットワークに参加しているコンテナは、IPアドレスを意識せずコンテナ名だけで相手に到達できます。
たとえばwebコンテナからdbコンテナへ接続する場合、IPアドレスの代わりにdbという名前を指定するだけで済みます。
この仕組みのおかげで、コンテナを作り直してIPアドレスが変わっても、接続先の設定を書き換える必要がありません。
docker network create my-network
docker run -d --name db --network my-network mysql:8
docker run -d --name web --network my-network nginx
host・none・overlayネットワークの使いどころ
bridge以外の2つのモードは、使う場面が限定的です。それぞれの特性を理解しておくと、想定外の挙動に振り回されずに済みます。
hostネットワークが向いている場面
hostネットワークは、コンテナがホストOSのネットワークをそのまま共有するモードです。
ポートマッピング(-pオプション)が不要になり、通信のオーバーヘッドも減ります。
高いパフォーマンスが求められる場面や、ポート番号を細かく制御したい場面に向いています。
ただし複数のコンテナで同じポートを使えなくなる制約があるため、常用には向きません。
noneネットワークを使う理由
noneネットワークは、ネットワーク機能を一切持たないモードです。
外部との通信を完全に遮断したいバッチ処理や、セキュリティ検証用のコンテナで使われます。
用途は限られますが、「外に一切繋げたくない」という要件がある場合の選択肢として覚えておく価値があります。
overlayネットワークが向いている場面(複数ホスト間通信)
overlayは、複数のDockerホストにまたがるコンテナ同士を通信させるモードです。1台のマシン内で完結するbridgeとは異なります。
Docker SwarmやKubernetesのようなクラスタ環境で、複数サーバー上のコンテナを連携させる場面に向いています。
単一ホストでの開発では出番が少ないため、まずbridgeの理解を優先し、複数ホスト構成が必要になった段階で検討すれば十分です。
docker networkコマンドの基本操作
ネットワークの操作はすべてdocker networkコマンドから行います。
確認・作成・削除の3パターンを押さえれば、日常的な作業はほぼカバーできます。
ネットワークの確認(ls・inspect)
docker network lsで存在するネットワークの一覧を確認できます。
特定のネットワークに参加しているコンテナやIPアドレスの詳細を見たい場合は、docker network inspectを使います。
トラブルシューティングの際、まず最初に叩くコマンドです。
docker network ls
docker network inspect my-network
ネットワークの作成・接続(create・connect)
新しいネットワークはdocker network createで作成します。
既に起動しているコンテナを後からネットワークに参加させたい場合はdocker network connectを使います。
コンテナを作り直さずにネットワーク構成を変えられるため、運用中のサービスにも安全に適用できます。
docker network create app-network
docker network connect app-network web
不要なネットワークの削除(rm・prune)
使わなくなったネットワークはdocker network rmで個別に削除できます。
コンテナがどのネットワークにも紐づいていない未使用ネットワークをまとめて掃除したい場合は、docker network pruneが便利です。
開発環境で検証用のネットワークが溜まってきたときに使うと、一気に整理できます。
docker network rm app-network
docker network prune
個人的には、コンテナを1つ起動するだけの検証用途でも、最初からカスタムbridgeを作る運用にしています。
あとから複数コンテナ構成に発展させる場面が多いためです。
最初にデフォルトbridgeで動かしてしまうと、名前解決ができずに構成を作り直す羽目になります。
コンテナ同士が繋がらないときのトラブルシューティング
繋がらない原因の多くは、ネットワーク未接続か名前解決の失敗のどちらかです。順を追って確認すれば、たいてい数分で原因が特定できます。
IPアドレスとDNS名解決を確認する手順
まずdocker network inspectで、両方のコンテナが同じネットワークに参加しているかを確認します。
参加していれば、片方のコンテナからpingやコンテナ名でのアクセスを試し、名前解決ができているかを見ます。
名前解決が失敗する場合は、デフォルトbridgeを使っている可能性が高いです。
デフォルトbridgeは内蔵DNSが働かないため、カスタムbridgeへの切り替えで解決することがほとんどです。
Dockerを初めて触ったときは、コンテナの中に入るという概念自体に戸惑いました。
「コンテナ名で通信できる」と知らずに、IPアドレスをハードコードして毎回動かなくなっていた時期があります。
よくある設定ミスと対処法
実務でよく見る設定ミスを一覧にまとめます。
| 症状 | 原因 | 対処法 |
|---|---|---|
| コンテナ名で繋がらない | デフォルトbridgeを使っている | カスタムbridgeを作成して接続 |
| 外部からアクセスできない | ポートマッピング未設定 | -pオプションでポートを公開 |
| 片方のコンテナだけ繋がらない | ネットワーク未接続 | docker network connectで追加 |
| 起動直後だけ繋がらない | 起動順序の問題 | ヘルスチェックや起動待ちを実装 |
| ネットワーク通信が遅い | overlayやカスタムDNS解決のオーバーヘッド | 同一ホスト内で完結する構成ならbridge、パフォーマンス重視ならhostネットワークを検討 |
Docker Composeでのネットワーク共有設定
docker-compose.ymlで複数サービスを定義すると、Composeが自動的に専用のカスタムbridgeネットワークを作成します。
同じComposeファイル内のサービス同士は、サービス名だけで通信できます。
個別にdocker network createを実行する必要はありません。
既存の外部ネットワークに参加させたい場合は、networksセクションでexternal: trueを指定します。
services:
web:
image: nginx
networks:
- app-network
db:
image: mysql:8
networks:
- app-network
networks:
app-network:
driver: bridge
Dockerネットワークに関するよくある質問
デフォルトbridgeとカスタムbridgeはどちらを使うべきですか?
基本的にはカスタムbridgeを使ってください。コンテナ名での名前解決ができるため、IPアドレスの変動を気にせず運用できます。
1つのコンテナを複数のネットワークに参加させられますか?
できます。docker network connectを複数回実行すれば、1つのコンテナを複数のネットワークに同時に参加させられます。フロントエンド用とバックエンド用でネットワークを分離したい場合に使う手法です。
overlayネットワークとbridgeネットワークの違いは何ですか?
bridgeは1台のDockerホスト内で完結する通信方式です。overlayは複数のDockerホストにまたがるコンテナ同士を通信させる方式です。Docker SwarmやKubernetesのようなクラスタ環境で使います。単一ホストでの開発では、まずbridgeの理解を優先してください。
docker network pruneを実行すると何が消えますか?
どのコンテナにも接続されていない未使用ネットワークだけが削除されます。稼働中のコンテナが参加しているネットワークは対象外なので、通常の運用中に実行しても問題ありません。
ホストマシンのlocalhostでコンテナにアクセスできないのはなぜですか?
コンテナはホストとは別のネットワーク空間で動きます。ポートマッピング(-pオプション)を指定しない限り、ホストのlocalhostからは届きません。-p 8080:80のように、ホスト側ポートとコンテナ側ポートを明示的に紐づける必要があります。
Dockerネットワークは後回しにされがちな設定項目ですが、私は最初のコンテナ起動時点でネットワーク構成を決めるようにしています。
あとからネットワークを繋ぎ直す作業は、コンテナ名やIPアドレスの依存関係を洗い出す手間がかかります。
bridgeの基本を理解して最初から設計したほうが、結果的に早いというのが実感です。
まとめ|Dockerネットワークの要点3つ
最後に、この記事の要点を3つに絞ってまとめます。
- 基本はカスタムbridge:コンテナ名で通信できる内蔵DNSが使える
- 繋がらない時はまずinspect:同じネットワークに参加しているかを確認する
- Composeなら自動化される:サービス名だけで通信できる専用ネットワークが自動生成される
ネットワーク周りのエラーは、原因が分かれば対処は単純です。
コンテナが繋がらなくなったら、まずdocker network inspectで状況を確認するところから始めてみてください。



