次の方法で共有


Docker Compose で開発プロキシを使用する

概要
目標: Docker Compose で開発プロキシを使用する
時間: 20 分
プラグイン: 各種
前提条件:Dev Proxy、Docker、Docker Compose のインストールを設定する

Docker を使用してアプリケーションを開発する場合は、開発プロキシを使用して、アプリが API エラー、調整、または API 応答をモック処理する方法をテストできます。 この記事では、次の 2 つのシナリオで Docker Compose で開発プロキシを使用する方法について説明します。

  • ホスト コンピューター、コンテナー内のアプリで実行されている開発プロキシ
  • アプリ コンテナーと共にコンテナーで実行されている開発プロキシ

シナリオ 1: ホスト上の開発プロキシ、コンテナー内のアプリ

このシナリオでは、アプリケーションが Docker コンテナーで実行されている間、コンピューターで開発プロキシを直接実行します。 この方法は、開発を積極的に行っており、開発プロキシと直接やり取りする場合に便利です。

アプリケーション コンテナーを構成する

ホストで実行されている開発プロキシを使用するようにアプリケーションを構成する docker-compose.yaml ファイルを作成します。

services:
  app:
    build: .
    environment:
      # Point to Dev Proxy on the host machine
      - HTTPS_PROXY=http://host.docker.internal:8000
      - HTTP_PROXY=http://host.docker.internal:8000
      # For Node.js applications
      - NODE_TLS_REJECT_UNAUTHORIZED=0
    extra_hosts:
      # Ensure host.docker.internal resolves correctly on Linux
      - "host.docker.internal:host-gateway"

ホストで開発プロキシを起動する

アプリケーション コンテナーを開始する前に、ホスト コンピューターで開発プロキシを起動します。 macOS と Linux では、開発プロキシをすべてのネットワーク インターフェイスにバインドします。

devproxy --ip-address 0.0.0.0

Windows では、通常どおりに開発プロキシを起動できます。

devproxy

TLS/SSL 証明書の処理

アプリケーションが開発プロキシを介して HTTPS 要求を行う場合、コンテナーは開発プロキシ証明書を信頼する必要があります。 次の 2 つのオプションがあります。

オプション 1: 証明書の検証を無効にする (開発のみ)

迅速なテストのために、アプリケーションで証明書の検証を無効にすることができます。 Node.js アプリケーションの場合は、 NODE_TLS_REJECT_UNAUTHORIZED=0 環境変数を設定します (前の例に既に含まれています)。 .NET アプリケーションの場合は、証明書の検証をスキップするように HTTP クライアントを構成できます。

注意事項

運用環境のコードで証明書の検証を無効にしないでください。

オプション 2: コンテナー内の開発プロキシ証明書を信頼する

運用環境に似たセットアップを行う場合は、コンテナーに Dev Proxy 証明書をインストールします。 まず、ホストから証明書をエクスポートし、Docker イメージに追加します。 詳細な手順については、「 Docker で実行されている .NET アプリケーションで開発プロキシを使用 する」を参照してください。

アプリケーションを起動する

アプリケーション コンテナーを起動します。

docker compose up

これで、アプリケーションは、ホスト上で実行されている開発プロキシを介して、すべての HTTP および HTTPS トラフィックをルーティングするようになりました。

シナリオ 2: 開発プロキシとアプリを別々のコンテナーに配置する

このより高度なシナリオでは、開発プロキシとアプリケーションの両方が Docker コンテナーで実行されます。 この方法は、CI/CD パイプラインや、完全にコンテナー化された開発環境が必要な場合に便利です。

証明書ボリュームを作成する

どちらのコンテナーも、開発プロキシ証明書にアクセスする必要があります。 Docker ボリュームを作成して共有します。

docker volume create devproxy-cert

エントリポイント スクリプトを作成する

アプリケーション コンテナーの起動時に開発プロキシ証明書をインストールする entrypoint.sh スクリプトを作成します。

#!/bin/bash
set -e

# Wait for the Dev Proxy certificate to be available
echo "Waiting for Dev Proxy certificate..."
while [ ! -f /cert/rootCert.pfx ]; do
  sleep 1
done

# Convert PFX to PEM format
openssl pkcs12 \
  -in /cert/rootCert.pfx \
  -out /usr/local/share/ca-certificates/dev-proxy-ca.crt \
  -clcerts \
  -nokeys \
  -passin pass:""

# Update system certificates
update-ca-certificates

echo "Dev Proxy certificate installed"

# Execute the main command
exec "$@"

スクリプトを実行可能にする:

chmod +x entrypoint.sh

アプリケーション Dockerfile を作成する

証明書のインストールの前提条件を含むアプリケーションの Dockerfile を作成します。

# Example for a Node.js application
FROM node:20

# Install certificate tools
RUN apt-get update && apt-get install -y \
    openssl \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Copy application files
COPY package*.json ./
RUN npm install
COPY . .

# Copy entrypoint script
COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
CMD ["node", "index.js"]

Docker Compose 構成を作成する

両方のサービスを定義する docker-compose.yaml ファイルを作成します。

services:
  dev-proxy:
    image: ghcr.io/dotnet/dev-proxy:latest
    ports:
      - "8000:8000"
      - "8897:8897"
    volumes:
      # Mount your Dev Proxy configuration
      - ./devproxyrc.json:/config/devproxyrc.json
      # Share the certificate with the app container
      - devproxy-cert:/home/devproxy/.config/dev-proxy/rootCert
    # Generate the certificate on startup
    command: ["--install-cert"]
    stdin_open: true
    tty: true

  app:
    build: .
    depends_on:
      - dev-proxy
    environment:
      # Point to the Dev Proxy container
      - HTTPS_PROXY=http://dev-proxy:8000
      - HTTP_PROXY=http://dev-proxy:8000
    volumes:
      # Mount the certificate volume
      - devproxy-cert:/cert:ro

volumes:
  devproxy-cert:

開発プロキシ構成ファイルを作成する

devproxyrc.jsonと同じディレクトリにdocker-compose.yaml ファイルを作成します。

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.3.0/rc.schema.json",
  "urlsToWatch": [
    "https://api.example.com/*",
    "https://graph.microsoft.com/*"
  ],
  "plugins": [
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
    }
  ]
}

コンテナーを開始する

Docker Compose を使用して両方のコンテナーを開始します。

docker compose up

開発プロキシが最初に起動し、その証明書を生成します。 アプリケーション コンテナーは証明書を待機し、証明書をインストールして、アプリケーションを起動します。 アプリケーションからのすべての HTTP 要求と HTTPS 要求は、開発プロキシ経由でルーティングされるようになりました。

開発プロキシを操作する

開発プロキシはコンテナー内で実行されるため、いくつかの方法で操作できます。

ターミナルの使用

開発プロキシ コンテナーにアタッチします。

docker attach <container-name>

開発プロキシ API の使用

開発プロキシ API はポート 8897 で公開されています。 これを使用して、プログラムによって開発プロキシを制御できます。

# Start recording
curl -X POST http://localhost:8897/proxy/recording/start

# Stop recording
curl -X POST http://localhost:8897/proxy/recording/stop

詳細については、「 開発プロキシ API」を参照してください。

こちらも参照ください