Skip to content

Лабораторная работа №5: Оркестровка с Docker Compose

Научиться описывать многоконтейнерные приложения декларативно с помощью файла docker-compose.yml и управлять всем стеком (приложение, база данных, сети, тома) как единым целым.

Основные теоретические положения

Section titled “Основные теоретические положения”

1. Проблема ручного управления

Section titled “1. Проблема ручного управления”

В предыдущих работах мы запускали контейнеры длинными командами docker run. Это неудобно и чревато ошибками:

  • Команды сложно запомнить и воспроизвести.
  • Непонятно, как связаны запущенные контейнеры.
  • Обновление конфигурации требует ручного удаления и создания контейнеров.

2. Docker Compose и декларативный подход

Section titled “2. Docker Compose и декларативный подход”

Docker Compose — это инструмент для определения и запуска многоконтейнерных Docker-приложений. Он использует YAML-файл для конфигурации сервисов, сетей и томов.

  • Декларативный подход: Вы описываете конечное состояние вашей системы в файле docker-compose.yml, а Docker Compose сам определяет, какие действия нужно совершить, чтобы привести систему в это состояние. Это является частью подхода Infrastructure as Code (IaC).
  • Рекомендуемая литература: Overview of Docker Compose (Документация Docker)
  • version: Версия синтаксиса (устаревает, но часто встречается).
  • services: Ключевая секция, где описывается каждый контейнер (сервис).
  • networks: Декларация сетей, которые будут использоваться сервисами.
  • volumes: Декларация именованных томов.
  • Рекомендуемая литература: Compose file reference (Справочник)

Docker Compose автоматически ищет и подгружает файл с именем .env в той же директории. Это позволяет вынести чувствительные данные (пароли) или специфичные для окружения настройки (порты, хосты) из docker-compose.yml, который можно безопасно коммитить в Git.

Задания для выполнения

Section titled “Задания для выполнения”
  1. Установка Docker Compose (15 мин):

    • На Web-node убедитесь, что у вас установлен плагин docker-compose. Обычно он ставится вместе с Docker Engine. Проверьте: docker compose version.
    • Остановите и удалите все контейнеры, сети и тома от предыдущих работ, чтобы начать с чистого листа.
  2. Создание .env файла (15 мин):

    • На Web-node создайте директорию для проекта, например mkdir ghost-project && cd ghost-project.
    • Внутри создайте файл .env. В него мы поместим пароль от базы данных.
      .env
      DB_ROOT_PASSWORD=myverysecretpassword
  3. Написание docker-compose.yml (45 мин):

    • В той же директории создайте файл docker-compose.yml.
    • Опишите в нем всю нашу систему: два сервиса (ghost и db), одну сеть (ghost-net) и один том (mysql-data).
    • Используйте переменную ${DB_ROOT_PASSWORD} для подстановки пароля из .env файла.
      docker-compose.yml
      version: '3.8'
      services:
      ghost:
      image: ghost:latest
      ports:
      - "8080:2368"
      environment:
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: ${DB_ROOT_PASSWORD}
      database__connection__database: ghost
      url: http://localhost:8080
      depends_on:
      - db
      networks:
      - ghost-net
      db:
      image: mysql:8.0
      environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      volumes:
      - mysql-data:/var/lib/mysql
      networks:
      - ghost-net
      volumes:
      mysql-data:
      networks:
      ghost-net:
  4. Запуск и управление (15 мин ):

    • Находясь в директории ghost-project, запустите все приложение одной командой:
      Terminal window
      docker compose up -d
      • -d (detach) снова означает запуск в фоновом режиме.
    • Проверьте статус запущенных сервисов: docker compose ps.
    • Посмотрите логи конкретного сервиса: docker compose logs ghost.
    • Убедитесь, что блог работает.
    • Остановите и удалите все, что было создано (контейнеры, сети):
      Terminal window
      docker compose down
      • Обратите внимание, что docker compose down по умолчанию не удаляет volumes. Это сделано для защиты данных.
  1. Какая команда запускает все сервисы, описанные в docker-compose.yml?
  2. Что такое .env файл и почему его не следует добавлять в систему контроля версий (Git)?
  3. Что делает секция depends_on и почему она важна?
  4. В чем главное преимущество использования Docker Compose перед набором docker run команд?