Что такое docker-compose и для чего он используется
Что проверяют
Умеете ли вы поднять приложение с окружением одной командой и понимаете ли, как контейнеры находят друг друга. Java-разработчика следом часто спрашивают, почему Spring Boot в контейнере не видит базу, хотя она запущена.
Как отвечать
Docker Compose поднимает набор связанных контейнеров на одном хосте по одному YAML-файлу. Сейчас это плагин docker compose (Compose V2), старый Python-бинарник docker-compose не обновляется с 2023 года. Предпочтительное имя файла compose.yaml, а поле version: устарело: Compose его игнорирует и печатает предупреждение.
- services: образ или
build, порты, переменные окружения,.envдля подстановки значений; - сеть: у проекта общая сеть с DNS по имени сервиса, поэтому приложение ходит в базу по
jdbc:postgresql://db:5432/app; - volumes: именованные тома для данных Postgres, bind mount для конфигов;
- порядок старта:
depends_onсcondition: service_healthyплюсhealthcheckу базы наpg_isready; - команды:
up -d,logs -f,ps,down, аprofilesвключают необязательные сервисы вроде Kafka UI.
Ответу добавит веса Java-специфика. С версии 3.1 в Spring Boot есть модуль spring-boot-docker-compose: при запуске приложения он поднимает compose.yaml и настраивает подключения без ручных URL. В тестах ту же задачу решает Testcontainers. JVM в контейнере учитывает лимит памяти, и кучу удобнее задавать через -XX:MaxRAMPercentage, а не жёстким -Xmx.
Compose нужен для локальной разработки, стендов и простых установок на одной машине. Кластер с автоскейлингом и переносом на другие узлы это уже Kubernetes.
Где спотыкаются
Пишут localhost в URL базы. Внутри контейнера localhost это сам контейнер приложения, база доступна по имени сервиса.
Ставят depends_on без healthcheck и получают Connection refused. Без условия Compose ждёт только старта контейнера, а Postgres в этот момент ещё не принимает соединения.
Делают docker compose down -v, чтобы «всё перезапустить», и теряют данные: флаг -v удаляет именованные тома вместе с контейнерами.