Docker Compose позволяет управлять набором контейнеров, каждый из которых представляет собой один сервис проекта. Управление включает в себя сборку, запуск с учетом зависимостей и конфигурацию. Конфигурация Docker Compose описывается в файле docker-compose.yml, лежащем в корне проекта.
Пример файла docker-compose.yml
# Версия схемы, которую мы используем.
# Зависит от установленной версии docker
# https://docs.docker.com/compose/compose-file/
version: "3"
# Определяем список сервисов — services
# Эти сервисы будут частью нашего приложения
services:
  app: # Имя сервиса
    build:
      # Контекст для сборки образа,
      # в данном случае, текущая директория
      context: .
      # Имя Docker-файла из которого будет собран образ
      dockerfile: Dockerfile
      # Команда, которая будет выполнена после старта сервиса
    command: make start
    ports: # Проброс портов
      - "3000:8000"
    # Перечисляем тома (volumes)
    # Они будут подключены к файловой системе сервиса
    # Например, все что находится в . мы увидим в директории /app
    volumes:
      # Текущая директория пробрасывается в директорию /app внутри контейнера
      # Путь внутри контейнера (после двоеточия) обязательно должен быть абсолютным
      - ".:/app"
      - "/tmp:/tmp"
    # Сервис будет запущен, только после старта db
    depends_on:
      - db
  db:
    # Имя образа. Здесь мы используем базу данных Postgres
    image: postgres:latest
    environment:
      # А так задаются переменные окружения
      POSTGRES_PASSWORD: password
    volumes:
      - pgdata:/var/lib/postgresql/data
    # Хелсчек для проверки готовности БД к работе
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
  volumes:
    pgdata:
Команды для работы с Docker Compose
# Собирает сервисы, описанные в конфигурационных файлах
docker compose build
# Запускает собранные сервисы
docker compose up
# Запуск контейнеров на фоне
docker compose up -d
# Если какой-то из сервисов завершит работу,
# то остальные будут остановлены автоматически
docker compose up --abort-on-container-exit
# Запустит сервис application и выполнит внутри команду make install
docker compose run application make install
# А так мы можем запустить сервис и подключиться к нему с помощью bash
docker compose run application bash
# С флагом --rm запускаемые контейнеры будут автоматически удаляться
docker compose run --rm application bash
# Останавливает и удаляет все сервисы,
# которые были запущены с помощью up
docker compose down
# Останавливает, но не удаляет сервисы, запущенные с помощью up
# Их можно запустить снова с помощью docker-compose start
docker compose stop
# Перезапускает все остановленные и запущенные сервисы
docker compose restart
Самостоятельная работа
В этой самостоятельной работе мы запустим готовое приложение Redmine с помощью Docker Compose:
- Опишите два сервиса, необходимых для работы приложения: базу данных и само приложение. Пример описания сервисов можно найти на страничке c официальным образом redmine на docker hub
- В качестве базы данных возьмите вариант с PostgreSQL
- Запустите контейнеры с помощью Docker Compose
- Если приложение успешно запустилось в контейнерах, то в консоли, в конце вывода логов запуска, вы увидите сообщение Listening on http://0.0.0.0:3000. Теперь вы можете открыть приложение локально в браузере по адресуhttp://localhost:<внешний_порт>и зайти в него под админом, либо создать нового пользователя для дальнейшей работы.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.