Руководство по Docker. Часть 2: Docker Compose для JavaScript, Python и Redis

Руководство по Docker. Часть 1: образ, контейнер, сопоставление портов и основные команды.

Во второй части руководства по Docker рассмотрим программное обеспечение Docker Compose для раздельного запуска сложного веб-приложения в нескольких контейнерах.

Docker Compose  —  это инструмент для запуска мультиконтейнерных приложений на Docker, определенных с помощью формата файлов Compose.

Скоро вы поймете смысл этого определения. Сперва создадим два контейнера для приложения, хранящего данные о том, “сколько раз его посетили”. Мы не затронем аспект веб-программирования, а поговорим исключительно про Docker.

Содержание:

  1. Создание образа Docker-контейнера.
  2. Запуск приложения с Redis в двух контейнерах.
  3. Docker Compose против Docker CLI.
  4. Политика автоматического перезапуска.
  5. Выводы.

1. Создание образа Docker-контейнера

Dockerfile для счетчика посещений сайта на Node.js

Файл конфигурации package.json для приложения-счетчика на Node.js
Главный файл index.js для приложения-счетчика на Node.js

Пришло время создать dockerfile для вышеизложенного приложения, а следом  —  собрать образ. Вы помните, как создать dockerfile?

  1. Определите базовый образ.
  2. Установите рабочий каталог, чтобы разделить файлы по директориям.
  3. Скопируйте с локального хранилища в контейнер необходимые для запуска веб-приложения файлы.
  4. Установите все зависимости.
  5. Установите команду по умолчанию для запуска приложения вместе с контейнером.
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-compose.yml требуемую версию Docker. В следующем пункте services (сервисы) задаются инструкции по созданию контейнеров с помощью определенных образов или dockerfile. Например, redis-server и node-app  —  это имена двух контейнеров веб-приложения. Контейнер redis-server создается на основе базового образа redis, а контейнер node-app создается при помощи пользовательского dockerfile с приложением, подсчитывающим посещение сайта. Следом для контейнера с главным файлом веб-приложения задается сопоставление портов.

По сравнению с Docker CLI, Docker Compose вносит некоторые изменения в команды. Сперва рассмотрим следующие отличия.

  1. Команда docker run <образ> аналогична команде docker-compose up.
  2. Команда docker build . аналогична команде docker-compose build.
  3. Команда docker run <образ> аналогична команде docker-compose up.

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

docker-compose up

Первая часть  —  “Creating network “visits_default” with the default driver”  —  проверяет создаваемые Docker Compose автоматические соединения между двумя контейнерами веб-приложения.

Сервер Redis запустился и готов к обработке соединений через порт 6379, а веб-приложение прослушивает порт 8081

Вот и все! Вы успешно применили Docker Compose для соединения двух контейнеров веб-приложения между собой!

Теперь запомните некоторые важные команды Docker Compose.

  1. Команда docker run -d redis: благодаря флагу -d контейнер запускается в фоновом режиме, называемом detached.
  2. Команда docker-compose up -d: работает аналогично предыдущей команде, но вместо Docker CLI применяется Docker Compose.
  3. Команда docker-compose down: останавливает контейнеры.
  4. Команда docker-compose ps: показывает состояние контейнеров Docker Compose, запускается только из директории с файлом конфигурации docker-compose.yml.

4. Политика автоматического перезапуска

Настройка действий в случае ошибки

В контейнерах иногда возникают ошибки, из-за которых контейнер выключается. Однако docker-compose позволяет определять политику повторного запуска контейнера.

При возникновении ошибок контейнер всегда пытается перезагрузиться

Помимо вечных попыток перезагрузиться, доступны еще три других сценария.

  1. Отсутствие автоматической перезагрузки в любом случае.
  2. Автоматическая перезагрузка контейнера при сбоях в работе.
  3. Продолжение работы контейнера даже при сбоях в его работе.

Для получения дополнительной информации ознакомьтесь с документацией по автоматическому запуску контейнеров.


Выводы

В общем, теперь вы знаете, как работать с несколькими связанными между собой контейнерами, причем таким образом, чтобы веб-приложение получало доступ к Redis и принимало запросы.

В следующей части руководства по Docker речь пойдет о том, как развернуть докеризованное приложение в облаке, например через популярный сервис Amazon Web Services!

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Mahedi Hasan Jisan: Everything on Docker (Part ll)

Предыдущая статьяPHP: типы констант
Следующая статьяПолезные команды Git