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

Краткое содержание
- Что такое 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 бандл (мини-процесс)
- Подготовка: собрать и проверить каждый сервис как отдельный образ.
- Compose: сформировать docker-compose.yml с параметрами вместо жёстко заданных значений.
- Параметры: вынести значения по умолчанию в parameters.yml и пометить секреты как обязательные к передаче извне.
- Metadata: заполнить metadata.yml (имя, версия, описание, автор, лицензия).
- Сборка:
docker app buildи тестовый запуск локально. - Тестирование: автоматические тесты smoke, проверка зависимостей ресурсов.
- Публикация: push в защищённый или публичный реестр с пометкой версии.
- Обновления: при изменениях версионировать бандл и документировать обратную совместимость.
Критерии приёмки
- Бандл успешно собирается и публикуется в реестр
docker app runразворачивает все сервисы без ручной правки манифестов- Параметры можно переопределять при запуске
- Секреты не попадают в публичный репозиторий
- Документация: инструкция по использованию и список обязательных параметров
Технические советы и отладка
- Если контейнеры не стартуют — проверьте логи через
docker logsи убедитесь, что параметры передаются корректно. - Если ресурсы (volumes/networks) конфликтуют — проверьте имена и scope в манифесте.
- Для отладки сборки используйте локальные теги и заранее подтянутые образы.
Советы по миграции от docker-compose к Docker App
- Вставьте текущий docker-compose.yml в секцию compose при инициализации.
- Вынесите все переменные окружения в параметры; оставьте только безопасные значения.
- Протестируйте локально
docker app runи сравните поведение сdocker-compose up. - Если используется CI, добавьте шаг сборки и публикации бандла в pipeline.
Модели зрелости использования (уровни)
- Уровень 0 — локальная разработка с docker-compose.
- Уровень 1 — автор создал Docker App бандл для упрощённого распространения в команде.
- Уровень 2 — бандлы публикуются в приватный реестр и используются в тестовых средах.
- Уровень 3 — интеграция с CI/CD и секрет-менеджером; бандлы версионируются и сопровождаются политикой релизов.
Пример рабочего сценария (шаблон действий)
- Разработчик создаёт
example-app.dockerapp. - Собирает бандл:
docker app build. - Пушит бандл:
docker app push. - Оператор запускает бандл в тестовой среде:
docker app runи передаёт секреты через--setили интеграцию. - Мониторинг и бэкапы настраиваются отдельно.
Частые ошибки и как их избегать
- Хранение секретов в репозитории — используйте внешние менеджеры.
- Неправильные теги образов — стандартизируйте формат тегов (версии 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-развёртываний.
Похожие материалы
Как оставаться мобильным без смартфона
Перекрёстные ссылки в Microsoft Word
Тени в PowerPoint: как добавить drop shadow
Как поставить пароль на файлы и папки на Mac
Windows на Raspberry Pi через тонкий клиент