Лабораторная работа №5: Оркестровка с Docker Compose
Цель работы
Section titled “Цель работы”Научиться описывать многоконтейнерные приложения декларативно с помощью файла 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)
3. Структура docker-compose.yml
Section titled “3. Структура docker-compose.yml”version: Версия синтаксиса (устаревает, но часто встречается).services: Ключевая секция, где описывается каждый контейнер (сервис).networks: Декларация сетей, которые будут использоваться сервисами.volumes: Декларация именованных томов.- Рекомендуемая литература: Compose file reference (Справочник)
4. Файл .env
Section titled “4. Файл .env”Docker Compose автоматически ищет и подгружает файл с именем .env в той же директории. Это позволяет вынести чувствительные данные (пароли) или специфичные для окружения настройки (порты, хосты) из docker-compose.yml, который можно безопасно коммитить в Git.
- Рекомендуемая литература: Environment variables in Compose
Задания для выполнения
Section titled “Задания для выполнения”-
Установка Docker Compose (15 мин):
- На
Web-nodeубедитесь, что у вас установлен плагинdocker-compose. Обычно он ставится вместе с Docker Engine. Проверьте:docker compose version. - Остановите и удалите все контейнеры, сети и тома от предыдущих работ, чтобы начать с чистого листа.
- На
-
Создание
.envфайла (15 мин):- На
Web-nodeсоздайте директорию для проекта, напримерmkdir ghost-project && cd ghost-project. - Внутри создайте файл
.env. В него мы поместим пароль от базы данных..env DB_ROOT_PASSWORD=myverysecretpassword
- На
-
Написание
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:latestports:- "8080:2368"environment:database__client: mysqldatabase__connection__host: dbdatabase__connection__user: rootdatabase__connection__password: ${DB_ROOT_PASSWORD}database__connection__database: ghosturl: http://localhost:8080depends_on:- dbnetworks:- ghost-netdb:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}volumes:- mysql-data:/var/lib/mysqlnetworks:- ghost-netvolumes:mysql-data:networks:ghost-net:
- В той же директории создайте файл
-
Запуск и управление (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. Это сделано для защиты данных.
- Обратите внимание, что
- Находясь в директории
Контрольные вопросы
Section titled “Контрольные вопросы”- Какая команда запускает все сервисы, описанные в
docker-compose.yml? - Что такое
.envфайл и почему его не следует добавлять в систему контроля версий (Git)? - Что делает секция
depends_onи почему она важна? - В чем главное преимущество использования Docker Compose перед набором
docker runкоманд?