Docker環境で複数のコンテナ(Webサーバー、データベース、キャッシュサーバーなど)を構築する際、「コンテナ同士をどのように通信させるか」「外部からの接続と内部通信をどう分けるか」といったネットワーク設計が非常に重要になります。
Dockerにはコンテナ間の通信分離や接続管理を行うためのdocker networkコマンドが用意されています。本記事では、docker networkの基本操作からネットワークドライバー(bridge, host, noneなど)の違い、コンテナ名による自動名前解決(DNS機能)の仕組み、トラブルシューティングまでを分かりやすく解説します。
1. docker network コマンドの基本と主要操作一覧
docker networkは、Docker環境におけるネットワークの作成、確認、コンテナの接続・切断、削除などを管理する基底コマンドです。
基本構文は以下の通りです。
docker network [サブコマンド] [オプション]
実務で頻繁に使用する主要なサブコマンドを一覧表にまとめました。
| コマンド | 説明 |
|---|---|
docker network ls |
作成されているネットワークの一覧を表示する |
docker network create <ネットワーク名> |
新しいネットワークを作成する(規定はbridgeドライバー) |
docker network inspect <ネットワーク名> |
ネットワークのIPアドレス範囲や接続中のコンテナ詳細を表示する(JSON形式) |
docker network connect <ネットワーク名> <コンテナ名/ID> |
実行中のコンテナを既存のネットワークに接続する |
docker network disconnect <ネットワーク名> <コンテナ名/ID> |
コンテナをネットワークから切断する |
docker network rm <ネットワーク名> |
指定したネットワークを削除する(使用中コンテナが存在する場合はエラー) |
docker network prune |
どのコンテナからも参照されていない未使用ネットワークを一括削除する |
2. Dockerのネットワークドライバーの種類と特徴
Dockerでは用途に合わせて複数のネットワークドライバー(Network Drivers)を選択できます。docker network lsを実行すると、初期状態でも3つの標準ネットワークが確認できます。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
334a894f8a82 bridge bridge local
8c5349fa73a4 host host local
fa74dbd741c2 none null local
2.1 bridge(ブリッジネットワーク)
単一のホスト(Dockerホスト)上で動作するコンテナ間のデフォルトの通信方式です。ホストOS上に仮想のネットワークブリッジ(docker0など)を作成し、そこに各コンテナが仮想NICを接続する仕組みです。
【重要】デフォルト bridge と ユーザー定義 bridge の違い
Dockerには、最初から用意されている「デフォルトbridge」と、ユーザーがdocker network createで手動作成する「ユーザー定義(カスタム)bridge」の2種類があり、重要な違いがあります。
- デフォルト bridge (
bridge): コンテナ起動時にネットワークを指定しない場合に使われます。IPアドレスでの通信は可能ですが、コンテナ名によるDNS名前解決機能が利用できません。 - ユーザー定義 bridge (
docker network create my-net): 組み込みDNSサーバーが有効化され、コンテナ名(例:http://db-server:5432)で相互に名前解決して通信できます。実務開発ではこちらを利用するのがベストプラクティスです。
2.2 host(ホストネットワーク)
コンテナのネットワークを隔離せず、Dockerホストマシンのネットワークインターフェースを直接共有します。
- ネットワークオーバーヘッドがなくなるため通信パフォーマンスが最高になります。
- コンテナ内で起動したポート(例: 8080)が、ホストマシンの8080ポートとして直接公開されます。
- 注意点として、同じホスト上で同じポートを使うコンテナを複数起動しようとするとポート衝突エラーになります。また、Linuxでのみフル機能がサポートされます。
2.3 none(ネットワーク完全隔離)
コンテナにループバック(127.0.0.1)以外のネットワークインターフェースを与えず、完全な隔離状態にします。
- 外部や他コンテナとの通信を一切遮断したいバッチ処理やセキュリティ試験用コンテナなどで利用されます。
2.4 overlay / macvlan(高度なネットワーク)
- overlay: 複数のDockerホスト間に跨がる暗号化ネットワークを構築します。Docker SwarmやKubernetes等のマルチホスト環境で使用されます。
- macvlan: コンテナに実際の物理ネットワーク上のMACアドレスを割り当て、直接既存の物理LANに参加させるドライバーです。
3. 【実践】docker networkを使ったコンテナ間通信の構築手順
実際にカスタムネットワークを作成し、2つのコンテナ間でコンテナ名を使って名前解決・通信を行う手順を紹介します。
ステップ1: ユーザー定義ネットワークを作成する
docker network createコマンドで、app-netという名前のカスタムbridgeネットワークを作成します。
$ docker network create app-net
e9452d6a7890abcdef1234567890123456789012345678901234567890abcdef
ステップ2: ネットワークを指定してコンテナを起動する
--network app-netオプションを付けて、2つのコンテナ(db-containerとweb-container)を起動します。
# データベースコンテナの起動例
$ docker run -d --name db-container --network app-net alpine sleep 3600
# Webアプリケーションコンテナの起動例
$ docker run -d --name web-container --network app-net alpine sleep 3600
ステップ3: コンテナ名で名前解決・通信ができるか確認する
web-containerの内部に入り、pingコマンドを使ってdb-containerへ通信できるか確認します。
$ docker exec -it web-container ping -c 3 db-container
PING db-container (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.082 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.065 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.061 ms
--- db-container ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
IPアドレスではなく「db-container」というコンテナ名だけで正常に通信が成立していることが確認できます。
ステップ4: 既存コンテナのネットワーク接続・切断
すでに起動しているコンテナを途中でネットワークに接続・切断したい場合は、connect / disconnectを使用します。
# 既存コンテナをapp-netに追加接続
$ docker network connect app-net my-existing-container
# app-netから切断
$ docker network disconnect app-net my-existing-container
4. ポートマッピング(-p)と docker network の役割の違い
Docker初心者の方が混同しやすいのが「ポートマッピング(-p 8080:80)」と「docker network」の使い分けです。
| 項目 | ポートマッピング (-p / --publish) |
docker network (内部ネットワーク) |
|---|---|---|
| 目的 | ホストPC外部やブラウザからコンテナへアクセスする | コンテナ同士が内部で安全に高速通信する |
| 通信経路 | 外部クライアント → ホストポート → コンテナポート | コンテナA → (仮想ブリッジ/DNS) → コンテナB |
| セキュリティ | 外部に公開されるため適切な firewall/認証が必要 | 外部非公開(Dockerホスト内部に閉じた通信)が可能 |
例えば、データベース(PostgreSQLやMySQL)は外部インターネットにポートを直接晒さず、docker network内でのみWebサーバーコンテナからのアクセスを許可する構成が安全です。
5. Docker Compose でのネットワーク定義方法
docker-compose.ymlを使用する場合、ネットワークの作成とコンテナへの割当は自動的・宣言的に行えます。
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
networks:
- frontend-net
- backend-net
db:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: secretpassword
networks:
- backend-net
networks:
frontend-net:
driver: bridge
backend-net:
driver: bridge
上記のように設定すると、webサービスはfrontend-netとbackend-netの両方に所属し、dbサービスはbackend-netにのみ所属するため、外部アクセス用Webサーバーと隔離された内部データベースを簡単に構築できます。
6. よくあるトラブルと対処法
6.1 コンテナ同士で名前解決やPingが届かない
【原因】 デフォルトの bridge ネットワークでコンテナを起動していませんか?
【対処法】 デフォルト bridge ではDNS名前解決機能が機能しません。docker network create my-net でカスタムネットワークを作成し、--network my-net を指定してコンテナを再起動するか、docker network connect my-net <container> で追加接続してください。
6.2 ネットワーク削除時エラー: network has active endpoints
【原因】 ネットワーク内にまだ稼働中・停止中のコンテナが接続されています。
【対処法】 docker network inspect <net-name> で接続中のコンテナを確認し、docker network disconnect -f <net-name> <container> またはコンテナ本体を削除(docker rm -f)してからネットワークを削除(docker network rm)します。
6.3 未使用のネットワークが一括削除できない
定期的な開発作業で溜まった不要なネットワークを一括クリーンアップするには、docker network prune コマンドを実行します。
$ docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
test-net-1
test-net-2
7. よくある質問(FAQ)
Q1. デフォルトの bridge ネットワークでコンテナ名指定の通信が失敗するのはなぜですか?
デフォルトの bridge ネットワークは互換性維持のために残されており、自動DNSサーバー機能が無効化されています。コンテナ名での通信を行うには、必ず docker network create でユーザー定義のカスタムネットワークを作成して利用してください。
Q2. コンテナに複数のネットワークを同時に割り当てることは可能ですか?
はい、可能です。docker network connect コマンドを複数回実行するか、Docker Composeの networks: リストに複数ネットワークを指定することで、1つのコンテナに複数のNICを持たせることができます。
Q3. docker network inspect コマンドで確認すべき重要情報は何ですか?
"Subnet"(IPネットワーク範囲)、"Gateway"(ルーターIPアドレス)、および "Containers" 内にリスティングされている接続中コンテナごとの個別の "IPv4Address" や "MacAddress" です。
8. まとめと関連記事
docker networkコマンドを活用することで、コンテナ間の通信分離や安全な名前解決、マルチコンテナ構成の設計が容易になります。
基本となるポイントを復習しておきましょう。
- コンテナ同士で通信する場合は
docker network createでカスタムネットワークを作成する --networkオプションでコンテナを接続すれば、コンテナ名で自動名前解決ができる- ホスト外部への公開にはポートマッピング(
-p)、内部通信にはdocker networkを使い分ける

コメント