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

Как я уже отмечал ранее, разработчик может интегрировать все необходимое ему ПО в один контейнер, а может использовать отдельные контейнеры для вспомогательного программного обеспечения. В случае, когда все необходимое для работы приложения интегрировано в один образ диска, использовать командный интерфейс Docker для запуска контейнера вполне удобно. Но если приложение размещено в одном контейнере, а вспомогательное ПО - в другом, да не в одном, а в нескольких, что случается довольно часто, то запуск приложения с помощью командного интерфейса Docker уже не представляется столь удобным. Хотя, конечно, возможным. Все еще больше усложняется тем, что по мере развития Docker некоторые из его возможностей начинали считаться устаревшими и заменялись на более продвинутые и современные, что, как обычно, привело к некоторой неразберихе: не понятно, как поведет себя ПО с той или иной комбинацией ключей и параметров. К счастью, для работы с мульти-контейнерными приложениями есть Docker Compose, и нам не нужно тратить время на все остальное.

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

Итак, основное назначение Docker Compose - определение и работа с мульти-контейнерными приложениями Docker. Docker Compose ожидает, если не сказать "требует", что ему будет предоставлено описание всей необходимой для работы приложения инфраструктуры. Для описания приложения и всех сервисов, которые необходимы для его нормальной работы, создается специальный файл на языке YAML. Полную документацию по языку Compose файлов можно найти тут. Но, прежде, чем создавать файл описания, необходимо установить Docker Compose. Сделать это совсем не трудно и не займет много времени. Естественно, это надо сделать на том же оборудовании, на котором установлен и сам Docker.

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

Итак, ранее я показывал пример того, как можно запустить Ghost при помощи стандартного контейнера и командной строки Docker. Вот еще раз этот пример:

docker run -d --name my-ghost -p 8000:2368 -v /path/to/ghost/blog:/var/lib/ghost/content ghost

Теперь пришло время примера с использованием Docker Compose. Прежде всего, вот пример Compose файла:

ghost:
  image: ghost
  container_name: my-ghost
  ports:
   - 8000:2368
  volumes:
   - /path/to/ghost/blog:/var/lib/ghost/content

Этот файл должен сделать все то, что раньше делалось при помощи командной строки. Тут есть указание имени образа диска (вторая строка), имя контейнера, также приведено правило соответствия портов хоста и контейнера, и указано, какой каталог хоста должен быть подмонтирован в качестве каталога контейнера.

Для того, чтобы Docker Compose мог воспользоваться этим файлом, его надо назвать docker-compose.yml, и тогда при запуске из того же каталога, где он будет располагаться, можно будет не указывать имени файла вообще. Или же, назвать файл можно как угодно, но при вызове надо будет всегда использовать ключ командной строки -f. Для простоты я буду предполагать, что все действия производятся из каталога с YAML файлом.

Для того, чтобы загрузить образ диска к себе, надо выполнить команду:

docker-compose pull

Это запустит процесс загрузки, ход которого будет отображаться на экране. После того, как загрузка завершится, можно будет запустить контейнер с помощью команды:

docker-compose up -d

Ключ команды -d по-прежнему указывает, что контейнер должен запуститься в фоновом режиме.

Для остановки контейнера я использую команду:

docker-compose stop

Делаю я так в том случае, когда надо просто произвести определенные манипуляции, не требующие каких-то глобальных изменений, например, если нужно сделать резервную копию данных.

Можно также использовать

docker-compose down

В этом случае следует учитывать то обстоятельство, что контейнер, созданный предыдущей командой docker-compose up будет удален после того, как будет остановлен.

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