Узнайте, что такое Docker Compose, как он упрощает жизнь инженера и возможные варианты использования.


Что, черт возьми, такое Docker Compose и как он облегчает жизнь такого инженера, как вы?

Этот учебник ответит на это (и многое другое) максимально просто.

Повестка дня этого урока:

  • Что такое Docker Compose?
  • Почему он существует? Чем это отличается от docker run?
  • Как использовать Docker Compose?
  • Когда его использовать? — сценарии использования

Абсолютно новичок в Docker? Проверить: Что такое Докер?

Хотите узнать больше о Docker Networking? Проверить: Сводка по сети Docker.

Хорошо…

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

С Compose вы используете файл YAML для настройки служб вашего приложения (контейнеров). Затем с помощью одной команды вы можете создавать, запускать или удалять службы приложений.

Описание изображения

Запуск нескольких контейнеров — очень распространенный сценарий.

Возьмем, к примеру, приложение WordPress (WP). Он состоит из службы WordPress, которая взаимодействует с базой данных MySQL.

Описание изображения

Мы могли бы запустить оба контейнера, используя два docker run команды с кучей аргументов cli. db контейнер может быть запущен следующим образом:

docker run -d \
  --name db \
  --restart always \
  -v db_data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=supersecret \
  -e MYSQL_DATABASE=exampledb \
  -e MYSQL_USER=exampleuser \
  -e MYSQL_PASSWORD=examplepass \
  mysql:5.7
Войти в полноэкранный режим

Выйти из полноэкранного режима

Кроме того, нам может потребоваться изолировать эти контейнеры от хоста или других контейнерных приложений. Мы могли бы создавать или удалять сети с помощью docker network команды и изменить docker run взять сеть в качестве аргумента.

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

С Compose мы просто определяем конфигурацию приложения в файле YAML (с именем docker-compose.yml по умолчанию) вот так:

version: '3.9'

services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_ROOT_PASSWORD: supersecret
    volumes:
      - db_data:/var/lib/mysql
  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress_data:/var/www/html

volumes:
  wordpress_data:
  db_data: 
Войти в полноэкранный режим

Выйти из полноэкранного режима

Этот файл определяет 2 службы, db а также wordpress. Он также определяет параметры конфигурации для каждого — например, образ, переменные среды, опубликованные порты, тома и т. д.

ПРИМЕЧАНИЕ. Если вы еще не понимаете все эти параметры, ничего страшного.

После создания этого файла мы выполняем docker compose upа Docker создает и запускает все наше приложение в новой изолированной среде (мостовая сеть по умолчанию).

Точно так же мы можем использовать docker compose down команда снести все (кроме томов).

Легкий! Верно? 👌

Вот как compose упрощает запуск мультиконтейнерных приложений на одном хосте.

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

Помимо перечисленных выше преимуществ, Compose предоставляет следующие ключевая особенность:

  • Наличие нескольких изолированных сред на одном хосте
  • Сохранение данных тома при создании контейнеров
  • Пересоздавайте только контейнеры, которые изменились
  • Делитесь переменными или конфигурациями между средами

Это все хорошо знать. Но давайте учиться…

Исходный код для этой демонстрации:


Шаг 1: Установите Docker и Docker Compose

Прежде всего, убедитесь, что у вас установлены:

ПРИМЕЧАНИЕ: начиная с Compose версии 2, мы используем docker compose команда вместо docker-compose. В этом руководстве используется версия 2.



Шаг 2: Создайте образец веб-приложения

Откройте терминал, создайте новый каталог и перейдите в него:

mkdir docker-compose-demo
cd docker-compose-demo
Войти в полноэкранный режим

Выйти из полноэкранного режима

Добавьте код простого веб-приложения Python в файл с именем app.py:

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

@app.route("https://dev.to/")
def hello():
    count = cache.incr('hits')
    return 'Hello World! I have been seen {} times.\n'.format(count)
Войти в полноэкранный режим

Выйти из полноэкранного режима

Это создает приложение Flask с одной конечной точкой HTTP (/). Эта конечная точка возвращает количество посещений. Счетчик сохраняется и увеличивается как целое число с ключом с именем hits в хосте Redis с именем redis.

Затем мы добавляем зависимости Python в requirements.txt файл:

flask
redis
Войти в полноэкранный режим

Выйти из полноэкранного режима

После этого создаем Dockerfile — для создания образа Docker на основе этого приложения:

FROM python:3.7-alpine

WORKDIR /code

RUN apk add --no-cache gcc musl-dev linux-headers

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

EXPOSE 5000

COPY . .

ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0

CMD ["flask", "run"]
Войти в полноэкранный режим

Выйти из полноэкранного режима

Это говорит Докеру:

  • Создайте образ, начиная с образа Python 3.7 Alpine Linux.
  • Установите рабочий каталог в /code
  • Установить gcc и другие зависимости с apk менеджер пакетов
  • Копировать requirements.txt с хоста на образ
  • Установите зависимости Python с помощью pip
  • Добавьте к образу метаданные, чтобы описать, что контейнер прослушивает порт 5000.
  • Скопируйте текущий каталог . в проекте в рабочий каталог . на изображении
  • Установите переменные среды, используемые flask команда
  • Установите команду по умолчанию для контейнера flask run

Затем мы создаем docker-compose.yml файл для использования Docker Compose:

version: "3.9"

services:
  redis:
    image: "redis:alpine"
  web:
    build: .
    ports:
      - "8000:5000"
    depends_on:
      - redis
Войти в полноэкранный режим

Выйти из полноэкранного режима

Этот файл Compose определяет две службы: web а также redis.

redis сервис использует общедоступный redis:alpine образ, извлеченный из реестра Docker Hub.

web служба использует образ, созданный из Dockerfile в текущем каталоге (.). Затем он отображает порт 8000 на хосте в порт 5000 в контейнере, где будет работать фляжный сервер. Он также указывает, что web зависит от redis так что Docker знает, чтобы начать redis до web.

ПРИМЕЧАНИЕ: поскольку Compose создает новую мостовую сеть при запуске проекта, web может достигать redis просто используя имя службы, т.е. redis.



Шаг 3. Запустите и протестируйте приложение

Чтобы запустить приложение, все, что нам нужно сделать сейчас, это:

docker compose up
Войти в полноэкранный режим

Выйти из полноэкранного режима

Docker автоматически вытянет redis образ, построить наш web образ и запустите контейнеры.

Описание изображения

После развертывания мы должны получить доступ к приложению по адресу локальный: 8000 в вашем браузере.

Или, в качестве альтернативы, используйте curl на отдельном терминале, чтобы получить доступ к приложению flask следующим образом:

curl localhost:8000
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вы должны увидеть что-то вроде этого:

Hello World! I have been seen 1 times.
Войти в полноэкранный режим

Выйти из полноэкранного режима

Счетчик увеличивается каждый раз, когда мы делаем запрос.

Потрясающий! 👌

Мы можем перечислить контейнеры проекта Compose с помощью:

docker compose ps
Войти в полноэкранный режим

Выйти из полноэкранного режима

ПРИМЕЧАНИЕ: docker compose up по умолчанию будет подключаться к вашему терминалу и распечатывать журналы из сервисов. Мы можем использовать ctrl+c чтобы отсоединить этот терминал, но это остановит службы.

Чтобы запустить службы в фоновом режиме, используйте -d флаг:

docker compose up -d
Войти в полноэкранный режим

Выйти из полноэкранного режима

Если вы хотите просмотреть журналы, используйте:

docker compose logs -f
Войти в полноэкранный режим

Выйти из полноэкранного режима

ПРИМЕЧАНИЕ: -f будет следовать выходным данным журнала по мере создания новых журналов.



Шаг 4. Измените приложение

Изменения неизбежны.

Давайте внесем изменения в наше приложение.

web контейнер выводит предупреждение:

WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
Войти в полноэкранный режим

Выйти из полноэкранного режима

В производстве мы определенно хотим запустить сервер производственного уровня, например gunicorn вместо сервера разработки мы получаем с flask run.

Итак, давайте сначала добавим gunicorn к requirements.txt:

flask
redis
gunicorn
Войти в полноэкранный режим

Выйти из полноэкранного режима

Затем удалите последние 3 инструкции из Dockerfile и добавить новый CMD инструкция:

FROM python:3.7-alpine

WORKDIR /code

RUN apk add --no-cache gcc musl-dev linux-headers

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

EXPOSE 5000

COPY . .

CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
Войти в полноэкранный режим

Выйти из полноэкранного режима

Изображения, построенные из этого Dockerfile теперь будет работать gunicorn вместо сервера flask dev.

После того, как мы внесли изменения, нам нужно перестроить web изображение:

docker compose build
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

docker compose up web -d --no-deps -t 1
Войти в полноэкранный режим

Выйти из полноэкранного режима

ПРИМЕЧАНИЕ:

  • --no-deps сообщает Docker не запускать (пере) зависимые службы.
  • -t 1 указывает тайм-аут выключения контейнера, равный 1 секунде вместо 10 секунд по умолчанию.

Попробуй добраться web опять таки:

curl localhost:8000
Войти в полноэкранный режим

Выйти из полноэкранного режима

Он должен работать, как ожидалось.

Но если вы проверите журналы:

docker compose logs web -f
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вы заметите, что у нас больше нет предупреждения, так как мы используем gunicorn.

Нойс!


Шаг 5: Очистите

Чтобы удалить все службы, мы просто запускаем:

docker compose down
Войти в полноэкранный режим

Выйти из полноэкранного режима

Если бы мы определили тома в службах (как в примере с WordPress), тома не удалялись бы автоматически с помощью docker compose down. В основном это делается для того, чтобы избежать случайного удаления данных.

Чтобы снести все, включая тома, используйте -v флаг:

docker compose down -v
Войти в полноэкранный режим

Выйти из полноэкранного режима

Поздравляем! Теперь вы можете сочинять! 🙌


  • *Среды разработки*

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

  • *Автоматизированные среды тестирования*

    Для автоматизированных рабочих процессов, таких как конвейеры CI/CD, обычно требуются инструменты для простого создания и уничтожения сред. Контейнеры идеально подходят для таких сред из-за низкого потребления ресурсов и скорости. Используя файл конфигурации, Compose предоставляет удобный способ создания и уничтожения таких сред для вашего набора тестов.

  • *Развертывание на одном хосте*

    Хотя Compose был в основном разработан для рабочих процессов разработки и тестирования, он иногда используется в рабочей среде для запуска контейнеров на одном хосте. Хотя Compose совершенствуется, это не такой оркестратор, как Swarm или Kubernetes, а скорее оболочка API Docker. Проверьте официальная документация перед использованием композиций в производстве.

В этом руководстве мы узнали, что такое Docker Compose, почему он существует, как его использовать и когда его использовать.

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

Если вы нашли этот урок полезным, оставьте лайк, комментарий или подписку действительно поможет нам.

Вам также может понравиться наш Канал YouTube.

Спасибо, что сделали это так далеко!

У нас впереди НАМНОГО больше захватывающего контента DevOps! 🙌

Увидимся на следующем.

А пока…

Будьте смелее и продолжайте учиться.

Но самое главное,

Техническая забота!