Docker: Docker ネットワークのきほん
最終更新:2026-08-26
Docker のコンテナネットワークはむずかしくみえますが、「それぞれのコンテナにべつの localhost がある」とわかればシンプルです。
1. まなべること
- 4 つのネットワークモードのちがい
- カスタムブリッジネットワークと DNS
- コンテナどうしがつうしんするしくみ
- ネットワークぶんりのポリシー
- ポートフォワーディングのしくみ
2. デベロッパーのじつわ
(1) こまりごと: コンテナから localhost でせつぞくできない
Alice の Web アプリとデータベースはべつのコンテナでうごいています。Web コンテナから localhost:5432 をつかってもデータベースへせつぞくできません。「データベースは 5432 ポートでまっているのに、なぜつながらないのか」と 2 じかんなやみました。
(2) コンテナネットワークぶんりによるかいけつ
Bob は「それぞれのコンテナにはべつの localhost がある。Web コンテナの localhost は Web アプリじしんで、データベースではない。コンテナめいかカスタムネットワークをつかおう」とせつめいしました。
BASH
# コンテナかんつうしんようのカスタムネットワークをさくせい
docker network create app-net
# おなじネットワークでコンテナをかいし
docker run -d --name db --network app-net -e POSTGRES_PASSWORD=secret postgres:15
docker run -d --name web --network app-net -p 8080:5000 myapp
# Web は localhost:5432 ではなく db:5432 へせつぞく
(3) メリット: 2 じかんのトラブルが 5 ふんでかいけつ
コンテナネットワークのモデルをりかいした Alice は、これまで 2 じかんかかっていたもんだいを 5 ふんでかいけつできました。
3. Docker の 4 つのネットワークモード
(1) モードのぜんたいぞう
graph TB
subgraph Bridge["ブリッジモード (デフォルト)"]
B1["コンテナ A<br/>172.17.0.2"] --- B2["docker0 ブリッジ<br/>172.17.0.1"]
B2 --- B3["コンテナ B<br/>172.17.0.3"]
B2 --- B4["ホスト eth0<br/>NAT をけいゆ"]
end
subgraph Host["ホストモード"]
H1["コンテナ"] --- H2["ホストのネットワークスタック<br/>すべてのポートをきょうゆう"]
end
subgraph None["none モード"]
N1["コンテナ<br/>ループバックのみ"]
end
subgraph Overlay["overlay モード"]
O1["コンテナ A<br/>ホスト 1"] -.- O2["コンテナ B<br/>ホスト 2"]
end
(2) 4 つのモードをくらべる
| ひかくこうもく | ブリッジ | ホスト | なし | overlay |
|---|---|---|---|---|
| ぶんり | せんようネットワークスタック | ホストネットワークをきょうゆう | かんぜんにぶんり | ホストをまたぐかそうネットワーク |
| ポートフォワーディング | -p がひつよう |
ふよう | つかえない | ルーティングをないぞう |
| パフォーマンス | ふつう (NAT のオーバーヘッド) | たかい | - | ふつう (VXLAN カプセルか) |
| DNS | カスタムブリッジだけ | なし | なし | ✅ ないぞう |
| ホストをまたぐ | ❌ | ❌ | ❌ | ✅ |
| ユースケース | 1 だいでマルチコンテナ | こうそくなネットワーク | セキュリティぶんり | Docker Swarm クラスタ |
4. ブリッジネットワークのくわしいしくみ
(1) デフォルトブリッジとカスタムブリッジ
| ひかくこうもく | デフォルトブリッジ | カスタムブリッジ |
|---|---|---|
| DNS | ❌ IP アドレスだけ | ✅ コンテナめいでつうしん |
| コンテナぶんり | すべてがおなじネットワーク | ネットワークごとにぶんり |
| おすすめど | ⭐ | ⭐⭐⭐ |
| つくりかた | Docker がじどうさくせい | docker network create |
▶ サンプル: カスタムブリッジネットワークをつくる (むずかしさ: ⭐)
BASH
# カスタムブリッジネットワークをさくせい
docker network create --driver bridge app-net
# かくにん
docker network ls | grep app-net
docker network inspect app-net
▶ サンプル: コンテナかんの DNS (むずかしさ: ⭐⭐)
BASH
# おなじカスタムネットワークで 2 つのコンテナをかいし
docker run -d --name db --network app-net \
-e POSTGRES_PASSWORD=secret postgres:15-alpine
docker run -d --name api --network app-net \
nginx:alpine
# api から db をなまえでひける
docker exec api ping -c 2 db
💻 しゅつりょく:
TEXT
📖 参照専用
PING db (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.100 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.050 ms
📌 たいせつ: カスタムブリッジネットワークはコンテナごとの DNS レコードをじどうとうろくします。コンテナめいがホストめいになり、
db はデータベースコンテナの IP アドレスへかいけつされます。
▶ サンプル: ネットワークぶんりをたしかめる (むずかしさ: ⭐⭐)
BASH
# べつべつのネットワークをさくせい
docker network create frontend-net
docker network create backend-net
# フロントエンドコンテナ
docker run -d --name web --network frontend-net nginx:alpine
# バックエンドコンテナ
docker run -d --name api --network backend-net nginx:alpine
# べつのネットワークなので web から api へはとどかない
docker exec web ping -c 2 -W 2 api
# しゅつりょく: ping: bad address 'api'
# web を backend-net へつなぐと api へとどく
docker network connect backend-net web
docker exec web ping -c 2 api
# しゅつりょく: PING api (172.19.0.2): 64 bytes
5. ホストネットワークモード
▶ サンプル: ホストモードでコンテナをうごかす (むずかしさ: ⭐⭐)
BASH
# ホストのネットワークスタックをきょうゆうしてじっこう
docker run -d --name host-nginx --network host nginx:alpine
# ポートマッピングなしでホストの 80 ポートをつかう
curl http://localhost:80
⚠️ ちゅうい: ホストモードでは
-p はいりませんが、ポートのしょうとつリスクがたかくなります。ホストの 80 ポートがすでにつかわれていれば、コンテナはかいしできません。ほんばんではしんちょうにつかってください。
6. ポートフォワーディングのしくみ
(1) ポートをみせる 3 つのほうほう
| ほうほう | かきかた | せつめい |
|---|---|---|
-p host:container |
-p 8080:80 |
ポートをしていしてマッピング |
-P |
-P |
EXPOSE のポートへランダムにマッピング |
--network host |
--network host |
ホストネットワークをきょうゆうし、マッピングなし |
▶ サンプル: docker network inspect でネットワークをみる (むずかしさ: ⭐⭐)
BASH
# ネットワークせっていをしらべる
docker network inspect app-net
💻 しゅつりょくのばっすい:
TEXT
📖 参照専用
[
{
"Name": "app-net",
"Driver": "bridge",
"IPAM": {
"Config": [{"Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1"}]
},
"Containers": {
"a1b2c3d4...": {"Name": "db", "IPv4Address": "172.18.0.2"},
"e5f6a7b8...": {"Name": "api", "IPv4Address": "172.18.0.3"}
}
}
]
7. かんぜんなサンプル: 3 レイヤーのネットワーク
BASH
# ============================================
# 3 レイヤーのネットワークアーキテクチャ
# フロントエンド / バックエンド / データベースのぶんり
# ============================================
# 1. 3 つのネットワークをさくせい
docker network create frontend-net
docker network create backend-net
docker network create db-net
# 2. データベースを db-net だけでかいし
docker run -d --name db \
--network db-net \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=myapp \
postgres:15-alpine
# 3. API サーバーを backend-net でかいし
docker run -d --name api \
--network backend-net \
-e DATABASE_URL="postgresql://postgres:secret@db:5432/myapp" \
myapp-api:1.0
# API を db-net へつないでデータベースへとどくようにする
docker network connect db-net api
# 4. Nginx を frontend-net でかいし
docker run -d --name web \
--network frontend-net \
-p 8080:80 \
-v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf \
nginx:1.25-alpine
# Nginx を backend-net へつないで API へとどくようにする
docker network connect backend-net web
# 5. せつぞくをかくにん
docker exec web ping -c 1 api # web → api ✅
docker exec api ping -c 1 db # api → db ✅
docker exec web ping -c 1 -W 1 db # web → db ❌ (db-net にはいない)
# 6. クリーンアップ
docker stop web api db
docker rm web api db
docker network rm frontend-net backend-net db-net
❓ よくある質問
Q おなじネットワークにいない 2 つのコンテナはつうしんできますか?
A デフォルトではできません。
docker network connect でコンテナをあいてのネットワークへついかしてください。ひとつのコンテナはふくすうのネットワークへはいれます。Q ホストネットワークモードにはどんなリスクがありますか?
A ホストのポートをちょくせつつかうため、ポートしょうとつでかいしできないことがあります。また、コンテナから localhost をふくむホストのネットワークインターフェースへアクセスできます。さいだいのパフォーマンスがひつようなときだけつかってください。
Q コンテナの IP アドレスはかわりますか?
A はい。さいきどうでかわることがあるため、IP アドレスではなく DNS でかいけつされるコンテナめいをつかってください。カスタムブリッジでは Docker がマッピングをじどうこうしんします。
Q コンテナのネットワークアクセスをせいげんするにはどうしますか?
A ふくすうのネットワークでぶんりするほうほうがおすすめです。データベースを
db-net だけへいれれば、フロントエンドからちょくせつアクセスできません。iptables や --icc=false もありますが、カスタムネットワークのほうがわかりやすいです。Q ホストをまたいでコンテナをつうしんさせるにはどうしますか?
A Docker Swarm の overlay ネットワーク、ポートマッピングとホスト IP、または Weave や Calico などのプラグインをつかいます。もっともシンプルなのは Swarm の overlay です。
📖 まとめ
- 4 モードはブリッジ、ホスト、なし、overlay
- デフォルトブリッジには DNS がなく、カスタムブリッジならコンテナめいを DNS でかいけつできる
- それぞれのコンテナにはべつの localhost があり、コンテナかんではコンテナめいをつかう
- フロントエンド、バックエンド、データベースをふくすうネットワークでぶんりできる
docker network connectでコンテナをふくすうのネットワークへつなぐ-p host:containerでコンテナのサービスをそとへみせる
📝 練習問題
- きほん (むずかしさ: ⭐): カスタムブリッジネットワークをつくり、Nginx コンテナを 2 つかいしして、
docker exec A ping Bでコンテナめいを DNS かいけつできることをたしかめてください。 - おうよう (むずかしさ: ⭐⭐): 2 つのネットワークへコンテナをひとつずつおき、つうしんできないことをたしかめたあと、
docker network connectでつないでください。 - ちょうせん (むずかしさ: ⭐⭐⭐):
docker network inspectでカスタムネットワークの IPAM せっていとコンテナいちらんをみて、Docker ないぶのルーティングをせつめいしてください。