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


Переход с Docker Compose на Aspire

Это руководство поможет вам понять, как перенести приложения из Docker Compose в Aspire, выделяя основные концептуальные различия и предоставляя практические примеры для распространенных сценариев миграции.

Общие сведения о различиях

Хотя Docker Создание и Aspire на первый взгляд могут показаться похожими, они служат различным целям и работают на разных уровнях абстракции.

Docker Создание vs Aspire

Docker Создать Aspire
Основная цель Оркестрация контейнеров Оркестрация на стадии разработки и композиция приложений.
Объем Контейнер-ориентированный Мультиресурс (контейнеры, проекты, .NET облачные ресурсы).
Конфигурация На основе YAML Основанный на C#, строго типизированный.
Целевая среда Любая Docker среда выполнения Разработка и облачное развертывание.
Обнаружение служб Обнаружение контейнеров на основе DNS Встроенное обнаружение служб с переменными среды.
Опыт разработки Управление контейнерами вручную Интегрированные средства, панель мониторинга и телеметрия.

Дополнительные сведения см. в справочнике по API Compose to AppHost.

Основные концептуальные сдвиги

При миграции из Docker Compose в Aspire, следует учитывать следующие концептуальные различия:

  • С YAML на C#: конфигурация переходит от декларативного YAML к императивному строго типизированному коду C#.
  • От контейнеров к ресурсам: Aspire управляет не только контейнерами, но .NET и проектами, исполняемыми файлами, параметрами, всеми ресурсами.
  • От вручную управляемой сети к обнаружению сервисов: Aspire автоматически настраивает строки обнаружения сервисов и подключения.
  • От пробелов в разработке до интегрированного интерфейса: Aspire предоставляет панель мониторинга, телеметрию и интеграцию отладки.

Полное сопоставление Docker синтаксиса Compose YAML с Aspire вызовами API C#, см. в Docker справочнике API Compose to Aspire AppHost.

Связанные ссылки:

Распространенные шаблоны миграции

В этом разделе показаны практические сценарии миграции, которые, скорее всего, возникают при переходе из Docker Compose в Aspire. Каждая модель показывает полный пример Docker Compose со своим эквивалентом Aspire, подчеркивая ключевые различия и преимущества миграции.

Подразумеваемые шаблоны включают:

  • Веб-приложения с несколькими службами с компонентами интерфейса, API и базы данных.
  • Контейнерные службы с использованием существующих Docker образов.
  • Стратегии управления переменными среды и конфигурацией.
  • Пользовательские сети и тома для постоянного хранения данных и изолирования служб.

Эти примеры представляют наиболее распространенные варианты использования, но Aspireгибкость позволяет выполнять многие другие сценарии. Если конкретный вариант использования не рассматривается здесь, вы можете объединить эти шаблоны или ознакомиться с полным справочником по API выше.

Веб-приложение с несколькими службами

Docker Пример составления:

version: '3.8'
services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    depends_on:
      - api
    environment:
      - API_URL=http://api:5000

  api:
    build: ./api
    ports:
      - "5000:5000"
    depends_on:
      - database
    environment:
      - ConnectionStrings__DefaultConnection=Host=database;Database=myapp;Username=postgres;Password=secret

  database:
    image: postgres:15
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Aspire эквивалентный:

var builder = DistributedApplication.CreateBuilder(args);

// Add the database
var database = builder.AddPostgres("postgres")
    .WithEnvironment("POSTGRES_DB", "myapp")
    .AddDatabase("myapp");

// Add the API project
var api = builder.AddProject<Projects.MyApp_Api>("api")
    .WithReference(database);

// Add the frontend project  
var frontend = builder.AddProject<Projects.MyApp_Frontend>("frontend")
    .WithReference(api);

builder.Build().Run();

Основные различия:

  • Зависимости служб: depends_on становится WithReference(), которое также настраивает обнаружение служб.
  • Переменные среды: строки подключения автоматически создаются и инжектируются.
  • Контекст сборки: контекст сборки может использовать Dockerfiles, проекты, .NETNode.js приложения и многое другое вместо просто Dockerfile сборок.
  • Сохраняемость данных: тома автоматически управляются Aspire.

Службы на основе контейнеров

Docker Пример составления:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - redis
      - postgres

  redis:
    image: redis:7
    ports:
      - "6379:6379"

  postgres:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Aspire эквивалентный:

var builder = DistributedApplication.CreateBuilder(args);

// Add backing services
var cache = builder.AddRedis("redis");
var database = builder.AddPostgres("postgres", password: "secret")
    .AddDatabase("main");

// Add the containerized web application
var web = builder.AddContainer("web", "myapp:latest")
    .WithHttpEndpoint(port: 8080, targetPort: 8080)
    .WithReference(cache)
    .WithReference(database);

builder.Build().Run();

Переменные среды и конфигурация

Docker Подход составления:

services:
  app:
    image: myapp:latest
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/myapp
      - REDIS_URL=redis://cache:6379
      - API_KEY=${API_KEY}
      - LOG_LEVEL=info

Aspire подход:

var builder = DistributedApplication.CreateBuilder(args);

// Add external parameter
var apiKey = builder.AddParameter("apiKey", secret: true);

var database = builder.AddPostgres("db")
    .AddDatabase("myapp");
    
var cache = builder.AddRedis("cache");

var app = builder.AddContainer("app", "myapp:latest")
    .WithReference(database)      // Automatically sets DATABASE_URL
    .WithReference(cache)         // Automatically sets REDIS_URL  
    .WithEnvironment("API_KEY", apiKey)
    .WithEnvironment("LOG_LEVEL", "info");

builder.Build().Run();

Основные различия:

  • Строки автоматического подключения: URL-адреса базы данных и кэша создаются автоматически.
  • Типизированные параметры: внешняя конфигурация использует строго типизированные параметры вместо подстановки переменных среды.
  • Обнаружение служб. Ссылки автоматически настраивают правильные конечные точки службы.

Пользовательские сети и тома

Docker Пример составления:

version: '3.8'
services:
  app:
    image: myapp:latest
    volumes:
      - app_data:/data
      - ./config:/app/config:ro
    networks:
      - backend

  worker:
    image: myworker:latest
    volumes:
      - app_data:/shared
    networks:
      - backend

networks:
  backend:

volumes:
  app_data:

Aspire эквивалентный:

var builder = DistributedApplication.CreateBuilder(args);

// Create a named volume
var appData = builder.AddVolume("app-data");

var app = builder.AddContainer("app", "myapp:latest")
    .WithVolume(appData, "/data")
    .WithBindMount("./config", "/app/config", isReadOnly: true);

var worker = builder.AddContainer("worker", "myworker:latest")
    .WithVolume(appData, "/shared");

builder.Build().Run();

Основные различия:

  • Упрощенная сеть: Aspire автоматически обрабатывает сети контейнеров.
  • Управление томами. Именованные тома создаются и управляются с помощью модели ресурсов.
  • Привязочные монтирования: каталоги хоста можно смонтировать с помощью WithBindMount().

Связанные ссылки:

Стратегия миграции

Для успешной миграции из Docker Compose в Aspire требуется систематический подход. Следующие шаги предоставляют проверенную методологию перемещения приложений, минимизируя нарушения и обеспечивая правильную работу всех компонентов в новой среде.

1. Оценка текущей настройки

Перед миграцией выполните инвентаризацию Docker настроек Compose:

  • Службы: определение всех служб, включая базы данных, кэши, API и веб-приложения.
  • Зависимости: построение карты зависимостей служб из объявлений.
  • Сохраняемость данных: каталог всех томов и привязываемых подключений, используемых для хранения данных.
  • Переменные среды: вывод списка всех переменных конфигурации и секретов.
  • Пользовательские сети: определение любых пользовательских требований к сети и конфигураций.

2. Создайте Aspire AppHost

Начните с создания проекта Aspire :

dotnet new aspire-apphost -o MyApp.AppHost

3. Постепенно переносить службы

Перенос служб по одному, начиная с резервных служб (баз данных, кэшей), а затем приложений:

  1. Добавьте такие службы, как PostgreSQL, Redis, и другие компоненты инфраструктуры.
  2. Преобразование .NET приложений в ссылки на проекты для улучшения интеграции.
  3. Преобразуйте другие контейнеры, используя AddContainer() для существующих Docker образов.
  4. Настройте зависимости с WithReference(), чтобы установить связи служб.
  5. Настройте переменные среды и параметры для управления конфигурацией.

4. Обработка миграции данных

Для постоянных данных:

  • Используйте WithVolume() именованные тома, которые должны сохранять данные.
  • Используйте WithBindMount() для монтирования каталога узла, если требуется прямой доступ к файлам узла.
  • Следует рассмотреть использование WithDataVolume() для устойчивости базы данных с автоматическим управлением томами.

5. Тестирование и проверка

  • Aspire Запустите AppHost и проверьте правильность запуска всех служб.
  • Проверьте панель мониторинга, чтобы подтвердить работоспособность службы и состояние подключения.
  • Убедитесь, что взаимодействие между службами работает должным образом.
  • Протестируйте существующие клиентские приложения, чтобы обеспечить совместимость.

Связанные ссылки:

Устранение неполадок миграции

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

Распространенные проблемы и решения

Обнаружение служб не работает

  • Убедитесь, что вы используете WithReference() для установления зависимостей между службами.
  • Убедитесь, что службы используют правильные имена переменных среды для подключений.
  • Проверьте панель мониторинга, чтобы проверить правильность внедрения переменных среды.

Сбой подключений к базе данных

  • Убедитесь, что база данных полностью запущена до того, как зависимые службы попытаются подключиться.

  • Используйте WaitFor() для обеспечения правильного порядка запуска:

    var api = builder.AddProject<Projects.Api>("api")
        .WithReference(database)
        .WaitFor(database);
    

Проблемы с монтированием томов

  • Используйте абсолютные пути для привязок, чтобы избежать проблем с определением путей.
  • Убедитесь, что каталог узла существует и имеет соответствующие разрешения перед подключением.
  • Рекомендуется использовать именованные тома вместо привязок, где это возможно для повышения переносимости.

Конфликты портов

  • Aspire автоматически назначает порты, чтобы избежать конфликтов между службами.
  • Используйте WithHttpEndpoint() для указания пользовательских портов при необходимости для внешнего доступа.
  • Проверьте панель мониторинга, чтобы найти действительно назначенные порты во время разработки.

Связанные ссылки:

Дальнейшие шаги

После миграции в Aspire:

См. также