Loading...

CONTAINER APPS · ПРАКТИЧЕСКИЙ ПРИМЕР

От docker-compose.yml до работающего приложения — в панели и с cdnctl

Полное пошаговое руководство, готовое для копирования, для разработчиков, которые хотят быстро попробовать платформу. Мы берём небольшой, но реалистичный многосервисный проект — веб-API, фоновый воркер и управляемые Postgres + Redis — и запускаем его на CDN.com.tr Managed Containers прямо из одного файла docker-compose.yml. Тот же сценарий показан двумя способами: мышью из панели управления и целиком через CLI cdnctl. Выбирайте, какой вам удобнее.

Что вы получите в итоге

Два управляемых app (web, worker), каждое подключено к управляемым аддонам Postgres и Redis, и веб-приложение, работающее на собственном субдомене https://<uid>.cdn.com.tr — всё создано из compose-файла, без Dockerfile или YAML для Kubernetes.

Пример проекта

Сервис web считает посещения в Postgres и кеширует последнее значение счётчика в Redis; worker — это фоновый цикл без порта, использующий те же управляемые аддоны. Оба образа заранее собраны и запушены в registry, который платформа может забрать (собраны под linux/amd64). Платформа автоматически внедряет данные подключения — ваш код просто читает DATABASE_URL и REDIS_URL.

# docker-compose.yml
services:
  web:
    image: mediatriple/compose-demo-web:1.0.0
    ports:
      - "8080:8080"          # container port 8080 is exposed; the host side is ignored
    environment:
      APP_NAME: "Compose Demo"
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]
    depends_on: [db, cache]

  worker:
    image: mediatriple/compose-demo-worker:1.0.0   # no port -> stays private
    depends_on: [db, cache]

  db:
    image: postgres:16     # -> managed Postgres add-on (DATABASE_URL injected)

  cache:
    image: redis:7         # -> managed Redis add-on (REDIS_URL injected)

Как сопоставляются сервисы. Каждый сервис с заранее собранным образом становится управляемым app. Сервисы, чей образ — postgres, mysql/mariadb, redis или nats, становятся управляемыми аддонами и подключаются к каждому app, который от них depends_on — каждое потребляющее app получает собственный экземпляр аддона, а учётные данные внедряются как env (DATABASE_HOST/PORT/NAME/USER, REDIS_URL) и секреты (DATABASE_PASSWORD, DATABASE_URL). Сервис с build: (без заранее собранного образа) отклоняется — сначала опубликуйте образ. Максимум 20 сервисов.

A · Из панели

1 · Откройте Container Apps

Войдите в систему, откройте CDN Accounts, нажмите на значок настроек у вашего аккаунта, выберите вкладку Platforms, затем Container Apps (в первый раз нажмите Activate). Обзор показывает лимиты вашего пакета и пустой список приложений.

Обзор Container Apps с применёнными лимитами пакета
Обзор: применённые лимиты (app / object-storage / Redis / DB), счётчики аддонов и Create App.

2 · (Приватные образы) добавьте учётные данные registry

Если ваши образы приватные, откройте Create App и в строке Private registry credential добавьте имя, URL registry (https://index.docker.io/v1/ для Docker Hub), ваше имя пользователя и токен доступа только для чтения, затем сохраните. Токен хранится зашифрованным и больше никогда не показывается. Публичные образы не требуют учётных данных.

Форма создания container app со строкой учётных данных registry
Панель Create-App. Вкладка Import From Docker Compose находится рядом с Create; учётные данные registry — прямо над ней.

3 · Import From Docker Compose

Переключитесь на Import From Docker Compose, затем загрузите или вставьте ваш docker-compose.yml (максимум 256 КБ).

Диалог импорта Docker Compose
Вставьте compose-файл. Сохранённые учётные данные registry прикрепляются для приватных образов.
Compose-файл, вставленный в поле импорта
Compose-файл на месте — готов к предпросмотру.

4 · Просмотрите план

Нажмите Preview. Платформа разбирает файл и показывает неразрушающий план: каждое app, которое будет создано, образ/порт/реплики, подключённые аддоны и все предупреждения — пока ничего ещё не тронуто.

План предпросмотра импорта compose
План: web (порт 8080) и worker, у каждого аддоны Redis + Postgres. Предупреждение отмечает, что сопоставления host-порта игнорируются — вы публикуете app через поток expose/domain платформы.

5 · Примените, наблюдайте за деплоем

Отметьте I have reviewed this plan и нажмите Apply Import. Apply работает по принципу всё-или-ничего; app и аддоны создаются, деплои ставятся в очередь. В течение минуты app переходят в running в списке Your apps.

Два container app, работающие после импорта
Оба app (web и worker) работают в списке Your apps. Откройте app (Manage →), чтобы попасть к его аддонам и действию Expose on cdn.com.tr.

6 · Опубликуйте веб-приложение

Откройте app web (Manage →) и нажмите Expose on cdn.com.tr, чтобы мгновенно создать субдомен <uid>.cdn.com.tr (HTTPS настраивается за вас). Оставьте worker приватным. Вот и всё — ваш compose-проект работает. Смотрите результат ↓

B · Из терминала (cdnctl)

У каждого шага выше есть эквивалент в CLI. Установите cdnctl, затем:

1 · Войдите и найдите свой аккаунт

cdnctl login --email you@example.com --password '••••••'
cdnctl accounts list                 # copy your account <uuid>

2 · Просмотрите план

Тот же неразрушающий план, что и в панели — возвращает app, аддоны и предупреждения в виде JSON. Предпросмотр всегда возвращает только ключи env/secret, никогда не значения.

cdnctl container compose preview --account <uuid> --file docker-compose.yml

3 · Примените

Заново планирует на стороне сервера (клиентскому плану никогда не доверяют), применяет права вашего пакета, затем создаёт app в порядке зависимостей.

cdnctl container compose apply --account <uuid> --file docker-compose.yml --yes

Приватные образы. Создайте учётные данные registry один раз (панель → Private registry credential, или API) и прикрепите их к app, чтобы платформа могла их забрать — публичным образам ничего не нужно.

4 · Наблюдайте, публикуйте, проверяйте

cdnctl container apps list   --account <uuid>
cdnctl container apps wait   --account <uuid> --app <app_uuid> --status running --timeout 300
cdnctl container apps expose --account <uuid> --app <app_uuid>   # -> <uid>.cdn.com.tr
cdnctl container apps logs   --account <uuid> --app <app_uuid> --tail 100
cdnctl container apps status --account <uuid> --app <app_uuid>

Результат

Веб-приложение работает на своём субдомене cdn.com.tr — счётчик посещений хранится в управляемом аддоне Postgres, кешируется в управляемом аддоне Redis, оба сообщают connected, обслуживает управляемая реплика.

Развёрнутое демо-приложение, работающее на субдомене cdn.com.tr
Работающее приложение, импортированное из docker-compose.yml и обслуживаемое на <uid>.cdn.com.tr.

Что нужно знать об общем состоянии. Поскольку каждое app получает собственный управляемый Postgres/Redis, worker пишет в другую базу данных, чем читает web. Чтобы по-настоящему разделить SQL-базу данных, пусть одно app владеет ею, а остальные обращаются к нему по имени app через приватную сеть (http://<имя-app>:<порт>) — точно как сервис compose. Бэкенды без пароля (Redis, NATS) можно разделять, задав их URL как env на каждом потребителе.