Как использовать приложение Docker для контейнеризации всего стека приложений
Приложение Docker — это экспериментальная функция Docker, которая позволяет создавать и публиковать стеки приложений, состоящие из нескольких контейнеров. Он направлен на то, чтобы вы могли делиться стеками Docker Compose с той же простотой использования, что и обычные контейнеры Docker.
Зачем использовать приложение Docker?
Приложение Docker позволяет использовать возможности контейнера Docker во всех стеках приложений. Многие популярные программные проекты теперь имеют официальные образы Docker. Однако они могут не обязательно работать как есть: например, для работы WordPress требуется подключение к базе данных.
Контейнеризация выступает за разделение каждой службы в стеке приложений в отдельный контейнер. Докеризованная установка WordPress должна состоять из контейнера WordPress с веб-сервером, PHP и WordPress, а также выделенного контейнера базы данных MySQL.
Запуска docker run -d -p 80:80 wordpress:latest
недостаточно, чтобы все заработало. У вас будет работающий WordPress, но без подключения к базе данных. Вы можете использовать Docker Compose для настройки стека с контейнером WordPress и контейнером MySQL. На вас лежит ответственность за создание и поддержку файла Compose, даже если каждый пользователь должен будет делать что-то подобное.
Приложение Docker пытается решить эту проблему. Он позволяет создавать и запускать «пакеты приложений» из нескольких контейнеров. Их можно отправить в реестры Docker так же, как и отдельные контейнеры. Затем другие пользователи могут извлечь и запустить ваш стек приложений без необходимости писать свой собственный файл Docker Compose.
Внутренне приложение Docker реализует спецификацию Cloud Native Application Bundle (CNAB). Это межотраслевая попытка упростить определение, совместное использование и установку собственных облачных приложений с несколькими контейнерами. Он включает поддержку периферийных ресурсов, таких как тома и сети.
Клиенты CNAB, такие как приложение Docker, создают пакеты приложений CNAB, которые можно публиковать в поддерживающих реестрах. Пакет CNAB — это абстракция, которая инкапсулирует несколько контейнеров, но обрабатывается аналогично одному контейнеру при отправке в реестр.
Приложение Docker в настоящее время является экспериментальным. Он был включен в Docker CLI с версии 19.03, но может быть изменен или удален в будущем. Проект изменил направление в прошлом, и его текущий статус развития неясен. Тем не менее, версия, включенная сегодня в Docker, уже может использоваться для распространения стеков приложений с несколькими контейнерами.
Создание стека приложений Docker
Вы можете использовать интерфейс командной строки Docker для инициализации нового стека приложений.
docker app init --single-file example-app
Это создаст новый файл с именем example-app.dockerapp
в вашем рабочем каталоге. Аргумент --single-file
указывает приложению Docker объединить все файлы проекта в один файл example-app.dockerapp
. Без этого аргумента вы увидите три отдельных файла: docker-compose.yml
, metadata.yml
и parameters.yml
.
Каждый составной файл представлен в объединенном отдельном файле в виде раздела YAML. Мы используем один файл, чтобы упростить фрагменты кода в этой статье; если вы планируете сложный стек приложений, использование нескольких файлов упростит сопровождение.
Вот что делает каждый из трех разделов:
docker-compose.yml
– это обычный файл Docker Compose, определяющий контейнеры, из которых состоит ваше приложение.metadata.yml
— устанавливает основные метаданные о вашем приложении, такие как его имя, версия и описание. Вы используете его для описания всего стека приложений, а не какого-то одного контейнера.parameters.yml
— устанавливает параметры по умолчанию для переменных, используемых в вашем файле Docker Compose. Параметры определяются как простые пары ключ-значение. В вашем стеке будут использоваться эти параметры по умолчанию, если только пользователь не заменит их собственными значениями.
Единственная дополнительная настройка, необходимая помимо обычного файла Docker Compose, — это раздел метаданных. Если у вас уже есть файл Docker Compose, вы можете использовать docker app init
с флагом --compose-file
, чтобы импортировать его:
docker app init --compose-file docker-compose.yml example-app
Обновите раздел манифеста, указав имя, версию и описание вашего приложения. Затем вы можете приступить к запуску и публикации вашего приложения!
Если у вас нет готового файла Docker Compose, добавьте несколько определений контейнеров в раздел Compose конфигурации.
# 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
Этот простой стек создает контейнеры Apache и MySQL. Для каждого контейнера необходимо настроить порт хоста для привязки. Контейнеру MySQL также необходимо значение для переменной MYSQL_ROOT_PASSWORD
. Это используется MySQL во время первого запуска для установки пароля для начального пользователя root
.
Значения по умолчанию для этих переменных указаны в разделе parameters
файла приложения Docker. Эти значения будут использоваться, если вы не переопределите их при раскрутке стека приложений.
Создание образов приложений
Следующим шагом будет сборка вашего стека приложений Docker в пакет, совместимый с CNAB.
docker app build . -f example-app.dockerapp -t example-user/example-app:latest
Эта команда работает аналогично docker build
. Будет создан пакет приложений с тегом example-user/example-app:latest
. Теперь вы можете отправить этот пакет в Docker Hub!
docker app push example-user/example-app:latest
Вы успешно опубликовали свой первый стек приложений с несколькими контейнерами без необходимости вручную делиться файлом Docker Compose.
Запуск изображений приложений
Последняя часть — запустить экземпляр вашего стека:
docker app run example-user/example-app:latest --name my-app
Приложение Docker запустит новые контейнеры на основе определения в вашем комплекте приложений. Сам пакет приложений будет извлечен из Docker Hub, если он еще не существует на вашем компьютере.
Если ваш файл Compose включает такие ресурсы, как тома и сети, они будут созданы и связаны с контейнерами. Вся операция похожа на использование docker-compose up
без предварительной загрузки файла docker-compose.yml
.
Приложение будет запущено с переменными по умолчанию, определенными в его файле parameters.yml
. Вы можете переопределить любые необходимые вам переменные с помощью флага --set
:
docker app run example-user/example-app:latest --name my-app --set mysql_root_password=mysql
Вы можете изменить переменные запущенного приложения с помощью docker app update
:
docker app update my-app --set my_variable=new_value
После запуска приложения вы можете использовать docker app ls
для проверки его сведений. Используйте docker app rm my-app
, чтобы уничтожить конкретное приложение по его имени. Это приведет к удалению всех ресурсов, связанных с приложением.
Заключение
Приложение Docker — это многообещающий подход к определению, совместному использованию и запуску стеков приложений с несколькими контейнерами с помощью интерфейса командной строки Docker. Проект реализует спецификацию Cloud Native Application Bundle, предоставляя пользователям удобный абстрактный интерфейс.
Принятие приложения Docker, вероятно, останется низким, пока его статус в экосистеме Docker не будет подтвержден. Если Docker App выйдет из своего экспериментального положения, оно должно заполнить пробел между реестрами с одним контейнером и сложными облачными решениями для развертывания, такими как Helm.