Docker: コンテナかんのつうしんモデル
最終更新:2026-08-26
コンテナはそれぞれのネットワークでうごくだけでなく、たがいをみつけてつうしんするひつようがあります。このしくみはマイクロサービスアーキテクチャのきそです。
1. まなべること
- コンテナどうしがつうしんする 3 つのほうほう
- コンテナエイリアスと DNS のおうよう
- ネットワークトラブルをしらべるほうほう
- ポートをみせるポリシー
- セキュリティをたかめるネットワークぶんり
2. マイクロサービスデベロッパーのじつわ
(1) こまりごと: 3 つのマイクロサービスがつながらない
Alice は API Gateway、User Service、Order Service の 3 コンテナをデプロイしました。API Gateway から User Service へのリクエストはいつもタイムアウトします。2 じかんしらべると、ポートやコンテナめいにまちがいがあり、Order Service はべつのネットワークにいることがわかりました。
(2) けいとうてきなネットワークチェック
Bob は、コンテナめい → DNS → ネットワーク → ポートのじゅんでしらべるほうほうをおしえました。
BASH
# ステップ 1: DNS かいけつをかくにん
docker exec api nslookup user-service
# ステップ 2: ネットワークせつぞくをテスト
docker exec api ping -c 2 user-service
# ステップ 3: ポートせつぞくをテスト
docker exec api nc -zv user-service 8080
(3) メリット: 2 じかんから 10 ぷんへ
けいとうてきなしらべかたにより、Alice のネットワークトラブルシュートは 2 じかんから 10 ぷんへみじかくなりました。
3. コンテナかんつうしんの 3 つのほうほう
(1) ほうほうのくらべかた
graph TB
subgraph Method1["① --link (レガシー、ひすいしょう)"]
L1["コンテナ A"] -->|"かんきょうへんすう + /etc/hosts"| L2["コンテナ B"]
end
subgraph Method2["② カスタムネットワーク + DNS (おすすめ)"]
D1["コンテナ A"] -->|"DNS じどうかいけつ"| D2["コンテナ B"]
end
subgraph Method3["③ こうかいポート + ホスト IP"]
E1["コンテナ A"] -->|"host:port"| E2["コンテナ B<br/>(ホストブリッジをけいゆ)"]
end
| ほうほう | しくみ | DNS | ステータス | おすすめど |
|---|---|---|---|---|
--link |
かんきょうへんすう + hosts へのついか | ❌ | ❌ ふるい | ⭐ |
| カスタムネットワーク DNS | Docker ないぞう DNS | ✅ | ✅ おすすめ | ⭐⭐⭐ |
| ホストポートフォワーディング | コンテナ→ホスト→コンテナ | ❌ | つかえる | ⭐⭐ |
4. --link はひすいしょう
▶ サンプル: --link のしくみをしる (むずかしさ: ⭐)
BASH
# レガシー link: web から db へホストめいでとどく
docker run -d --name db postgres:15-alpine
docker run -d --name web --link db:database nginx:alpine
# web は /etc/hosts により database をホストめいとしてつかえる
docker exec web cat /etc/hosts
⚠️ ちゅうい:
--link はすでにひすいしょうで、れきしてきなさんこうのためだけにあります。web→db のいっぽうこうで、さいきどうごに IP がかわっても hosts ファイルはこうしんされません。かわりにカスタムネットワークをつかってください。
5. カスタムネットワーク DNS のくわしいガイド
(1) DNS かいけつのながれ
graph LR
A["コンテナ A<br/>ping db"] --> B["Docker DNS<br/>127.0.0.11"]
B -->|"db → 172.18.0.2"| C["コンテナ B<br/>172.18.0.2"]
▶ サンプル: --network-alias でエイリアスをつける (むずかしさ: ⭐⭐)
BASH
# ネットワークエイリアスつきでコンテナをかいし
docker run -d --name my-postgres \
--network app-net \
--network-alias=database \
--network-alias=db \
postgres:15-alpine
# どちらのなまえもおなじコンテナへかいけつ
docker exec api ping -c 1 database # my-postgres へかいけつ
docker exec api ping -c 1 db # おなじ IP
(2) コンテナめいとネットワークエイリアス
| しゅるい | せつめい | はんい | ゆうせんど |
|---|---|---|---|
--name |
コンテナめい | すべてのネットワーク | たかい |
--network-alias |
ネットワークエイリアス | していネットワークだけ | ふつう |
| Docker Compose のサービスめい | サービスめい | Compose ネットワーク | たかい |
💡 ヒント:
--network-alias をつかうと、おなじコンテナへネットワークごとにべつのなまえをつけられます。たとえば バックエンド-net では primary-db、admin-net では database とよべます。
6. ポートをみせるポリシー
(1) --expose、-p、-P のちがい
| パラメーター | はたらき | そとからアクセス | ユースケース |
|---|---|---|---|
--expose 3306 |
ポートのせんげん | ❌ マッピングなし | コンテナかんつうしん |
-p 3306:3306 |
ホストへマッピング | ✅ そとからアクセス | がいぶサービス |
-P |
EXPOSE ポートをランダムにマッピング | ✅ ランダムポート | かいはつとデバッグ |
▶ サンプル: docker port でポートマッピングをみる (むずかしさ: ⭐)
BASH
# コンテナのポートマッピングをかくにん
docker port web
# しゅつりょくサンプル
80/tcp -> 0.0.0.0:8080
7. ネットワークのトラブルシュート
(1) トラブルシュートのながれ
graph TB
START["コンテナ A から<br/>コンテナ B へとどかない"] --> DNS{"DNS かいけつできる?"}
DNS -->|"できない"| FIX1["おなじカスタムネットワーク?<br/>--name や --network-alias をかくにん"]
DNS -->|"できる"| PING{"ping できる?"}
PING -->|"できない"| FIX2["おなじネットワーク?<br/>docker network connect"]
PING -->|"できる"| PORT{"ポートへせつぞくできる?<br/>nc -zv B port"]
PORT -->|"できない"| FIX3["ポートはひらいている?<br/>B はただしいポートでまっている?"]
PORT -->|"できる"| APP{"アプリプロトコル?<br/>curl/wget でテスト"]
APP -->|"できない"| FIX4["アプリせっていをかくにん<br/>かんきょうへんすう/URL"]
APP -->|"できる"| OK["✅ つうしんはせいじょう"]
▶ サンプル: コンテナネットワークをしらべるコマンド (むずかしさ: ⭐⭐)
BASH
# ステップ 1: DNS かいけつをかくにん
docker exec api nslookup db
docker exec api getent hosts db
# ステップ 2: きほんのせつぞくをテスト
docker exec api ping -c 2 db
# ステップ 3: とくていポートをテスト
docker exec api nc -zv db 5432
# または wget
docker exec api wget -qO- http://api:8080/health
# ステップ 4: コンテナのネットワークインターフェースをかくにん
docker exec api ip addr
# ステップ 5: ルーティングテーブルをかくにん
docker exec api ip route
▶ サンプル: docker network connect でうごいているコンテナをつなぐ (むずかしさ: ⭐⭐)
BASH
# うごいているコンテナをべつのネットワークへつなぐ
docker network connect backend-net web
# ネットワークからきりはなす
docker network disconnect frontend-net web
# コンテナのネットワークをかくにん
docker inspect web --format='{{json .NetworkSettings.Networks}}' | python3 -m json.tool
8. セキュリティのためのネットワークぶんり
(1) 3 レイヤーのぶんりモデル
| ネットワークレイヤー | コンテナ | アクセスできるさき | そとへみせるポート |
|---|---|---|---|
| フロントエンド-net | Nginx/CDN | バックエンド-net だけ | 80, 443 |
| バックエンド-net | API/Worker | db-net だけ | なし (Nginx プロキシをけいゆ) |
| db-net | PostgreSQL/Redis | そとからアクセスなし | なし |
🔒 セキュリティ: データベースは db-net だけにおき、フロントエンドからちょくせつアクセスできないようにします。バックエンド API をけいゆさせることで、さいしょうけんげんのポリシーにそえます。
9. かんぜんなサンプル: マイクロサービスのネットワークせってい
BASH
# ============================================
# マイクロサービスネットワーク
# ネットワーク、エイリアス、ぶんり、デバッグ
# ============================================
# 1. ぶんりネットワークをさくせい
docker network create frontend-net
docker network create backend-net
docker network create db-net
# 2. データベースを db-net だけでかいし
docker run -d --name postgres \
--network db-net \
--network-alias=database \
--network-alias=primary-db \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=myapp \
postgres:15-alpine
# 3. API サーバーを backend-net でかいし
docker run -d --name api \
--network backend-net \
--network-alias=api-server \
-e DATABASE_URL="postgresql://postgres:secret@primary-db:5432/myapp" \
myapp-api:1.0
docker network connect db-net api
# 4. Nginx を frontend-net でかいし
docker run -d --name nginx \
--network frontend-net \
--network-alias=gateway \
-p 8080:80 \
nginx:1.25-alpine
docker network connect backend-net nginx
# 5. デバッグ: せつぞくをかくにん
echo "=== DNS Resolution ==="
docker exec nginx nslookup api-server
docker exec api nslookup primary-db
echo "=== Port Connectivity ==="
docker exec nginx nc -zv api-server 5000
docker exec api nc -zv primary-db 5432
echo "=== Isolation Check ==="
docker exec nginx sh -c "timeout 2 nc -zv primary-db 5432 2>&1 || echo 'BLOCKED: nginx cannot reach db directly (expected)'"
# 6. クリーンアップ
docker stop postgres api nginx
docker rm postgres api nginx
docker network rm frontend-net backend-net db-net
❓ よくある質問
Q --link はひすいしょうですか?
A はい。Docker は
--link のかわりにカスタムネットワークと DNS をすすめています。--link にはいっぽうこうつうしん、さいきどうごに IP がこうしんされない、Compose にむかないというもんだいがあります。Q コンテナめいはべつのネットワークでもユニークですか?
A Docker ホストぜんたいでユニークです。ただし DNS かいけつはネットワークごとにおこなわれ、おなじネットワークのコンテナだけをなまえでひけます。
Q とくていのコンテナだけにアクセスをゆるすにはどうしますか?
A まもりたいサービスをせんようネットワークへおき、アクセスがひつようなコンテナだけをそのネットワークへつなぎます。
db-net へ API だけをつなげば、Nginx はデータベースへちょくせつアクセスできません。Q コンテナで DNS タイムアウトがおきたらどうしますか?
A おなじネットワークにいない、コンテナめいのタイプミス、DNS キャッシュをかくにんします。
docker exec <container> nslookup <target> でかいけつけっかをしらべてください。Q コンテナの IP アドレスをみるにはどうしますか?
A
docker inspect <container> --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' をつかうか、コンテナないで ip addr や hostname -I をじっこうします。IP はかわるため、ほんばんコードではコンテナめいをつかってください。📖 まとめ
- コンテナかんつうしんにはカスタムネットワーク + DNS がおすすめで、
--linkはつかわない - カスタムブリッジではコンテナめいが DNS へじどうとうろくされる
--network-aliasでネットワークごとにべつのエイリアスをつけられる--exposeはせんげんだけ、-pはホストへマッピング、-Pはランダムマッピング- DNS → ping → ポート → アプリプロトコルのじゅんでトラブルシュートする
- フロントエンド → バックエンド → データベース の 3 レイヤーでぶんりし、データベースをフロントエンドへみせない
📝 練習問題
- きほん (むずかしさ: ⭐): 2 つのカスタムネットワークをつくり、それぞれでコンテナをかいしして、おなじネットワークないの DNS かいけつをたしかめてください。
- おうよう (むずかしさ: ⭐⭐): ネットワークをまたぐコンテナが ping できないことをたしかめ、
docker network connectでつないだあと、docker network disconnectできりはなしてください。 - ちょうせん (むずかしさ: ⭐⭐⭐):
docker execとncまたはwgetをつかい、コンテナからべつのサービスへアクセスできないげんいんをしらべ、てじゅんとけつろんをまとめてください。