Пара 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
Практика: Состояние переживает пересоздание
- Поднимите базовый compose, сделайте три POST-запроса.
- Проверьте /data/events.jsonl и сохраните количество строк.
- Выполните down без -v, затем up -d.
- Убедитесь, что старые записи доступны; объясните, почему это ещё не 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. Не удалять том ради восстановления «правильного» имени.
Основные выводы
- По имени app и внутреннему порту 8000.
- Нет, он обеспечивает отдельное хранение, но не независимое восстановление.
Самостоятельная работа
Задокументировать назначение тома и команды безопасной остановки проекта.