通过


将 Dev Proxy 与 Docker Compose 配合使用

概览
目标: 将开发代理与 Docker Compose 配合使用
时间: 20 分钟
插件: 各种
先决条件:安装开发代理、Docker 和 Docker Compose

使用 Docker 开发应用程序时,可能需要使用开发代理来测试应用如何处理 API 错误、限制或模拟 API 响应。 本文介绍如何在两种方案中将开发代理与 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 请求时,容器需要信任开发代理证书。 可以使用两个选项:

选项 1:禁用证书验证(仅开发)

若要快速测试,可以在应用程序中禁用证书验证。 对于 Node.js 应用程序,请设置 NODE_TLS_REJECT_UNAUTHORIZED=0 环境变量(已包含在前面的示例中)。 对于 .NET 应用程序,可以将 HTTP 客户端配置为跳过证书验证。

注意

切勿在生产代码中禁用证书验证。

选项 2:信任容器中的开发代理证书

对于更类似于生产的设置,请在容器中安装开发代理证书。 首先,从主机导出证书,并将其添加到 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:

创建开发代理配置文件

在与docker-compose.yaml相同的目录中创建一个devproxyrc.json文件。

{
  "$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 请求都通过开发代理进行路由。

与开发代理服务器交互

由于开发代理在容器中运行,因此可以通过多种方式与之交互:

使用终端

连接到 Dev 代理容器:

docker attach <container-name>

使用开发者代理 API

开发代理 API 在端口 8897 上公开。 可以使用它以编程方式控制 Dev Proxy:

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

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

有关详细信息,请参阅 开发代理 API

另请参阅