Пара 15: Compose: сеть, тома и декларативный запуск

90 минут · 3 курс, ML.

Содержание и результат

Запустить сервис с постоянным томом и объяснить адреса внутри Compose.

План занятия

0–10: контекст и исходная задача. 10–40: устройство и механизмы. 40–55: демонстрация команд. 55–80: лабораторная работа. 80–90: разбор результата и фиксация исправлений.

Практика выполняется в своей учебной папке и на localhost. Подготовка окружения описана в lab/README.md.

Compose описывает желаемый запуск

Файл конфигурации связывает образы, сеть и хранилище.

compose.yaml задаёт сервисы и настройки. docker compose config проверяет и раскрывает конфигурацию, up -d приводит запуск к описанию, ps и logs показывают состояние. YAML чувствителен к отступам; проверка config дешевле долгого поиска ошибки запуска. В современном Compose не нужен устаревший верхний ключ version. Переменные .env для подстановки Compose и environment для процесса — разные механизмы: наличие файла само по себе не гарантирует, что значение попало в контейнер. В нашем минимальном compose все нужные настройки явны, а расширение monitoring подключается отдельным файлом в декабре.

Аналогия: список участников, помещений и оборудования одной лаборатории.

Имена сервисов и внутренние порты

Внутри сети Compose используем имя сервиса, а не порт хоста.

Сервисы в общей сети могут обращаться по имени service, которое разрешает Docker DNS. Prometheus позже будет читать http://app:8000/metrics. localhost внутри prometheus указывал бы на prometheus, а не app. Host port 8000 нужен клиенту на ноутбуке; внутренний port 8000 нужен соседнему контейнеру. Публикуем наружу только необходимые интерфейсы и для учебного запуска привязываем их к 127.0.0.1. Не переносим приватную сеть Compose в публичную DNS-зону. Отдельная сеть ограничивает случайное смешивание учебных проектов, но не заменяет полноценную авторизацию.

Аналогия: номер внутреннего телефона отличается от городского номера.

Named volume и bind mount

Данные не должны случайно зависеть от срока жизни контейнера.

Изменяемый слой контейнера удаляется с контейнером. Named volume хранится отдельно и управляется Docker; bind mount показывает выбранный каталог хоста. В курсе named volume data хранит events.jsonl. Compose down удаляет контейнеры и сеть, но без -v оставляет именованные тома. down -v разрушает учебные данные; его не используем для обычной остановки. Volume — не резервная копия: ошибка приложения или удаления может повредить данные. Bind mount удобен для разработки, но права, путь и содержимое хоста становятся частью поведения.

Аналогия: квартира меняет жильца, а отдельное хранилище не выбрасывается вместе с мебелью.

Команды и наблюдения

Окружение: Ubuntu / Bash, lab.

docker compose config --quiet
docker compose up -d --build
docker compose ps
curl -sS -H "Content-Type: application/json" -d '{"hours":4}' http://127.0.0.1:8000/predict
docker compose exec app cat /data/events.jsonl
docker compose up -d --force-recreate app
docker compose exec app cat /data/events.jsonl

Команда force-recreate затрагивает только app в собственной учебной Compose-папке. Перед опытом освобождаем порт от предыдущих демонстраций.

Ожидаемый результат: Запись запроса остаётся в events.jsonl после пересоздания app.

Вариант для macOS

Compose-команды одинаковы. Named volumes живут в Linux-среде Desktop; bind mount проходит через механизм обмена файлами macOS и может отличаться по скорости и правам. Не использовать down -v для обычной остановки.

docker compose config --quiet
docker compose up -d --build
docker compose ps
docker compose down

Практика: Состояние переживает пересоздание

  1. Поднимите базовый compose, сделайте три POST-запроса.
  2. Проверьте /data/events.jsonl и сохраните количество строк.
  3. Выполните down без -v, затем up -d.
  4. Убедитесь, что старые записи доступны; объясните, почему это ещё не backup.

Результат: compose.yaml и доказательство сохранности записей.

Проверка: Данные переживают смену контейнера; опубликованные порты ограничены localhost.

Неисправность для разбора: Использование down -v стирает именованный том.

Решение и диагностика

Проверка: docker compose exec app wc -l /data/events.jsonl до и после down/up. Том связан с Compose project, поэтому запуск из другой папки или с другим -p может показать другой том. Диагностика: docker compose ls, docker volume ls, docker inspect только собственного app. Не удалять том ради восстановления «правильного» имени.

Основные выводы

Самостоятельная работа

Задокументировать назначение тома и команды безопасной остановки проекта.

Источники