Содержание

Как использовать Docker compose

Что такое docker compose?

Docker compose - это инструмент, позволяющий настраивать и запускать приложение, состоящее из нескольких контейнеров. Если у вас есть приложение состоящее из разных модулей и каждый модуль завернут в docker контейнер, то docker compose позволит запускать их вместе, в одной сети. Все настройки портов, порядок запуска контейнеров, команды запуска будут в одном месте. Этот инструмент подходит для разработки, тестирования и использования приложения в проде. docker-compose также возможно использовать на нескольких машинах, но в этой статье я рассмотрю использование docker-compose только на одной.

Как он работает?

Я думаю, что лучшим способом объяснить как это работает - это объяснить на примере. В примере будет использована 3-я версия docker-compose файла.

У меня есть API которое умеет делать следующее:

  • распознавать позу по фотографии. Для этого он обращается к модулю с нейронной сетью через протокол gRPC
  • позволяет зарегистрироваться и авторизоваться пользователю, данные он хранить в базе MariaDB

Таким образом у меня есть 3 модуля:

  • backend - сервер API с основной логикой
  • pose-detector - модуль с нейронной сетью
  • database - база данных MariaDB где хранится информация о пользователях

В файле docker-compose.yml хранятся все настройки, для запуска этих контейнеров и их связывания. Посмотрим на него

version: '3'
services:

database:
  image: mariadb:10.5
  ports:
    - "3306:3306"
  volumes:
    - ./mysql_data:/docker-entrypoint-initdb.d
  environment:
    MYSQL_ROOT_PASSWORD: sd4g3e
    MYSQL_DATABASE: planka

pose-detector:
  build: /home/azamat/python/pose_detector_module/
  ports:
    - "50051:50051"
  command: python3 -u ./pose_server.py

backend:
  build: .
  ports:
    - "50099:50099"
  depends_on:
    - "database"
    - "pose-detector"
  command: ./run_server

В этом конфиге есть сервисы database, pose-detector, backend. Это наши модули, которые будут запущены.
Для каждого сервиса можно указывать либо image, либо build. Если укажете image, то сервис будет собран из готового докер образа. Если build, то из файла .Dockerfile, в параметре нужно указать лишь путь до папки, где он лежит.
ports - позволяет прокинуть порты из сервиса. Первый порт - это порт внутри контейнера, второй - тот, к которому вы будете обращаться снаружи, чтобы обратиться к первому порту внутри контейнера.
volumes - позволяет примонтировать папку или файл к контейнеру. Содержимое этой папки будет доступно внутри контейнера.
depends_on - указывает, что данный сервис зависит от сервисов, указанных в этом параметре. Он будет запущен только после запуска сервисов, от которых он зависит.
environment - здесь указаны переменные окружения, которые устанавливаются внутри контейнера.

В этом конфиге сказано, что для сервиса database нужно прокинуть 3306 порт внаружу и примонтировать папку mysql_data в папку docker-entrypoint-initdb.d. Внутри нее хранятся скрипты sql, которые будут запущены при создании контейнера. Сам сервис будет создан из образа mariadb:10.5. Команда не указана, потому что образ запускается уже с командой.

Сервис pose-detector создается из Docker файла, и прокидывает порт 50051.
Есть нюанс запуска приложений на python. Чтобы в логах отображался вывод приложения, нужно запускать его с параметром -u, иначе вы не увидите, что выводит ваше приложение.

Сервис backend запускается только после запуска первых двух.

Чтобы запустить приложение со всеми модулями, нужно в папке с файлом docker-compose.yml выполнить команду docker-compose up. Для остановки всех контейнеров docker-compose down. Чтобы пересоздать контейнеры, выполните команду docker-compose build [название сервиса]

Сами сервисы будут доступны друг для друга по имени сервиса. Т.е. допустим вы хотите обратиться к базе данных из сервиса backend. Вместо ip у него будет название сервиса, в моем примере это mysql://database:3306.

Подробнее о других параметрах и возможностях в официальной документации https://docs.docker.com/compose/compose-file/