Dockerネットワーク完全ガイド
Dockerネットワーク完全ガイド
Section titled “Dockerネットワーク完全ガイド”Dockerのネットワーク機能を、実務で使える実装例とともに詳しく解説します。
1. Dockerネットワークとは
Section titled “1. Dockerネットワークとは”ネットワークの役割
Section titled “ネットワークの役割”Dockerネットワークは、コンテナ間の通信を可能にし、コンテナを外部からアクセス可能にします。
コンテナ1 ↓(ネットワーク)コンテナ2 ↓(ネットワーク)外部(インターネット)なぜネットワークが必要か
Section titled “なぜネットワークが必要か”問題のある構成(ネットワークなし):
# 問題: コンテナ間で通信できないdocker run -d --name app my-app:latestdocker run -d --name db postgres:14
# 問題点:# 1. コンテナ間で通信できない# 2. 外部からアクセスできない# 3. ネットワーク設定が複雑解決: Dockerネットワークによる接続
# 解決: ネットワークの作成と接続docker network create my-networkdocker run -d --name app --network my-network my-app:latestdocker run -d --name db --network my-network postgres:14
# メリット:# 1. コンテナ間で通信可能# 2. 外部からアクセス可能# 3. ネットワークの一元管理2. ネットワークの種類
Section titled “2. ネットワークの種類”bridgeネットワーク(デフォルト)
Section titled “bridgeネットワーク(デフォルト)”# デフォルトのbridgeネットワークdocker network ls
# カスタムbridgeネットワークの作成docker network create my-bridge-network
# コンテナをネットワークに接続docker run -d --name app --network my-bridge-network my-app:latesthostネットワーク
Section titled “hostネットワーク”# ホストネットワークを使用docker run -d --name app --network host my-app:latest
# ホストのネットワークスタックを直接使用# ポートマッピングが不要noneネットワーク
Section titled “noneネットワーク”# ネットワークを無効化docker run -d --name app --network none my-app:latest
# 外部との通信ができない3. Docker Composeでのネットワーク
Section titled “3. Docker Composeでのネットワーク”デフォルトネットワーク
Section titled “デフォルトネットワーク”version: '3.8'
services: app: build: .
db: image: postgres:14-alpine
# 自動的に同じネットワークに接続されるカスタムネットワーク
Section titled “カスタムネットワーク”version: '3.8'
services: app: build: . networks: - frontend - backend
db: image: postgres:14-alpine networks: - backend
networks: frontend: driver: bridge backend: driver: bridge外部ネットワーク
Section titled “外部ネットワーク”version: '3.8'
services: app: build: . networks: - existing-network
networks: existing-network: external: true4. コンテナ間通信
Section titled “4. コンテナ間通信”サービス名での通信
Section titled “サービス名での通信”version: '3.8'
services: app: build: . environment: - DATABASE_URL=postgresql://postgres:password@db:5432/mydb
db: image: postgres:14-alpine
# appコンテナからdbコンテナにアクセス可能リンクの使用(非推奨)
Section titled “リンクの使用(非推奨)”# リンクの使用(非推奨)docker run -d --name app --link db:database my-app:latest5. ポートの公開
Section titled “5. ポートの公開”ポートマッピング
Section titled “ポートマッピング”services: app: build: . ports: - "3000:3000" # ホスト:コンテナ - "8080:80" # 複数ポートポート範囲の公開
Section titled “ポート範囲の公開”services: app: build: . ports: - "3000-3010:3000-3010"6. 実務でのベストプラクティス
Section titled “6. 実務でのベストプラクティス”パターン1: マイクロサービスアーキテクチャ
Section titled “パターン1: マイクロサービスアーキテクチャ”version: '3.8'
services: api: build: ./api networks: - app-network
frontend: build: ./frontend networks: - app-network ports: - "3000:3000"
db: image: postgres:14-alpine networks: - app-network
networks: app-network: driver: bridgeパターン2: ネットワークの分離
Section titled “パターン2: ネットワークの分離”version: '3.8'
services: app: build: . networks: - public-network - private-network
db: image: postgres:14-alpine networks: - private-network # 外部からアクセス不可
networks: public-network: driver: bridge private-network: driver: bridge internal: true # 外部アクセスを無効化7. よくある問題と解決策
Section titled “7. よくある問題と解決策”問題1: コンテナ間で通信できない
Section titled “問題1: コンテナ間で通信できない”原因:
- 同じネットワークに接続されていない
- サービス名が間違っている
解決策:
# ネットワークの確認docker network inspect network_name
# コンテナのネットワーク確認docker inspect container_name | grep NetworkMode問題2: ポートが公開されない
Section titled “問題2: ポートが公開されない”原因:
- ポートマッピングが正しく設定されていない
- ファイアウォールでブロックされている
解決策:
# ポートマッピングの確認services: app: ports: - "3000:3000" # 正しい形式これで、Dockerネットワークの基礎知識と実務での使い方を理解できるようになりました。