Гид по технологиям

Docker App — многоконтейнерные приложения с CNAB

8 min read DevOps Обновлено 18 Dec 2025
Docker App — CNAB для многоконтейнерных стеков
Docker App — CNAB для многоконтейнерных стеков

Изображение Docker: логотип и схема контейнеров

Краткое содержание

  • Что такое Docker App и зачем он нужен
  • Как создать, собрать и опубликовать пакет приложения (CNAB)
  • Как запустить и управлять развернутым стеком
  • Альтернативы, сценарии использования, безопасность и чеклисты для ролей

Зачем использовать Docker App

Docker App расширяет знакомый опыт работы с контейнерами на весь стек приложения. Вместо того чтобы требовать от пользователей скачивания и настройки docker-compose.yml, авторы ПО могут упаковать несколько контейнеров, параметры и метаданные в один переносимый артефакт (CNAB bundle). Это удобно для распространения приложений, которые зависят от нескольких сервисов (например, фронтенд + БД + кэш).

Ключевая идея: CNAB (Cloud Native Application Bundle) — это манифест + набор контейнеров/артефактов и инструкции по установке. Docker App выступает CNAB-клиентом, который формирует такой пакет и умеет его публиковать в реестр и запускать локально.

Важно: Docker App встраивается в Docker CLI начиная с версии 19.03, но остаётся экспериментальным. Интерфейс и возможности могут измениться или быть удалены в будущем.

Основные понятия (одно предложение каждое)

  • CNAB: формат для упаковки многоконтейнерных приложений и сопутствующих действий установки.
  • Бандл (bundle): сам упакованный артефакт CNAB, который можно хранить в реестре.
  • Параметры (parameters): настраиваемые значения, которые задаются по умолчанию и которые можно переопределить при запуске.

Быстрые ссылки

  • Почему использовать Docker App
  • Создание Docker App стека
  • Сборка артефакта приложения
  • Запуск и управление приложением
  • Безопасность, альтернативы и чеклисты

Создание Docker App стека

Начать можно с инициализации пустого приложения через CLI:

docker app init --single-file example-app

Эта команда создаст файл example-app.dockerapp в рабочей директории. Флаг --single-file указывает объединить все части манифеста в один файл. Без него вы увидите три отдельных файла: docker-compose.yml, metadata.yml и parameters.yml.

Что делает каждая секция:

  • docker-compose.yml — определение сервисов (контейнеров) и их связей.
  • metadata.yml — имя приложения, версия, описание и прочая общая информация.
  • parameters.yml — значения по умолчанию для переменных, используемых в docker-compose, в виде ключ: значение.

Если у вас уже есть docker-compose.yml, можно импортировать его:

docker app init --compose-file docker-compose.yml example-app

Отредактируйте секцию metadata: задайте понятное имя, версию и описание. Эти поля будут видны пользователям при установке или при просмотре информации о бандле.

Если compose ещё нет — добавьте определения сервисов в секцию compose вашего .dockerapp файла. Пример минимального стека (Apache + MySQL) и параметры по умолчанию приведены ниже.

# Application services - equivalent to docker-compose.yml.

---

services:
  apache:
    image: httpd:latest
    ports:
      - ${apache_port}:80
  mysql:
    image: mysql:latest
    ports:
      - ${mysql_port}:3306
    environment:
      - MYSQL_ROOT_PASSWORD=${mysql_root_password}

---

# Default application parameters - equivalent to parameters.yml.

apache_port: 80
mysql_port: 3306
mysql_root_password: mysql

Пояснение: Контейнерам заданы порты через параметры, а для MySQL задан переменный пароль root. Значения в нижней секции используются как значения по умолчанию и могут быть переопределены пользователем при запуске.

Примечание: для реальных развёртываний используйте надёжные пароли и секреты; не храните секреты в открытом виде в параметрах по умолчанию.

Сборка артефакта (CNAB bundle)

Когда манифест готов, соберите бандл:

docker app build . -f example-app.dockerapp -t example-user/example-app:latest

Это похоже на docker build, но создаёт CNAB-бандл и помечает его тегом example-user/example-app:latest. После этого бандл можно отправить в реестр:

docker app push example-user/example-app:latest

После пуша другие пользователи смогут выполнить docker app run и развернуть ваше приложение, не имея локальной копии docker-compose.yml.

Запуск и управление бандлом

Запуск бандла локально:

docker app run example-user/example-app:latest --name my-app

Если бандл отсутствует локально, Docker App подтянет его из реестра. Ресурсы (volumes, networks) будут созданы автоматически в соответствии с описанием.

Переопределение параметров при старте:

docker app run example-user/example-app:latest --name my-app --set mysql_root_password=secret123

Изменение параметров для уже запущенного приложения:

docker app update my-app --set mysql_root_password=new_secret

Просмотр запущенных приложений:

docker app ls

Удаление приложения и всех связанных ресурсов:

docker app rm my-app

Важно: docker app rm удаляет ресурсы, созданные бандлом, но в зависимости от конфигурации тома могут остаться данные, если они были объявлены как внешние.

Технические ограничения и сценарии, когда Docker App не подходит

  • Экспериментальный статус: проект может меняться или прекратиться. Для критичных корпоративных установок учитывайте риск поддержки.
  • Сложные облачные сценарии: для production-кластеров (Kubernetes, многоузловые системы) привычнее использовать Helm или операторы, а не локальные CNAB-бандлы.
  • Управление секретами: встроенный механизм параметров не заменяет специализированные секрет-менеджеры (Vault, AWS Secrets Manager). Не храните чувствительные данные в открытом виде в репозитории.

Контрпример: если ваша цель — развёртывание в Kubernetes с конфигурациями, зависящими от кластера (Ingress, поды с NodeSelectors и т.д.), то Helm или Kustomize будут удобнее.

Альтернативы и когда выбрать их

  • Docker Compose: простая локальная разработка и запуск стека; хорош для dev и CI.
  • Helm: развёртывание в Kubernetes с сильной поддержкой шаблонов и lifecycle.
  • Kustomize: настройка YAML для Kubernetes без шаблонов.
  • Operators: для сложных stateful-приложений в Kubernetes.

Рекомендация: используйте Docker App, если хотите транспарентный переносимый бандл для локальной установки и хотите хранить параметры/метаданные вместе с определением сервисов.

Безопасность и приватность

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

Примечание: CNAB сам по себе не диктует способ хранения секретов — это ответственность автора бандла и процессов CI/CD.

Чеклист для ролей

  • Разработчик

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

    • Собрать бандл с корректным тегом версии
    • Протестировать push/pull из целевого реестра
    • Обновить метаданные: CHANGELOG, версия
  • Оператор/DevOps

    • Проверить, какие сетевые порты и тома создаёт бандл
    • Интегрировать с системой мониторинга и бэкапов
    • Настроить секрет-менеджер и обеспечить безопасное заполнение параметров

Методология: как подготовить надёжный Docker App бандл (мини-процесс)

  1. Подготовка: собрать и проверить каждый сервис как отдельный образ.
  2. Compose: сформировать docker-compose.yml с параметрами вместо жёстко заданных значений.
  3. Параметры: вынести значения по умолчанию в parameters.yml и пометить секреты как обязательные к передаче извне.
  4. Metadata: заполнить metadata.yml (имя, версия, описание, автор, лицензия).
  5. Сборка: docker app build и тестовый запуск локально.
  6. Тестирование: автоматические тесты smoke, проверка зависимостей ресурсов.
  7. Публикация: push в защищённый или публичный реестр с пометкой версии.
  8. Обновления: при изменениях версионировать бандл и документировать обратную совместимость.

Критерии приёмки

  • Бандл успешно собирается и публикуется в реестр
  • docker app run разворачивает все сервисы без ручной правки манифестов
  • Параметры можно переопределять при запуске
  • Секреты не попадают в публичный репозиторий
  • Документация: инструкция по использованию и список обязательных параметров

Технические советы и отладка

  • Если контейнеры не стартуют — проверьте логи через docker logs и убедитесь, что параметры передаются корректно.
  • Если ресурсы (volumes/networks) конфликтуют — проверьте имена и scope в манифесте.
  • Для отладки сборки используйте локальные теги и заранее подтянутые образы.

Советы по миграции от docker-compose к Docker App

  1. Вставьте текущий docker-compose.yml в секцию compose при инициализации.
  2. Вынесите все переменные окружения в параметры; оставьте только безопасные значения.
  3. Протестируйте локально docker app run и сравните поведение с docker-compose up.
  4. Если используется CI, добавьте шаг сборки и публикации бандла в pipeline.

Модели зрелости использования (уровни)

  • Уровень 0 — локальная разработка с docker-compose.
  • Уровень 1 — автор создал Docker App бандл для упрощённого распространения в команде.
  • Уровень 2 — бандлы публикуются в приватный реестр и используются в тестовых средах.
  • Уровень 3 — интеграция с CI/CD и секрет-менеджером; бандлы версионируются и сопровождаются политикой релизов.

Пример рабочего сценария (шаблон действий)

  1. Разработчик создаёт example-app.dockerapp.
  2. Собирает бандл: docker app build.
  3. Пушит бандл: docker app push.
  4. Оператор запускает бандл в тестовой среде: docker app run и передаёт секреты через --set или интеграцию.
  5. Мониторинг и бэкапы настраиваются отдельно.

Частые ошибки и как их избегать

  • Хранение секретов в репозитории — используйте внешние менеджеры.
  • Неправильные теги образов — стандартизируйте формат тегов (версии semver).
  • Ожидание встроенного управления конфигурацией для production — Docker App удобен для распределения, но не заменяет полноценную систему оркестрации.

Короткое объявление (100–200 слов)

Docker App — экспериментальная функция в Docker CLI, которая реализует спецификацию CNAB и позволяет авторам упаковывать многоконтейнерные стеки в единый переносимый бандл. Такой бандл включает описание сервисов, параметры по умолчанию и метаданные, после чего его можно публиковать в реестре и запускать командой docker app run без необходимости вручную распространять docker-compose.yml. Это удобно для типичных связок (например, CMS + база данных), ускоряет onboarding новых пользователей и упрощает локальные тесты. Однако проект остаётся экспериментальным, поэтому для production-оркестрации и управления секретами следует использовать проверенные решения и интегрировать бандлы с существующими CI/CD процессами.

Короткая сводка

  • Docker App упрощает распространение многоконтейнерных стеков.
  • CNAB объединяет контейнеры, параметры и метаданные в один бандл.
  • Не заменяет полноценную оркестрацию и управление секретами.

Ссылки и дальнейшие шаги

  • Попробуйте создать простой бандл из вашего docker-compose и протестировать docker app run.
  • Интегрируйте сборку бандла в CI как отдельный шаг публикации.
  • При планировании перехода на Kubernetes рассмотрите Helm/Kustomize для production.

Резюме

Docker App — удобный инструмент для упаковки и распространения многоконтейнерных приложений в виде CNAB-бандлов. Он хорош для упрощения локальной установки и передачи готовых стеков пользователям. При этом важно учитывать экспериментальный статус, безопасно работать с секретами и выбирать подходящую стратегию для production-развёртываний.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как оставаться мобильным без смартфона
Технологии

Как оставаться мобильным без смартфона

Перекрёстные ссылки в Microsoft Word
Microsoft Word

Перекрёстные ссылки в Microsoft Word

Тени в PowerPoint: как добавить drop shadow
Дизайн слайдов

Тени в PowerPoint: как добавить drop shadow

Как поставить пароль на файлы и папки на Mac
Безопасность

Как поставить пароль на файлы и папки на Mac

Windows на Raspberry Pi через тонкий клиент
Raspberry Pi

Windows на Raspberry Pi через тонкий клиент

Как добавить физическую подпись в Photoshop
Руководство

Как добавить физическую подпись в Photoshop