Что такое docker-compose и для чего он используется
Что проверяют
Работали ли вы с Compose руками: поднимали ли локально приложение с базой, очередью и воркером одной командой. Следом обычно спрашивают, как не дать Django или FastAPI стартовать раньше готовой базы и чем Compose отличается от Kubernetes.
Как отвечать
Docker Compose описывает многоконтейнерное приложение декларативно: сервисы, сети, тома и переменные в одном YAML-файле, запуск и остановка одной командой. Актуальная версия это Compose v2, плагин Docker CLI, команда пишется через пробел: docker compose up. Старый docker-compose на Python не обновляется с 2023 года, а поле version: устарело: v2 его игнорирует и предупреждает. Имя файла по умолчанию compose.yaml, старое docker-compose.yml тоже читается.
Типичный Python-стек в одном файле: web (Django или FastAPI), db (PostgreSQL), redis, worker для Celery, иногда nginx. На нём удобно объяснить главное:
- сеть: сервисы видят друг друга по имени, в
DATABASE_URLпишут хостdb, а неlocalhost; - порядок старта:
depends_onпо умолчанию ждёт только запуска контейнера. Для готовности нуженhealthcheckу базы (pg_isready) иcondition: service_healthy; - тома: именованный том для данных Postgres, bind mount исходников для разработки с
uvicorn --reloadилиrunserver, а с версии 2.22 естьdocker compose watch; - переменные:
.envдля подстановки в файл,env_fileдля контейнера, секреты не коммитят; - разовые команды:
docker compose run --rm web python manage.py migrateилиexecв запущенный контейнер; - окружения:
compose.override.yamlподмешивается автоматически,profilesвключают необязательные сервисы.
Compose работает на одном хосте. Для CI и небольшого прода на одной машине его хватает, а автоскейлинг, перезапуск на другом узле и rolling update дают оркестраторы вроде Kubernetes.
Где спотыкаются
Пишут в настройках Django HOST=localhost. Внутри контейнера это сам контейнер, а не база.
Считают, что depends_on без условия гарантирует готовность Postgres, и ловят падение миграций при первом старте.
Запускают docker compose down -v, чтобы «всё почистить», и теряют том с локальной базой вместе с данными.