Uso de Dev Proxy con Docker Compose

De un vistazo
Objetivo: Uso del proxy de desarrollo con Docker Compose
Tiempo: 20 minutos
Complementos: Varios
Requisitos previos:Configuración del proxy de desarrollo, Docker y Docker Compose instalados

Al desarrollar aplicaciones con Docker, es posible que quiera usar Dev Proxy para probar cómo controla la aplicación los errores de API, la limitación o las respuestas de API simuladas. En este artículo se muestra cómo usar el proxy de desarrollo con Docker Compose en dos escenarios:

  • Proxy de desarrollo que se ejecuta en la máquina host, aplicación en un contenedor
  • Proxy de desarrollo que se ejecuta en un contenedor junto con el contenedor de tu aplicación

Escenario 1: Proxy de desarrollo en host, aplicación en contenedor

En este escenario, ejecutas Dev Proxy directamente en tu máquina mientras la aplicación se ejecuta en un contenedor de Docker. Este enfoque es útil cuando estés desarrollando activamente y deseas interactuar directamente con Dev Proxy.

Configuración del contenedor de aplicaciones

Cree un archivo docker-compose.yaml que configure su aplicación para usar el proxy de desarrollo que se ejecuta en el host.

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"

Inicia el Proxy de Desarrollo en tu host

Antes de iniciar el contenedor de aplicaciones, inicie Dev Proxy en el equipo host. En macOS y Linux, vincule Dev Proxy a todas las interfaces de red.

devproxy --ip-address 0.0.0.0

En Windows, puede iniciar el proxy de desarrollo normalmente:

devproxy

Control de certificados TLS/SSL

Cuando la aplicación realiza solicitudes HTTPS a través del proxy de desarrollo, el contenedor debe confiar en el certificado de proxy de desarrollo. Tiene dos opciones:

Opción 1: Deshabilitar la validación de certificados (solo desarrollo)

Para realizar pruebas rápidas, puede deshabilitar la validación de certificados en la aplicación. Para Node.js aplicaciones, establezca la NODE_TLS_REJECT_UNAUTHORIZED=0 variable de entorno (ya incluida en el ejemplo anterior). En el caso de las aplicaciones .NET, puede configurar el cliente HTTP para omitir la validación de certificados.

Precaución

Nunca deshabilite la validación de certificados en el código de producción.

Opción 2: Confiar en el certificado de proxy de desarrollo en el contenedor

Para una configuración más similar a la de producción, instale el certificado de proxy de desarrollo en el contenedor. En primer lugar, exporte el certificado desde el host y agréguelo a la imagen de Docker. Consulte Uso del proxy de desarrollo con aplicaciones .NET que se ejecutan en Docker para obtener pasos detallados.

Inicio de la aplicación

Inicie el contenedor de la aplicación:

docker compose up

La aplicación ahora enruta todo el tráfico HTTP y HTTPS a través del proxy de desarrollo que se ejecuta en el host.

Escenario 2: Proxy de desarrollo y aplicación en contenedores independientes

En este escenario más avanzado, tanto el proxy de desarrollo como la aplicación se ejecutan en contenedores de Docker. Este enfoque es útil para las canalizaciones de CI/CD o cuando se desea un entorno de desarrollo totalmente contenedorizado.

Crea el volumen de certificados

Ambos contenedores necesitan acceso al certificado de proxy de desarrollo. Cree un volumen de Docker para compartirlo:

docker volume create devproxy-cert

Crea el script de punto de entrada

Cree un script entrypoint.sh que instale el certificado Dev Proxy cuando se inicie su contenedor de aplicaciones.

#!/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 "$@"

Cree el archivo ejecutable del script:

chmod +x entrypoint.sh

Creación del Dockerfile de la aplicación

Cree un Dockerfile para la aplicación que incluya los requisitos previos de instalación de certificados:

# 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"]

Creación de la configuración de Docker Compose

Cree un docker-compose.yaml archivo que defina ambos servicios:

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:

Creación de un archivo de configuración de proxy de desarrollo

Cree un archivo devproxyrc.json en el mismo directorio que docker-compose.yaml:

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

Inicio de los contenedores

Inicie ambos contenedores con Docker Compose:

docker compose up

El Dev Proxy se inicia primero y genera su certificado. El contenedor de aplicaciones espera el certificado, lo instala y, a continuación, inicia la aplicación. Todas las solicitudes HTTP y HTTPS de tu aplicación ahora se enrutan a través de Dev Proxy.

Interactúa con el proxy de desarrollo

Dado que el proxy de desarrollo se ejecuta en un contenedor, puede interactuar con él de varias maneras:

Uso del terminal

Conecta al contenedor del proxy de desarrollo:

docker attach <container-name>

Uso de la API de proxy de desarrollo

La API de proxy de desarrollo se expone en el puerto 8897. Puede usarlo para controlar el proxy de desarrollo mediante programación:

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

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

Para obtener más información, consulte Dev Proxy API.

Consulte también