Карта / Docker / docker-compose

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 — самый частый способ поднять одной командой всё окружение (базу, кэш, очередь), идентичное у всех в команде, без ручной установки каждого компонента на свой компьютер.

🎤 Закрыл тему, если можешь объяснить:
• зачем нужен docker-compose и как сервисы находят друг друга по имени;
• разницу между `depends_on` и `healthcheck` (если дошёл до 2-го слоя).