docker-compose
docker-compose запускает несколько связанных контейнеров одной командой — реальное приложение редко состоит из одного контейнера: обычно нужны ещё база данных, Redis, может быть очередь сообщений.
# docker-compose.yml
services:
app:
build: . # собрать из Dockerfile в текущей папке
ports:
- "8080:8080"
environment:
DATABASE_URL: jdbc:postgresql://db:5432/mydb # "db" — имя сервиса ниже
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: password
volumes:
- pgdata:/var/lib/postgresql/data # данные переживут перезапуск контейнера
volumes:
pgdata:
docker-compose up # поднять все сервисы разом
docker-compose down # остановить и удалить контейнеры
Копнуть глубже
Сервисы общаются по имени, а не по IP. Внутри docker-compose сети контейнеры видят друг друга по имени сервиса (db в примере выше) — Docker автоматически настраивает внутреннюю сеть с DNS-резолвингом, не нужно вручную узнавать IP-адрес контейнера базы данных.
depends_on контролирует только порядок запуска, не готовность. Контейнер базы может запуститься, но ещё не быть готов принимать соединения (PostgreSQL стартует не мгновенно) — приложение может попытаться подключиться слишком рано и упасть. Решение — healthcheck, который проверяет реальную готовность сервиса, а не просто факт его запуска:
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
app:
depends_on:
db:
condition: service_healthy # ждать, пока db реально готова, не просто запущена
Для локальной разработки docker-compose — самый частый способ поднять одной командой всё окружение (базу, кэш, очередь), идентичное у всех в команде, без ручной установки каждого компонента на свой компьютер.
• разницу между `depends_on` и `healthcheck` (если дошёл до 2-го слоя).