概览
目标: 将开发代理与 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。