Как использовать команду docker compose alpha publish для публикации Compose-приложения

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь использовать команду docker compose alpha publish для публикации приложения Docker Compose. Мы начнём с подготовки простого многоконтейнерного приложения с использованием файла docker-compose.yaml.

После подготовки вы изучите различные способы публикации приложения в репозиторий, включая публикацию с разрешёнными дайджестами образов (image digests) и включение переменных окружения в публикуемый артефакт. Этот практический опыт проведёт вас через процесс упаковки и совместного использования ваших Compose-приложений.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/ls -.-> lab-555070{{"Как использовать команду docker compose alpha publish для публикации Compose-приложения"}} docker/ps -.-> lab-555070{{"Как использовать команду docker compose alpha publish для публикации Compose-приложения"}} docker/rm -.-> lab-555070{{"Как использовать команду docker compose alpha publish для публикации Compose-приложения"}} docker/exec -.-> lab-555070{{"Как использовать команду docker compose alpha publish для публикации Compose-приложения"}} docker/inspect -.-> lab-555070{{"Как использовать команду docker compose alpha publish для публикации Compose-приложения"}} docker/pull -.-> lab-555070{{"Как использовать команду docker compose alpha publish для публикации Compose-приложения"}} docker/push -.-> lab-555070{{"Как использовать команду docker compose alpha publish для публикации Compose-приложения"}} docker/build -.-> lab-555070{{"Как использовать команду docker compose alpha publish для публикации Compose-приложения"}} end

Подготовка простого приложения Docker Compose

На этом шаге мы подготовим простое приложение Docker Compose. Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. С помощью Compose вы используете YAML-файл для настройки сервисов вашего приложения. Затем одной командой создаёте и запускаете все сервисы из конфигурации.

Сначала нам нужно установить Docker Compose. Поскольку он не предустановлен в среде LabEx, мы скачаем бинарный файл и сделаем его исполняемым.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

После загрузки и установки прав на выполнение проверьте установку, посмотрев версию.

docker-compose --version

Вы должны увидеть вывод, похожий на Docker Compose version v2.20.2.

Теперь создадим простое приложение Docker Compose. Мы создадим файл docker-compose.yaml в директории ~/project. Этот файл будет определять один сервис, запускающий веб-сервер Nginx.

Используйте редактор nano для создания и редактирования файла.

nano ~/project/docker-compose.yaml

Добавьте следующее содержимое в файл docker-compose.yaml:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

В этом файле docker-compose.yaml:

  • version: '3.8' указывает версию формата файла Compose.
  • services: определяет сервисы вашего приложения.
  • web: — имя нашего сервиса.
  • image: nginx:latest указывает Docker-образ для этого сервиса. Мы используем последнюю версию официального образа Nginx.
  • ports: сопоставляет порты хоста с контейнером. "80:80" сопоставляет порт 80 на хосте с портом 80 в контейнере.

Сохраните файл, нажав Ctrl + S, и выйдите из редактора, нажав Ctrl + X.

Перед запуском приложения нужно загрузить образ nginx:latest.

docker pull nginx:latest

Теперь мы можем запустить приложение с помощью команды docker-compose up. Флаг -d запускает контейнеры в фоновом режиме (detached mode).

docker-compose up -d

Вы должны увидеть вывод, указывающий на создание и запуск сервиса.

Чтобы проверить, что контейнер работает, используйте команду docker ps.

docker ps

Вы должны увидеть запись для сервиса web с образом nginx и статусом Up.

Наконец, вы можете протестировать сервер Nginx, обратившись к нему. Поскольку порт 80 контейнера сопоставлен с портом 80 хоста, вы можете использовать curl для доступа к localhost.

curl localhost

Вы должны увидеть HTML-код стандартной приветственной страницы Nginx.

Публикация Compose-приложения в репозиторий

На этом шаге мы научимся публиковать наше Docker Compose-приложение в репозитории. Публикация Compose-приложения обычно включает в себя общий доступ к файлу docker-compose.yaml и обеспечение доступности требуемых Docker-образов из реестра контейнеров.

Сначала остановим работающее Docker Compose-приложение из предыдущего шага. Перейдите в директорию ~/project, если вы ещё не там.

cd ~/project

Теперь остановите работающие сервисы с помощью команды docker-compose down. Эта команда останавливает и удаляет контейнеры, сети и тома, созданные командой up.

docker-compose down

Вы должны увидеть вывод, указывающий на остановку и удаление сервисов.

Для публикации Compose-приложения нам нужно предоставить общий доступ к файлу docker-compose.yaml. В реальных сценариях этот файл обычно хранится в системе контроля версий, например Git, и отправляется в репозиторий (GitHub, GitLab, Bitbucket и т.д.).

Для этой лабораторной работы мы смоделируем публикацию, создав простой текстовый файл с содержимым нашего docker-compose.yaml. Это демонстрирует основную идею совместного использования конфигурации.

Создадим файл compose_app.txt в директории ~/project и скопируем в него содержимое docker-compose.yaml.

cat ~/project/docker-compose.yaml > ~/project/compose_app.txt

Теперь можно просмотреть содержимое нового файла, чтобы убедиться, что оно совпадает с docker-compose.yaml.

cat ~/project/compose_app.txt

Вы должны увидеть YAML-содержимое вашего Compose-файла.

В реальном сценарии публикации также необходимо убедиться, что Docker-образы, указанные в файле docker-compose.yaml, доступны в реестре контейнеров. В нашем случае образ nginx:latest публично доступен в Docker Hub, поэтому для этого конкретного образа дополнительные действия не требуются. Если бы вы использовали собственные образы, их нужно было бы собрать и отправить в реестр.

Например, для пользовательского образа my-custom-app потребовалось бы выполнить сборку через docker build, а затем отправить его в реестр (например, Docker Hub) командой docker push ваш-логин-dockerhub/my-custom-app.

Чтобы смоделировать совместное использование Compose-файла, представьте, что вы передаёте файл compose_app.txt другому пользователю. Он сможет загрузить этот файл и использовать его для запуска приложения на своём компьютере (при условии, что у него установлены Docker и Docker Compose, а требуемые образы доступны).

Для демонстрации удалим исходный файл docker-compose.yaml и воссоздадим его из compose_app.txt.

rm ~/project/docker-compose.yaml
cat ~/project/compose_app.txt > ~/project/docker-compose.yaml

Теперь можно проверить, что файл docker-compose.yaml был воссоздан.

cat ~/project/docker-compose.yaml

Вы должны увидеть то же YAML-содержимое, что и ранее.

Этот шаг был посвящён концепции совместного использования Compose-файла. В следующих шагах мы рассмотрим более сложные аспекты публикации, такие как использование дайджестов образов и работа с переменными окружения.

Публикация Compose-приложения с фиксированными дайджестами образов

На этом шаге мы научимся публиковать Compose-приложение с использованием фиксированных дайджестов образов. Использование дайджестов вместо тегов (таких как latest) обеспечивает более надёжный способ гарантировать использование одного и того же конкретного образа. Теги могут обновляться и указывать на новый образ, тогда как дайджест однозначно идентифицирует конкретный слой образа.

Сначала получим дайджест для образа nginx:latest, который мы использовали в предыдущих шагах. Для этого воспользуемся командой docker inspect, чтобы получить подробную информацию об образе.

docker inspect nginx:latest --format='{{.RepoDigests}}'

Эта команда выведет дайджесты репозитория для образа nginx:latest. Вывод будет выглядеть примерно как [nginx@sha256:...]. Часть после @ — это дайджест образа. Скопируйте этот дайджест.

Теперь изменим наш файл docker-compose.yaml, чтобы использовать дайджест образа вместо тега. Откроем файл docker-compose.yaml в директории ~/project с помощью nano.

nano ~/project/docker-compose.yaml

Изменим строку image с image: nginx:latest на image: nginx@<ваш_дайджест_образа>, заменив <ваш_дайджест_образа> на скопированный дайджест. Например, если ваш дайджест был sha256:abcdef123456..., строка будет выглядеть как image: nginx@sha256:abcdef123456....

version: "3.8"
services:
  web:
    image: nginx@sha256:your_image_digest_here
    ports:
      - "80:80"

Сохраните файл, нажав Ctrl + S, и выйдите из редактора, нажав Ctrl + X.

Теперь при совместном использовании этого файла docker-compose.yaml любой пользователь будет получать именно тот образ, который указан дайджестом, независимо от того, на что в данный момент указывает тег latest.

Чтобы продемонстрировать работу Compose с дайджестами, снова запустим приложение с изменённым файлом docker-compose.yaml.

docker-compose up -d

Compose будет использовать образ, указанный дайджестом. Если образ отсутствует в системе, он будет загружен.

Можно проверить, что контейнер запущен и использует образ с указанным дайджестом, выполнив инспекцию работающего контейнера. Сначала найдём ID контейнера с помощью docker ps.

docker ps

Найдите контейнер с образом nginx и запишите его Container ID. Затем используйте docker inspect с ID контейнера, отформатировав вывод для отображения дайджеста образа.

docker inspect < container_id > --format='{{.Image}}'

Замените <container_id> на фактический ID вашего работающего контейнера Nginx. Вывод должен содержать дайджест образа, указанный в файле docker-compose.yaml.

Использование дайджестов образов в Compose-файлах — это хорошая практика для обеспечения воспроизводимости и предотвращения неожиданных изменений в приложении из-за обновлений образов.

Публикация Compose-приложения с переменными окружения

На этом шаге мы научимся включать переменные окружения в Docker Compose-приложение и как это влияет на публикацию. Переменные окружения — это распространённый способ конфигурации приложений, и Docker Compose предоставляет несколько методов для работы с ними.

Сначала остановим работающий контейнер Nginx из предыдущего шага. Перейдите в директорию ~/project, если вы ещё не там.

cd ~/project

Остановите работающие сервисы с помощью команды docker-compose down.

docker-compose down

Теперь изменим файл docker-compose.yaml, добавив переменную окружения. Мы добавим простую переменную MY_VARIABLE в сервис web. Откройте файл docker-compose.yaml в директории ~/project с помощью nano.

nano ~/project/docker-compose.yaml

Добавьте секцию environment в определение сервиса web. Укажем переменную MY_VARIABLE со значением.

version: "3.8"
services:
  web:
    image: nginx@sha256:your_image_digest_here ## Замените на ваш дайджест
    ports:
      - "80:80"
    environment:
      - MY_VARIABLE=HelloFromCompose

Не забудьте заменить your_image_digest_here на фактический дайджест образа, полученный на предыдущем шаге.

Сохраните файл, нажав Ctrl + S, и выйдите из редактора, нажав Ctrl + X.

Теперь при запуске приложения через docker-compose up переменная MY_VARIABLE будет установлена внутри контейнера Nginx.

docker-compose up -d

Чтобы проверить установку переменной внутри контейнера, выполним команду через docker exec. Сначала найдём ID контейнера с помощью docker ps.

docker ps

Запомните Container ID работающего контейнера Nginx. Затем используйте docker exec для выполнения команды printenv внутри контейнера с фильтрацией вывода по MY_VARIABLE.

docker exec < container_id > printenv | grep MY_VARIABLE

Замените <container_id> на фактический ID вашего контейнера. Вы должны увидеть вывод вида MY_VARIABLE=HelloFromCompose.

При публикации Compose-приложения с переменными окружения необходимо учитывать, как эти переменные будут предоставлены в целевой среде.

Распространённый подход — использование файла .env. Docker Compose автоматически ищет файл с именем .env в директории с docker-compose.yaml. Вы можете определить переменные окружения в этом файле, и Compose загрузит их.

Создадим файл .env в директории ~/project.

nano ~/project/.env

Добавьте следующее содержимое в файл .env:

ANOTHER_VARIABLE=ThisIsFromDotEnv

Сохраните файл и выйдите из nano.

Теперь изменим файл docker-compose.yaml для использования новой переменной. Снова откройте файл.

nano ~/project/docker-compose.yaml

Добавьте ANOTHER_VARIABLE в секцию environment.

version: "3.8"
services:
  web:
    image: nginx@sha256:your_image_digest_here ## Замените на ваш дайджест
    ports:
      - "80:80"
    environment:
      - MY_VARIABLE=HelloFromCompose
      - ANOTHER_VARIABLE

Обратите внимание, что для ANOTHER_VARIABLE мы просто указали имя переменной. Compose будет искать эту переменную в окружении, где выполняется docker-compose up, включая переменные из файла .env.

Сохраните файл и выйдите из nano.

Теперь остановите и перезапустите приложение для применения изменений.

docker-compose down
docker-compose up -d

Получите новый ID контейнера с помощью docker ps.

docker ps

Проверьте обе переменные внутри контейнера:

docker exec < container_id > printenv | grep MY_VARIABLE
docker exec < container_id > printenv | grep ANOTHER_VARIABLE

Замените <container_id> на новый Container ID. В выводе должны отобразиться обе переменные: MY_VARIABLE=HelloFromCompose и ANOTHER_VARIABLE=ThisIsFromDotEnv.

При публикации обычно предоставляют файл docker-compose.yaml и инструкции по настройке переменных окружения — через файл .env или установку напрямую в окружении. Конфиденциальные данные не следует хранить в docker-compose.yaml или .env — для них следует использовать специализированные решения для управления секретами.

Итоги

В этой лабораторной работе мы научились подготавливать простое Docker Compose-приложение. Это включало установку Docker Compose, проверку его установки и создание файла docker-compose.yaml для определения базового веб-сервиса на Nginx. Мы также загрузили необходимый Docker-образ (nginx:latest) для последующего запуска приложения.

Последующие шаги, которые не были полностью раскрыты в предоставленном материале, вероятно, охватывали бы публикацию этого Compose-приложения в репозитории с использованием команды docker compose alpha publish. Это включало бы изучение таких возможностей, как публикация с фиксированными дайджестами образов и включение переменных окружения в опубликованное определение приложения.