Docker: コンテナかんのつうしんモデル

最終更新:2026-08-26

コンテナはそれぞれのネットワークでうごくだけでなく、たがいをみつけてつうしんするひつようがあります。このしくみはマイクロサービスアーキテクチャのきそです。

1. まなべること



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) ほうほうのくらべかた

100%
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 ✅ おすすめ ⭐⭐⭐
ホストポートフォワーディング コンテナ→ホスト→コンテナ つかえる ⭐⭐


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 かいけつのながれ

100%
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) トラブルシュートのながれ

100%
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 addrhostname -I をじっこうします。IP はかわるため、ほんばんコードではコンテナめいをつかってください。

📖 まとめ


📝 練習問題

  1. きほん (むずかしさ: ⭐): 2 つのカスタムネットワークをつくり、それぞれでコンテナをかいしして、おなじネットワークないの DNS かいけつをたしかめてください。
  2. おうよう (むずかしさ: ⭐⭐): ネットワークをまたぐコンテナが ping できないことをたしかめ、docker network connect でつないだあと、docker network disconnect できりはなしてください。
  3. ちょうせん (むずかしさ: ⭐⭐⭐): docker execnc または wget をつかい、コンテナからべつのサービスへアクセスできないげんいんをしらべ、てじゅんとけつろんをまとめてください。
Web-Tutorial.com

Web-Tutorial 技術チーム

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

100%