Docker: Docker ネットワークのきほん

最終更新:2026-08-26

Docker のコンテナネットワークはむずかしくみえますが、「それぞれのコンテナにべつの localhost がある」とわかればシンプルです。

1. まなべること



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) モードのぜんたいぞう

100%
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 です。

📖 まとめ


📝 練習問題

  1. きほん (むずかしさ: ⭐): カスタムブリッジネットワークをつくり、Nginx コンテナを 2 つかいしして、docker exec A ping B でコンテナめいを DNS かいけつできることをたしかめてください。
  2. おうよう (むずかしさ: ⭐⭐): 2 つのネットワークへコンテナをひとつずつおき、つうしんできないことをたしかめたあと、docker network connect でつないでください。
  3. ちょうせん (むずかしさ: ⭐⭐⭐): docker network inspect でカスタムネットワークの IPAM せっていとコンテナいちらんをみて、Docker ないぶのルーティングをせつめいしてください。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%