Введение
В этой лабораторной работе вы научитесь использовать команду docker compose alpha publish для публикации приложения Docker Compose. Мы начнём с подготовки простого многоконтейнерного приложения с использованием файла docker-compose.yaml.
После подготовки вы изучите различные способы публикации приложения в репозиторий, включая публикацию с разрешёнными дайджестами образов (image digests) и включение переменных окружения в публикуемый артефакт. Этот практический опыт проведёт вас через процесс упаковки и совместного использования ваших Compose-приложений.
Подготовка простого 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. Это включало бы изучение таких возможностей, как публикация с фиксированными дайджестами образов и включение переменных окружения в опубликованное определение приложения.



