Поделиться через


Использование прокси-сервера разработки с Docker Compose

На первый взгляд
Цель: Использование прокси-сервера разработки с Docker Compose
Время: 20 минут
Плагины: Разные
Предварительные требования:настройка прокси-сервера разработки, Docker и Docker Compose

При разработке приложений с помощью Docker вы можете захотеть использовать Dev Proxy для тестирования того, как ваше приложение обрабатывает ошибки API, ограничение скорости или имитацию ответов API. В этой статье показано, как использовать прокси-сервер разработки с Docker Compose в двух сценариях:

  • Сервер разработки, работающий на хост-компьютере, приложение в контейнере
  • Прокси-сервер разработки, работающий в контейнере вместе с контейнером приложения

Сценарий 1. Разработка прокси-сервера на узле, приложении в контейнере

В этом сценарии вы запускаете прокси-сервер разработки непосредственно на компьютере, пока приложение выполняется в контейнере Docker. Этот подход полезен при активной разработке и прямом взаимодействии с «Dev Proxy».

Настройка контейнера приложения

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 привязать Dev-прокси ко всем сетевым интерфейсам.

devproxy --ip-address 0.0.0.0

В Windows вы можете запустить прокси разработки обычно:

devproxy

Обработка TLS/SSL-сертификатов

Когда приложение выполняет HTTPS-запросы через прокси-сервер разработки, контейнер должен доверять сертификату прокси-сервера разработки. У вас есть два варианта:

Вариант 1. Отключение проверки сертификатов (только для разработки)

Для быстрого тестирования можно отключить проверку сертификатов в приложении. Для Node.js приложений задайте NODE_TLS_REJECT_UNAUTHORIZED=0 переменную среды (уже включенную в предыдущий пример). Для приложений .NET можно настроить HTTP-клиент, чтобы пропустить проверку сертификата.

Предостережение

Никогда не отключайте проверку сертификатов в рабочем коде.

Вариант 2. Доверять сертификату прокси-сервера разработки в контейнере

Чтобы настроить среду, приближённую к рабочей, установите сертификат Dev Proxy в контейнере. Сначала экспортируйте сертификат из узла и добавьте его в образ Docker. Подробные инструкции см. в статье Об использовании прокси-сервера разработки с приложениями .NET, работающими в Docker .

Запуск приложения

Запустите контейнер приложения:

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 из приложения теперь направляются через прокси-сервер разработки.

Взаимодействие с Dev прокси-сервером

Поскольку прокси-сервер разработки выполняется в контейнере, с ним можно взаимодействовать несколькими способами:

Использование терминала

Подключение к контейнеру прокси-сервера разработки:

docker attach <container-name>

Использование API прокси для разработки

API прокси-сервера Dev доступен на порту 8897. Его можно использовать для программного управления прокси-сервером разработки:

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

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

Дополнительные сведения см. в разделе API разработки прокси.

См. также