docker compose up/down/exec

Тема дорожной карты · Docker & Containers

docker compose up собирает (если нужно), создаёт и запускает всё из compose.yaml; -d — запуск в фоновом режиме, --build — принудительная пересборка образов, --remove-orphans — удаление сервисов, которых уже нет в файле. Команда down останавливает и удаляет контейнеры и дефолтную сеть; добавьте -v, чтобы удалить именованные тома (что приведёт к потере данных!). exec запускает команду внутри уже работающего сервиса, например docker compose exec db psql. Типичная ловушка: up не подхватит изменённые переменные окружения, пока не будет выполнена команда up -d снова или restart.

Как это работает

docker compose up/down/exec — это YAML-формат и CLI для описания многоконтейнерных приложений как кода. Файл compose.yml перечисляет сервисы, сети, тома и их связи; команда docker compose up поднимает весь стек; docker compose down останавливает и удаляет все контейнеры и сети. Compose создаёт изолированную сеть для каждого проекта, позволяет сервисам находить друг друга по имени, поддерживает переопределение через файл .env и переменные ${VAR}. Профили (profiles: [dev]) позволяют включать или выключать опциональные сервисы в зависимости от требований.

Когда применять

Compose полезен для разработки, маленьких single-host production-деплоев, интеграционных тестов в CI/CD. Он не подходит для многоконтейнерных оркестраций, где требуется распределённая оркестрация, такая как Kubernetes (или Nomad, или Docker Swarm). Секреты не следует хранить в compose.yml (используйте .env через env_file: или Docker secrets). В production-среде следует закреплять теги образов по digest, чтобы избежать неопределённости при запуске.

Типичные ошибки

Основные ловушки при использовании docker compose up/down/exec включают путаницу между версионными схемами: v1 (docker-compose, отдельная Python-утилита, EOL) и v2 (docker compose, Go-плагин, актуальная). Также следует избегать коммита файла .env в git (там могут содержаться секреты). Ошибка depends_on: ожидает только запуск контейнера, а не его готовности к работе (используйте healthcheck: с condition: service_healthy). При переименовании проекта важно не забывать о том, что именованные тома также должны быть переименованы, чтобы избежать потери данных.

Связанные понятия

Полезные ресурсы