Docker内→ホストOS通信パターン

課題

Dockerコンテナ内のサービス(例: Caddy)からホストOS上のプロセスに通信する場合、 単純な localhost127.0.0.1 ではアクセスできない。

Docker Bridge ネットワーク経由

確認方法

# Docker bridgeのゲートウェイIP(=ホストIP)を確認
docker network inspect <network_name> | grep Gateway
# → 例: "Gateway": "172.19.0.1"

必要な設定チェックリスト

  1. アプリのリッスンアドレス

    • 127.0.0.1 ではなく 0.0.0.0 にバインド
    • 例: .envHOST=0.0.0.0
  2. ファイアウォール(UFW/iptables)

    • Docker サブネットからの通信を許可
    • ufw allow from 172.19.0.0/16 to any port <PORT> proto tcp
  3. アプリのセキュリティ設定

    • CORS: ALLOWED_ORIGINS にドメインを追加
    • 認証: 必要に応じてAPI Token設定

テスト手順

# Step 1: ホスト上で直接テスト
curl http://127.0.0.1:<PORT>/
 
# Step 2: Docker bridge IPでテスト(ホスト上)
curl http://172.19.0.1:<PORT>/
 
# Step 3: Docker内部からテスト
docker exec <container> wget -qO- --timeout=5 http://172.19.0.1:<PORT>/

Step 2が成功してStep 3が失敗する場合 → ファイアウォールが原因。

関連