Краткое введение в docker-compose

Что такое docker-compose

Как docker может управлять отдельно взятым контейнером, так docker-compose помогает управлять не просто одним, а всеми контейнерами, которые составляют распределенное приложение. Причём, не только контейнерами, но и сетями, подключёнными папками и всеми связанными с этим настройками.

Ведь даже чтобы запустить простое вэб-приложение, состоящее всего из двух контейнеров (например, «web» с контентом и «db» с данными), нужно как минимум:

  1. создать новую пользовательскую сеть (иначе контейнеры не будут видеть друг друга по именам),
  2. запустить контейнер с данными, дать ему имя db и подключить к сети,
  3. запустить контейнер с вэб-контентом, назвать его web, и тоже подключить к сети.

Можно создать скрипт для этого, но тот достаточно быстро выйдет из-под контроля: контейнеры будут добавляться, порядок запуска меняться, и т. п. К тому же нужно учитывать, что какие-то контейнеры нужно сначала собрать, а какие-то уже готовы, сеть может быть уже создана, а может еще и нет, какие-то контейнеры нужно запустить первыми (db), а остальные — потом (web), и т.д. Больше элементов — больше комбинаций.

С docker-compose можно описать приложение целиком: со всеми его контейнерами, Docker-файлами, сетями и зависимости, а compose уже сам разберется, что с этим делать и как запускать.

Установка docker-compose

compose автоматически устанавливается вместе с Docker на Mac и Windows. На Linux нужно дополнительно сделать несколько телодвижений, и как именно это делать, хорошо описано тут.

docker-compose.yml

docker-compose.yml — это как Dockerfile, но для распределенного приложения целиком. Например, если в упомянутом выше вэб-приложении web контейнер нужно собирать из Dockerfile, которые лежит в папке web-app, а сервис с данными —  чистый образ с mysql, то вот как для него может выглядеть compose-файл:

Здорово, правда? Тут даже задан root пароль через environment переменные, и явно указан порядок запуска контейнеров через depends_on .

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

С depends_on , правда, есть один момент. Например, мы указали, что web должен запуститься после db, и compose так и сделает. Но ведь на самом деле мы хотели, чтобы web запустился после того, как db будет готов принимать запросы. А это как повезет: очень часто mysql внутри него будет инициализироваться еще некоторое время после того, как сам контейнер уже запустился. Вроде, контейнер уже есть, но пока бесполезен.

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

Запуск и остановка приложения с compose

В docker-compose есть две пары команд для запуска и остановки приложения. up  и down  управляют приложением целиком, в то время как start  и stop  запускают отдельные сервисы-контейнеры.

docker-compose up

Запускает приложения с нуля: создаёт сети, если нужно, собирает Dockerfile и запускает контейнера. Если добавить -d  параметр (как и в docker run -d ), то приложение запуститься в фоновом процессе.

Ко всему прочему, compose добавляет к именам сетей и контейнеров префикс (такой же, как имя текущей папки), но внутри созданной им сети можно использовать как оригинальное имя (web, db) так и измененное (dockercompose_db_1).

docker-compose ps

Команда ps  покажет, какие из контейнеров приложения запущены. Эта команда очень похожа на docker ps .

docker-compose down

Эта команда откатывает назад всё, что сделала up : останавливает и затем удаляет контейнеры и сети.

docker-compose start/stop

Иногда в уже запущенном приложении нужно остановить какой-нибудь компонент-контейнер не удаляя его. Вот тут будут полезны start  и stop .

Но для обновления контейнеров  start и stop не годятся. Чтобы обновить, например, только контейнер web, нужно снова использовать команду  up — docker-compose up --no-deps --build web

Заключение

docker-compose — это тот нужный инструмент, когда количество запускаемых контейнеров переваливает за единицу. Да что там, даже для одного контейнера он тоже может пригодиться. compose-файл же, мало того, что очень простой, так еще содержит на порядок больше опций, чем я привёл: параметры сбора контейнеров, переменные среды и их импорт, подключаемые папки (volumes), и т. д. Кроме этого, docker-compose сам по себе умеет не только запускать и останавливать контейнеры, но и мониторить всё приложение, запускать отдельные команды в контейнерах и даже чуть-чуть масштабироваться.

4 комментария для “Краткое введение в docker-compose

    1. Юра, про жизнь — раз в две недели теперь. В это воскресенье будет. Писать технические статьи и про жизнь раз в неделю — очень энергозатратно 🙂

  1. Кто вам вообще сказал, что вы умеет писать статьи? Мама?

    Просто скопировать кусок своей кода с проектом и написать пару восторженных комментариев в духе: «Вау, как здорова», — это ещё не введение, не гайд, и не туториал. Это мусор.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *