В чем разница Docker Compose и Dockerfile
DevOpsDockerDocker ComposeDockerfileJava
Что проверяют
Понимаете ли вы, что это инструменты разных уровней: один собирает образ, другой запускает набор контейнеров. Следом обычно просят показать, как Spring Boot сервис в Compose находит базу и почему он падает, если Postgres ещё не готов.
Как отвечать
- Dockerfile: инструкция сборки одного образа.
FROM,COPY,RUN,ENTRYPOINT, каждая инструкция даёт слой в кэше. Для Java обычно multi-stage: в первой стадии Maven или Gradle собирает jar, во второй только JRE, напримерeclipse-temurin:21-jre, и готовый артефакт. Официальный образopenjdkиз старых примеров объявлен устаревшим; - Compose: файл
compose.yamlописывает сервисы, сети, тома, переменные окружения и порты и запускается одной командойdocker compose up. Сервис ссылается либо на Dockerfile черезbuild:, либо на готовыйimage:; - связь: Compose использует Dockerfile, но не заменяет его. Dockerfile отвечает на вопрос «что внутри контейнера», Compose на вопрос «какие контейнеры и как они связаны».
Конкретика, которая выделит ответ:
- имена сервисов: контейнеры видят друг друга по имени в общей сети, поэтому в
spring.datasource.urlпишутjdbc:postgresql://db:5432/app, а неlocalhost; depends_on: сам по себе ждёт только запуска контейнера. Чтобы ждать готовности базы, нуженhealthcheckу Postgres иcondition: service_healthy;version:: ключ в начале файла устарел, Compose v2 его игнорирует и выводит предупреждение;- Spring Boot: начиная с 3.1 модуль
spring-boot-docker-composeсам поднимаетcompose.yamlпри локальном запуске, а образ можно собрать и без Dockerfile черезbootBuildImageили Jib.
Где спотыкаются
Говорят, что Compose это «Docker для нескольких контейнеров», который заменяет Dockerfile. Без описания образа Compose может только запускать готовые чужие образы.
Пишут localhost в адресе базы внутри контейнера и не понимают, почему соединение отклоняется.
Кладут пароли прямо в compose.yaml и берут postgres:latest. Для воспроизводимости тег фиксируют, а секреты выносят в .env или в secrets.