Руководство по Docker. Часть 1: образ, контейнер, сопоставление портов и основные команды.
Во второй части руководства по Docker рассмотрим программное обеспечение Docker Compose для раздельного запуска сложного веб-приложения в нескольких контейнерах.
Docker Compose — это инструмент для запуска мультиконтейнерных приложений на Docker, определенных с помощью формата файлов Compose.
Скоро вы поймете смысл этого определения. Сперва создадим два контейнера для приложения, хранящего данные о том, “сколько раз его посетили”. Мы не затронем аспект веб-программирования, а поговорим исключительно про Docker.
Содержание:
- Создание образа Docker-контейнера.
- Запуск приложения с Redis в двух контейнерах.
- Docker Compose против Docker CLI.
- Политика автоматического перезапуска.
- Выводы.
1. Создание образа Docker-контейнера
Dockerfile для счетчика посещений сайта на Node.js
Пришло время создать dockerfile
для вышеизложенного приложения, а следом — собрать образ. Вы помните, как создать dockerfile
?
- Определите базовый образ.
- Установите рабочий каталог, чтобы разделить файлы по директориям.
- Скопируйте с локального хранилища в контейнер необходимые для запуска веб-приложения файлы.
- Установите все зависимости.
- Установите команду по умолчанию для запуска приложения вместе с контейнером.
Самостоятельно подумайте над следующими вопросами (подсказки можно найти в первой части руководства по Docker):
- Что делает строчка
WORKDIR '/app'
? - Почему строчка
COPY package.json .
размещена перед установкой зависимостей? - Вы точно правильно понимаете команду
COPY
?
2. Запуск приложения с Redis в двух контейнерах
Попробуем запустить пользовательский образ!
При запуске образа в контейнере возникла ошибка redis connection refused
. Действительно, ведь на локальной машине не был запущен ни один сервер Redis! Следовательно, запустим его сейчас при помощи соответствующего базового образа Docker.
Ошибка все та же — отказ в подключении к Redis. Нужно разобраться в ситуации.
- Уже создан пользовательский образ Docker с приложением, но для его запуска в контейнере нужен работающий сервер Redis.
- Соответственно, загружается еще один образ из Docker Hub, создается его экземпляр, контейнер с работающим сервером Redis.
- Теперь запущено два контейнера!
- Контейнеры не соединены друг с другом, совместная работа невозможна!
Что же делать? Как устранить проблему?
Необходимо настроить сетевые компоненты для контейнеров, установив правильное подключение. Нам подойдет как Docker CLI, так и Docker Compose, но руководство посвящено, как вы уже знаете, Docker Compose.
3. Docker Compose против Docker CLI
Запуск множества связанных контейнеров через Docker Compose
Docker CLI лучше всего подходит для управления отдельными контейнерами на движке Docker. Естественно, ведь это всего лишь клиентская командная строка для доступа к API клиента Docker.
Лучше всего программа Docker Compose CLI управляет многоконтейнерными приложениями. Более того, Docker Compose сохраняет многие введенные через команду docker run
опции в отдельный файл docker-compose.yml
для удобства в повторном применении. Программа работает как внешний “скрипт” поверх привычного Docker API, поэтому все доступные через Docker Compose действия также доступны через команды Docker и Shell-сценарии. Для более подробного ознакомления прочитайте соответствующий раздел документации Docker Compose.
Теперь, когда вы уже немного разобрались с теоретическим материалом о Docker Compose, применим знания на практике!
Во-первых, напишите в файле конфигурации docker-compose.yml
требуемую версию Docker. В следующем пункте services
(сервисы) задаются инструкции по созданию контейнеров с помощью определенных образов или dockerfile
. Например, redis-server
и node-app
— это имена двух контейнеров веб-приложения. Контейнер redis-server
создается на основе базового образа redis
, а контейнер node-app
создается при помощи пользовательского dockerfile
с приложением, подсчитывающим посещение сайта. Следом для контейнера с главным файлом веб-приложения задается сопоставление портов.
По сравнению с Docker CLI, Docker Compose вносит некоторые изменения в команды. Сперва рассмотрим следующие отличия.
- Команда
docker run <образ>
аналогична командеdocker-compose up
. - Команда
docker build .
аналогична командеdocker-compose build
. - Команда
docker run <образ>
аналогична командеdocker-compose up
.
Пришло время снова создать экземпляры образов (запустить контейнеры), чтобы проверить, заработает ли веб-приложение при контейнеризации через Docker Compose.
Первая часть — “Creating network “visits_default” with the default driver
” — проверяет создаваемые Docker Compose автоматические соединения между двумя контейнерами веб-приложения.
Вот и все! Вы успешно применили Docker Compose для соединения двух контейнеров веб-приложения между собой!
Теперь запомните некоторые важные команды Docker Compose.
- Команда
docker run -d redis
: благодаря флагу-d
контейнер запускается в фоновом режиме, называемомdetached
. - Команда
docker-compose up -d
: работает аналогично предыдущей команде, но вместо Docker CLI применяется Docker Compose. - Команда
docker-compose down
: останавливает контейнеры. - Команда
docker-compose ps
: показывает состояние контейнеров Docker Compose, запускается только из директории с файлом конфигурацииdocker-compose.yml
.
4. Политика автоматического перезапуска
Настройка действий в случае ошибки
В контейнерах иногда возникают ошибки, из-за которых контейнер выключается. Однако docker-compose позволяет определять политику повторного запуска контейнера.
Помимо вечных попыток перезагрузиться, доступны еще три других сценария.
- Отсутствие автоматической перезагрузки в любом случае.
- Автоматическая перезагрузка контейнера при сбоях в работе.
- Продолжение работы контейнера даже при сбоях в его работе.
Для получения дополнительной информации ознакомьтесь с документацией по автоматическому запуску контейнеров.
Выводы
В общем, теперь вы знаете, как работать с несколькими связанными между собой контейнерами, причем таким образом, чтобы веб-приложение получало доступ к Redis и принимало запросы.
В следующей части руководства по Docker речь пойдет о том, как развернуть докеризованное приложение в облаке, например через популярный сервис Amazon Web Services!
Читайте также:
- Как успешно реализовать проверку состояния контейнера в Docker Compose
- Реляционные базы данных в контейнерах Docker Compose
- Мир Docker и Kubernetes в аналогиях с жизнью разработчика
Читайте нас в Telegram, VK и Дзен
Перевод статьи Mahedi Hasan Jisan: Everything on Docker (Part ll)