📋 このステップで学ぶこと
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つの主要なネットワークドライバーを挙げてください。
解答を見る
【解答】
bridge(ブリッジ): デフォルトのネットワーク。同じホスト上のコンテナ間通信に使用。
host(ホスト): コンテナがホストのネットワークを直接使用。高性能だがLinuxのみ。
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つ挙げてください。
解答を見る
【解答】
同じネットワークにいるか確認
docker network inspect ネットワーク名
カスタムブリッジを使っているか確認
デフォルトbridgeではDNS解決できない
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のボリュームマウント
いよいよデータエンジニアリングの実践編!データパイプライン構築の基盤を作りましょう!