docker-compose: поднимаем backend + db + frontend

docker-compose: поднимаем backend + db + frontend

docker-compose - это дирижёр. Он поднимает несколько сервисов одним файлом.

Пример compose

services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: myapp
    ports:
 - "5432:5432"
    volumes:
 - dbdata:/var/lib/postgresql/data

  backend:
    build: ./backend
    depends_on:
 - db
    environment:
      DATABASE_URL: postgres://postgres:postgres@db:5432/myapp?sslmode=disable
    ports:
 - "8080:8080"

  frontend:
    build: ./frontend
    ports:
 - "8081:80"

volumes:
  dbdata: {}

Запуск:

docker compose up -d --build
docker compose ps
docker compose logs -f backend

Compose-топология: backend + db + frontend в одной сети, named volume для БД

Внутри compose сервисы видят друг друга по имени: `db`, `backend` и т.д.

depends_on и healthcheck

depends_on гарантирует порядок запуска, но не то, что сервис готов. PostgreSQL может стартовать, но ещё не принимать соединения.

services:
  db:
    image: postgres:16-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 5

  backend:
    build: ./backend
    depends_on:
      db:
        condition: service_healthy
Простой `depends_on: [db]` ждёт только запуска контейнера, а не готовности сервиса. Используй `condition: service_healthy` + healthcheck.

Полезные команды compose

docker compose up -d --build     # поднять с пересборкой
docker compose down              # остановить и удалить контейнеры
docker compose down -v           # + удалить volumes (осторожно!)
docker compose ps                # статус сервисов
docker compose logs -f backend   # логи конкретного сервиса
docker compose exec db psql -U postgres  # зайти в БД
docker compose restart backend   # перезапустить один сервис

Мини-задание

  • Создай docker-compose.yml с db (postgres) и backend (любой HTTP-сервер)
  • Добавь healthcheck для postgres (pg_isready)
  • Убедись, что backend стартует только после готовности БД
  • Проверь через docker compose ps - оба сервиса healthy/running

Итог

  • Compose поднимает несколько сервисов одним файлом. Сервисы видят друг друга по имени.
  • depends_on + condition: service_healthy - правильный способ управлять порядком запуска.
  • docker compose down -v удаляет данные - используй осознанно.

Типичная ошибка

Забывать depends_on с healthcheck и получать «connection refused» при старте backend. Или использовать docker compose down -v и удалять данные БД, которые нужны.

Мини-практика (10-15 минут)

Создай compose-файл с тремя сервисами: db (postgres), adminer (веб-интерфейс для БД, образ adminer, порт 8081:8080) и backend (nginx:alpine на порту 8080:80). Подними всё через docker compose up -d. Открой localhost:8081 - увидишь Adminer. Подключись к базе (хост: db, порт 5432). Посмотри логи каждого сервиса. Потом docker compose down.

Зарегистрируйтесь бесплатно, чтобы пройти квиз, решить задание с автопроверкой и вести прогресс.