STEP 18:Dockerネットワーキングとポート管理

🌐 STEP 18: Dockerネットワーキングとポート管理

ネットワークの種類からカスタム設定まで、完全マスター

📋 このステップで学ぶこと

  • Dockerネットワークの種類(bridge、host、none)
  • カスタムネットワークの作成と管理
  • コンテナ間通信の仕組みを理解する
  • ポートマッピングの詳細(-pオプション)
  • ホストとコンテナのポート対応
  • ネットワークのトラブルシューティング
  • 実践演習で複雑なネットワーク構成を構築

🔧 0. このステップの前提知識

📚 STEP 17の復習

このステップでは、以下の知識を使います。忘れた場合は復習してから進めましょう。

  • サービス間通信:サービス名でコンテナ間通信
  • デフォルトネットワーク:Docker Composeが自動作成
  • depends_on:起動順序の制御
  • healthcheck:サービスの準備完了確認

0-1. 作業ディレクトリの準備

# 作業ディレクトリを作成して移動 mkdir -p ~/docker-practice/step18 cd ~/docker-practice/step18 # 現在の場所を確認 pwd

0-2. このステップで学ぶネットワーク構成

【Dockerネットワークの全体像】 ┌─────────────────────────────────────────────────────────────┐ │ ホストマシン │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Docker Engine │ │ │ │ │ │ │ │ ┌──────────────────────────────────────────────┐ │ │ │ │ │ bridge ネットワーク(デフォルト) │ │ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ │ │Container│ │Container│ │Container│ │ │ │ │ │ │ │ A │ │ B │ │ C │ │ │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ │ └──────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ ┌──────────────────────────────────────────────┐ │ │ │ │ │ カスタムネットワーク │ │ │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │ │ │ Web │ │ DB │ ← DNS解決可能 │ │ │ │ │ │ └─────────┘ └─────────┘ │ │ │ │ │ └──────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ↕ ポートマッピング(-p 8080:80) │ └─────────────────────────────────────────────────────────────┘ ↕ 外部からのアクセス

0-3. このステップで学ぶ項目一覧

項目 説明 コマンド/設定
ネットワーク一覧 作成されているネットワークを確認 docker network ls
ネットワーク作成 カスタムネットワークを作成 docker network create
ネットワーク詳細 ネットワークの詳細情報を表示 docker network inspect
ネットワーク接続 コンテナをネットワークに接続 docker network connect
ポートマッピング ホストとコンテナのポートを対応付け -p ホスト:コンテナ

🌉 1. Dockerネットワークの種類

1-1. 3つの主要ネットワークドライバー

Dockerには、3つの主要なネットワークドライバーがあります。

🌉 bridge(ブリッジ)

デフォルトのネットワーク
• 同じホスト上のコンテナ間通信
• 外部への接続も可能
• 最も一般的

💻 host(ホスト)

ホストと同じネットワーク
• ポートマッピング不要
• 高性能
• Linuxのみ

🚫 none(なし)

ネットワークなし
• 完全に隔離
• セキュリティ重視
• 通信不可

1-2. ネットワークの一覧確認

# 現在のネットワーク一覧 docker network ls
NETWORK ID NAME DRIVER SCOPE abc123def456 bridge bridge local def456abc789 host host local 789abc123def none null local

1-3. bridge(ブリッジ)ネットワーク

【bridgeネットワークの仕組み】 ┌─────────────────────────────────────────────────────────────┐ │ ホストマシン │ │ │ │ 外部ネットワーク ←─── NAT ───→ docker0 (172.17.0.1) │ │ │ │ │ ┌────────────┼────────────┐ │ │ │ │ │ │ │ ┌─────▼─────┐┌─────▼─────┐┌─────▼─────┐ │ │ │172.17.0.2 ││172.17.0.3 ││172.17.0.4 │ │ │ │ Container ││ Container ││ Container │ │ │ │ A ││ B ││ C │ │ │ └───────────┘└───────────┘└───────────┘ │ └─────────────────────────────────────────────────────────────┘ 💡 デフォルトのbridgeでは、コンテナ名でのDNS解決ができない
📊 bridgeの特徴
  • 仮想ブリッジ:docker0という仮想ブリッジを作成
  • プライベートネットワーク:172.17.0.0/16のサブネット
  • NAT経由:外部ネットワークへはNATで接続
  • ポートマッピング:-pオプションで外部公開
# デフォルトのbridgeネットワークを使用 docker run -d –name myapp nginx # カスタムbridgeネットワークを使用 docker run -d –name myapp –network my-bridge nginx

1-4. host(ホスト)ネットワーク

コンテナがホストのネットワークを直接使用します。

# hostネットワークを使用 docker run -d –name myapp –network host nginx # この場合、nginxはホストの80番ポートで直接listen # ポートマッピング(-p)は不要
💡 hostネットワークの使用場面
  • 高性能が必要:NATのオーバーヘッドがない
  • 複雑なネットワーク設定:多数のポートを使う場合
  • 注意:Linuxのみサポート(Mac/Windowsは不可)

1-5. none(なし)ネットワーク

# noneネットワークを使用 docker run -d –name myapp –network none nginx # このコンテナは外部と一切通信できない
🔒 noneネットワークの使用場面
  • バッチ処理(ネットワーク不要)
  • セキュリティテスト
  • 完全に隔離したい場合

🔧 2. カスタムネットワークの作成

2-1. カスタムブリッジネットワークの利点

デフォルトのbridgeよりも、カスタムブリッジネットワークを使うことを推奨します。

💡 カスタムネットワークの利点
  • DNS解決:コンテナ名で通信できる
  • ネットワーク分離:他のネットワークから独立
  • 柔軟な設定:サブネット、ゲートウェイをカスタマイズ可能

2-2. 基本的な作成方法

# シンプルなネットワーク作成 docker network create my-network # 詳細を指定して作成 docker network create \ –driver bridge \ –subnet 172.20.0.0/16 \ –gateway 172.20.0.1 \ my-custom-network # ネットワーク確認 docker network ls

2-3. ネットワークの詳細情報

# ネットワークの詳細を確認 docker network inspect my-network
[ { “Name”: “my-network”, “Driver”: “bridge”, “Scope”: “local”, “IPAM”: { “Config”: [ { “Subnet”: “172.18.0.0/16”, “Gateway”: “172.18.0.1” } ] }, “Containers”: {} } ]

2-4. コンテナをネットワークに接続

# ネットワーク作成 docker network create app-network # コンテナ起動時に指定 docker run -d –name web –network app-network nginx docker run -d –name db –network app-network postgres # 既存のコンテナを接続 docker network connect app-network existing-container # コンテナをネットワークから切断 docker network disconnect app-network existing-container

2-5. 複数ネットワークへの接続

# 2つのネットワークを作成 docker network create frontend docker network create backend # コンテナを両方のネットワークに接続 docker run -d –name app –network frontend nginx docker network connect backend app # appコンテナは両方のネットワークに参加

2-6. ネットワークの削除

# ネットワーク削除 docker network rm my-network # 使用されていないネットワークを一括削除 docker network prune # 確認なしで削除 docker network prune -f

🔗 3. コンテナ間通信の仕組み

3-1. デフォルトbridgeでの通信

デフォルトのbridgeネットワークでは、IPアドレスでのみ通信できます。

# デフォルトbridgeで起動 docker run -d –name container1 nginx docker run -d –name container2 nginx # container2からcontainer1へping(失敗) docker exec container2 ping container1 # ping: container1: Name or service not known # IPアドレスなら通信可能 docker inspect container1 | grep IPAddress # “IPAddress”: “172.17.0.2” docker exec container2 ping 172.17.0.2 -c 3 # PING 172.17.0.2: 56 data bytes # 64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.123 ms

3-2. カスタムbridgeでの通信

カスタムブリッジでは、コンテナ名で通信できます。

【カスタムネットワークのDNS解決】 ┌─────────────────────────────────────────────────────────────┐ │ カスタムネットワーク(my-app-network) │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ web │ ──────────────▶│ db │ │ │ │ │ ping db │ │ │ │ │ │ ✅ 成功! │ │ │ │ └──────────────┘ └──────────────┘ │ │ │ │ 💡 組み込みDNSサーバーがコンテナ名をIPに解決 │ └─────────────────────────────────────────────────────────────┘
# カスタムネットワーク作成 docker network create my-app-network # ネットワークを指定して起動 docker run -d –name web –network my-app-network nginx docker run -d –name db –network my-app-network postgres # コンテナ名で通信可能! docker exec web ping db -c 3 # PING db (172.18.0.3): 56 data bytes # 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.098 ms
🎯 DNS解決の仕組み

カスタムブリッジネットワークには、組み込みDNSサーバーがあります。
コンテナ名 → IPアドレスの変換を自動で行ってくれます。

3-3. Docker ComposeとDNS

# docker-compose.yml version: ‘3.8’ services: web: image: nginx db: image: postgres # Docker Composeが自動でカスタムネットワークを作成 # web → db へサービス名で通信可能

🔌 4. ポートマッピングの詳細

4-1. ポートマッピングの仕組み

【ポートマッピングの動作】 ブラウザ │ │ http://localhost:8080 ↓ ┌───────────────────────────────────────────────────────────┐ │ ホストマシン │ │ │ │ ポート 8080 ←───── Docker NAT ─────→ ポート 80 │ │ │ │ ┌─────────────────────┐ │ │ │ Nginxコンテナ │ │ │ │ ポート80でリッスン │ │ │ └─────────────────────┘ │ └───────────────────────────────────────────────────────────┘ docker run -p 8080:80 nginx ↑ ↑ ホスト コンテナ

4-2. -pオプションの基本

# 基本形式 docker run -p [ホストポート]:[コンテナポート] イメージ名 # 例:ホストの8080 → コンテナの80 docker run -d -p 8080:80 nginx # アクセス:http://localhost:8080

4-3. 様々なポートマッピング方法

ポートマッピングのパターン
パターン コマンド 説明
基本 -p 8080:80 ホスト8080 → コンテナ80
同じポート -p 80:80 同じポート番号
複数ポート -p 80:80 -p 443:443 複数のポートを公開
自動割り当て -p 80 ホストポートは自動
IPアドレス指定 -p 127.0.0.1:8080:80 localhostのみアクセス可
UDPポート -p 53:53/udp UDPプロトコル
ポート範囲 -p 8000-8010:8000-8010 範囲指定

4-4. 自動割り当てポートの確認

# コンテナ起動(ホストポートは自動) docker run -d –name mynginx -p 80 nginx # ポート確認 docker ps # または docker port mynginx
CONTAINER ID IMAGE PORTS NAMES abc123def456 nginx 0.0.0.0:32768->80/tcp mynginx # ホストの32768番ポートにマッピングされた

4-5. docker-compose.ymlでのポートマッピング

version: ‘3.8’ services: web: image: nginx ports: # 基本形式(引用符で囲む) – “8080:80” # 複数ポート – “80:80” – “443:443” # IPアドレス指定 – “127.0.0.1:8080:80”
⚠️ ポートマッピングの注意点
  • ホストの同じポートは1つのコンテナしか使えない
  • ポート番号は引用符で囲む(YAML解釈エラー防止)
  • ファイアウォールでポートを開ける必要がある場合も

🖥️ 5. portsとexposeの違い

5-1. portsとexposeの比較

【portsとexposeの違い】 ┌─────────────────────────────────────────────────────────────┐ │ ports: “8080:80” │ │ │ │ 外部 ホスト コンテナ │ │ ブラウザ → ポート8080 → ポート80 │ │ ✅ │ │ アクセス可能 │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ expose: “80” │ │ │ │ 外部 ホスト コンテナ │ │ ブラウザ ✗ アクセス不可 → ポート80 │ │ ❌ │ │ │ │ 他のコンテナ ─────────────→ ポート80 │ │ ✅ │ │ アクセス可能 │ └─────────────────────────────────────────────────────────────┘
ports vs expose 比較表
設定 効果 使用場面
ports: ホストに公開(外部からアクセス可) Nginx、API、Webアプリなど外部公開するサービス
expose: コンテナ間通信のみ(外部からアクセス不可) データベース、内部API、キャッシュなど
EXPOSE(Dockerfile) ドキュメント目的、実際の公開なし 使用ポートを明示的に示す

5-2. 使用例

version: ‘3.8’ services: # 外部公開するサービス nginx: image: nginx ports: – “80:80” # ホストからアクセス可能 – “443:443” # 内部のみのサービス backend: image: myapp expose: – “5000” # 他のコンテナからのみアクセス可 # データベース(外部公開しない) postgres: image: postgres expose: – “5432” # backendからのみアクセス
🔒 セキュリティのベストプラクティス
  • 外部公開が必要なサービスのみportsを使用
  • データベースはexposeまたは何も指定しない
  • 開発環境でも本番と同じネットワーク構成を意識

🔍 6. ネットワークのトラブルシューティング

6-1. よくある問題と解決策

❌ 問題1:コンテナ間で通信できない

確認手順:

# 1. 同じネットワークか確認 docker network inspect ネットワーク名 # 2. pingで疎通確認 docker exec コンテナ1 ping コンテナ2 -c 3 # 3. カスタムブリッジを使っているか確認 # デフォルトbridgeではDNS解決できない
❌ 問題2:ホストからコンテナにアクセスできない

確認手順:

# 1. ポートマッピング確認 docker ps docker port コンテナ名 # 2. コンテナ内でサービス起動確認 docker exec コンテナ名 ps aux # 3. コンテナ内からlocalhost接続テスト docker exec コンテナ名 curl localhost:80
❌ 問題3:ポートが既に使用中

症状:「port is already allocated」エラー

# 使用中のポートを確認 # Linux/Mac sudo lsof -i :8080 # Dockerコンテナで使用中のポート docker ps –format “table {{.Names}}\t{{.Ports}}” # 解決策:別のポートを使う docker run -p 8081:80 nginx

6-2. デバッグコマンド集

# IPアドレス確認 docker exec コンテナ名 ip addr # ルーティングテーブル確認 docker exec コンテナ名 ip route # ポート確認 docker exec コンテナ名 netstat -tulpn # 名前解決確認 docker exec コンテナ名 nslookup google.com # DNS設定確認 docker exec コンテナ名 cat /etc/resolv.conf

🛠️ 7. 実践演習:3層アーキテクチャの構築

7-1. 演習の目標

フロントエンド、バックエンド、データベースを異なるネットワークで分離します。

【3層アーキテクチャ】 ┌─────────────────────────────────────────────────────────────┐ │ 外部ユーザー │ └───────────────────────────┬─────────────────────────────────┘ │ ポート80 ↓ ┌─────────────────────────────────────────────────────────────┐ │ frontend-network │ │ ┌─────────────┐ │ │ │ Nginx │ ← フロントエンド層 │ │ └──────┬──────┘ │ └───────────────────────────┼─────────────────────────────────┘ │ ┌───────────────────────────┼─────────────────────────────────┐ │ app-network ↓ │ │ ┌─────────────┐ │ │ │ Flask │ ← アプリケーション層 │ │ └──────┬──────┘ │ └───────────────────────────┼─────────────────────────────────┘ │ ┌───────────────────────────┼─────────────────────────────────┐ │ db-network ↓ │ │ ┌───────────────┴───────────────┐ │ │ ↓ ↓ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ PostgreSQL │ │ Redis │ │ │ └─────────────┘ └─────────────┘ │ │ ← DB層 │ └─────────────────────────────────────────────────────────────┘ 💡 NginxからPostgreSQLには直接アクセスできない = セキュリティ向上

7-2. プロジェクト構造を作成

# プロジェクトディレクトリを作成 mkdir -p ~/docker-practice/3-tier-network/{nginx,app} cd ~/docker-practice/3-tier-network # ディレクトリ構造を確認 find . -type d

7-3. Flaskアプリケーションを作成

# app/requirements.txt を作成 cat > app/requirements.txt << ‘EOF’ Flask==2.0.1 psycopg2-binary==2.9.1 redis==3.5.3 EOF cat app/requirements.txt
# app/app.py を作成 cat > app/app.py << ‘EOF’ from flask import Flask, jsonify import psycopg2 import redis import os app = Flask(__name__) # Redis接続 r = redis.Redis( host=os.environ.get(‘REDIS_HOST’, ‘redis’), port=6379, decode_responses=True ) # PostgreSQL接続 def get_db_connection(): return psycopg2.connect( host=os.environ.get(‘POSTGRES_HOST’, ‘postgres’), database=’mydb’, user=’admin’, password=’admin123′ ) @app.route(‘/’) def index(): return jsonify({ ‘message’: ‘Welcome to 3-Tier Architecture!’, ‘status’: ‘ok’ }) @app.route(‘/redis-test’) def redis_test(): r.incr(‘visits’) visits = r.get(‘visits’) return jsonify({ ‘redis’: ‘connected’, ‘visits’: visits }) @app.route(‘/db-test’) def db_test(): try: conn = get_db_connection() cur = conn.cursor() cur.execute(‘SELECT version();’) version = cur.fetchone()[0] cur.close() conn.close() return jsonify({ ‘database’: ‘connected’, ‘version’: version }) except Exception as e: return jsonify({‘error’: str(e)}), 500 if __name__ == ‘__main__’: app.run(host=’0.0.0.0′, port=5000) EOF cat app/app.py
# app/Dockerfile を作成 cat > app/Dockerfile << ‘EOF’ FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install –no-cache-dir -r requirements.txt COPY app.py . CMD [“python”, “app.py”] EOF cat app/Dockerfile

7-4. Nginx設定を作成

# nginx/nginx.conf を作成 cat > nginx/nginx.conf << ‘EOF’ server { listen 80; location / { proxy_pass http://flask-app:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } EOF cat nginx/nginx.conf
# nginx/Dockerfile を作成 cat > nginx/Dockerfile << ‘EOF’ FROM nginx:alpine COPY nginx.conf /etc/nginx/conf.d/default.conf EOF cat nginx/Dockerfile

7-5. docker-compose.ymlを作成

# docker-compose.yml を作成 cat > docker-compose.yml << ‘EOF’ version: ‘3.8’ services: # データベース層 postgres: image: postgres:13 environment: POSTGRES_USER: admin POSTGRES_PASSWORD: admin123 POSTGRES_DB: mydb volumes: – postgres_data:/var/lib/postgresql/data networks: – db-network restart: unless-stopped redis: image: redis:alpine volumes: – redis_data:/data networks: – db-network restart: unless-stopped # アプリケーション層 flask-app: build: ./app environment: POSTGRES_HOST: postgres REDIS_HOST: redis networks: – app-network – db-network depends_on: – postgres – redis restart: unless-stopped # フロントエンド層 nginx: build: ./nginx ports: – “80:80” networks: – frontend-network – app-network depends_on: – flask-app restart: unless-stopped # ネットワーク定義 networks: frontend-network: driver: bridge app-network: driver: bridge db-network: driver: bridge # ボリューム定義 volumes: postgres_data: redis_data: EOF cat docker-compose.yml

7-6. ファイル構成を確認

# ファイル構成を確認 find . -type f
./docker-compose.yml ./nginx/Dockerfile ./nginx/nginx.conf ./app/Dockerfile ./app/requirements.txt ./app/app.py

7-7. 起動と確認

# ビルドして起動 docker-compose up –build -d # ネットワーク確認 docker network ls
NETWORK ID NAME DRIVER SCOPE abc123 3-tier-network_frontend-network bridge local def456 3-tier-network_app-network bridge local 789abc 3-tier-network_db-network bridge local

7-8. 疎通確認

# APIテスト curl http://localhost/ # Redisテスト curl http://localhost/redis-test # データベーステスト curl http://localhost/db-test
# セキュリティ確認:nginxからpostgresへの通信(失敗するはず) docker-compose exec nginx ping postgres -c 1
ping: postgres: Name does not resolve # ✅ NginxからPostgreSQLには直接アクセスできない = 正しい動作
✅ セキュリティの確認
  • Nginxはフロントエンドとアプリ層にのみアクセス
  • NginxからPostgreSQLに直接アクセスできない
  • 外部からはNginx(ポート80)のみ公開
  • データベースは完全に内部に隠蔽

7-9. クリーンアップ

# 停止してすべて削除 docker-compose down -v # ネットワークも削除されたことを確認 docker network ls

💪 8. 練習問題

練習問題 1 基礎

Dockerの3つの主要なネットワークドライバーを挙げてください。

【解答】
  1. bridge(ブリッジ):デフォルトのネットワーク。同じホスト上のコンテナ間通信に使用。
  2. host(ホスト):コンテナがホストのネットワークを直接使用。高性能だがLinuxのみ。
  3. none(なし):ネットワーク機能なし。完全に隔離されたコンテナ。
練習問題 2 基礎

デフォルトのbridgeネットワークとカスタムブリッジネットワークの主な違いは何ですか?

【解答】

主な違い:

  • デフォルトbridge:コンテナ名でのDNS解決ができない。IPアドレスでのみ通信可能。
  • カスタムbridge:コンテナ名でDNS解決ができる。コンテナ名で通信可能。

推奨:カスタムブリッジネットワークを使用。Docker Composeは自動的にカスタムブリッジを作成。

練習問題 3 応用

次の要件を満たすネットワーク構成を作成してください。

  • webネットワーク:Nginx、Flask
  • dbネットワーク:Flask、PostgreSQL
  • NginxとPostgreSQLは直接通信できない
【解答】
version: ‘3.8’ services: nginx: image: nginx:alpine ports: – “80:80” networks: – web-network flask: image: myflask:latest networks: – web-network – db-network postgres: image: postgres:13 environment: POSTGRES_PASSWORD: secret networks: – db-network networks: web-network: db-network:
練習問題 4 応用

次のdocker runコマンドで、どのようにアクセスできますか?

docker run -d -p 127.0.0.1:8080:80 nginx
【解答】

http://127.0.0.1:8080 または http://localhost:8080

説明:

  • 127.0.0.1:8080:ホストのlocalhostの8080番ポート
  • 127.0.0.1を指定しているため、ローカルホストからのみアクセス可能
  • 他のマシンからはアクセスできない(セキュリティ向上)
練習問題 5 発展

カスタムネットワークを作成し、サブネットとゲートウェイを指定してください。

要件:サブネット:172.25.0.0/16、ゲートウェイ:172.25.0.1

【解答】
# コマンドラインで作成 docker network create \ –driver bridge \ –subnet 172.25.0.0/16 \ –gateway 172.25.0.1 \ my-custom-network # 確認 docker network inspect my-custom-network

docker-compose.ymlで定義:

networks: custom-net: driver: bridge ipam: config: – subnet: 172.25.0.0/16 gateway: 172.25.0.1
練習問題 6 応用

コンテナ間でpingが通らない場合の確認手順を3つ挙げてください。

【解答】
  1. 同じネットワークにいるか確認
    docker network inspect ネットワーク名
  2. カスタムブリッジを使っているか確認

    デフォルトbridgeではDNS解決できない

  3. IPアドレスで疎通確認
    docker inspect コンテナ名 | grep IPAddress docker exec コンテナ1 ping IPアドレス -c 3
練習問題 7 基礎

portsとexposeの違いを説明してください。

【解答】
設定 効果
expose: コンテナ間通信のみ(ホストからアクセス不可)
ports: ホストに公開(外部からアクセス可能)
練習問題 8 応用

既存のコンテナを新しいネットワークに接続するコマンドを書いてください。

【解答】
# 新しいネットワークを作成 docker network create new-network # 既存のコンテナを接続 docker network connect new-network existing-container # 確認 docker network inspect new-network # 切断する場合 docker network disconnect new-network existing-container
練習問題 9 発展

internal: trueを設定したネットワークの特徴を説明してください。

【解答】

internal: trueを設定したネットワークは:

  • 外部ネットワーク(インターネット)への接続が完全にブロックされる
  • 同じネットワーク内のコンテナ間通信のみ可能
  • データベースなど、外部アクセスが不要なサービスに最適
networks: internal-network: driver: bridge internal: true # 外部からの接続を完全にブロック
練習問題 10 発展

DMZ風のネットワーク構成を設計してください。

要件:public-network(Nginx)、dmz-network(Nginx、API Gateway)、internal-network(API Gateway、App、DB)

【解答】
version: ‘3.8’ services: nginx: image: nginx:alpine ports: – “80:80” networks: – public-network – dmz-network api-gateway: image: kong:latest networks: – dmz-network – internal-network app: build: ./app networks: – internal-network postgres: image: postgres:13 networks: – internal-network networks: public-network: driver: bridge dmz-network: driver: bridge internal-network: driver: bridge internal: true

セキュリティポイント:

  • public-network:外部からアクセス可能(Nginxのみ)
  • dmz-network:Nginxとapi-gatewayのみ
  • internal-network:完全内部化(internal: true

📝 STEP 18 のまとめ

✅ このステップで学んだこと
  • ネットワークの種類:bridge、host、noneの3つ
  • カスタムネットワーク:DNS解決が可能で推奨
  • コンテナ間通信:サービス名で簡単にアクセス
  • ポートマッピング:-pオプションで柔軟に設定
  • portsとexpose:外部公開と内部通信の使い分け
  • ネットワーク分離:セキュリティ向上のための複数ネットワーク
📊 ネットワークドライバー 比較表
ドライバー 特徴 使用場面
bridge デフォルト、NAT経由で外部接続 一般的な用途、コンテナ間通信
host ホストと同じネットワーク、高性能 高性能が必要な場合(Linuxのみ)
none ネットワークなし、完全隔離 セキュリティテスト、バッチ処理
💡 重要ポイント
  • カスタムブリッジを使えばDNS解決が可能
  • 複数ネットワークでセキュリティを大幅向上
  • internal: trueで完全内部化
  • portsとexposeの使い分けが重要
  • Docker Composeは自動でカスタムネットワークを作成
🎯 次のステップの予告

次のSTEP 19では、「PostgreSQL + Airflowのコンテナ化」を学びます。

  • Apache Airflowの概要
  • PostgreSQL(メタデータベース)との連携
  • Airflow Webserver、Scheduler、Workerの構成
  • DAGのボリュームマウント

いよいよデータエンジニアリングの実践編!データパイプライン構築の基盤を作りましょう!

📝

学習メモ

Docker・コンテナ技術入門 - Step 18

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE