Skip to Content
1️⃣ День 1Docker Compose

Docker Compose

Этап 1 — Вступление

Что такое Docker Compose: Это инструмент для запуска и координации нескольких Docker-контейнеров как единого приложения.

Зачем он нужен:

  • Избавляет от длинных docker run команд.
  • Позволяет запускать и управлять многокомпонентными приложениями из одного YAML-файла.
  • Удобен для локальной разработки, тестирования и продакшена.

Этап 2 — Пример простого приложения

Компоненты:

  • PostgreSQL — база данных
  • Node.js — backend-сервис
  • React — frontend

Проблема без Compose: нужно вручную запускать каждый сервис с правильными параметрами. Решение: Один файл docker-compose.yaml и команда:

docker compose up -d

Этап 3 — Преимущества использования

Compose полезен в:

  • разработке
  • тестировании
  • staging
  • CI/CD

Что умеет:

  • запускать все сервисы одной командой
  • пересобирать образы (docker compose build)
  • отображать логи (docker compose logs)
  • выполнять команды внутри контейнеров (docker compose exec)
  • отслеживать состояние сервисов (healthchecks)

Этап 4 — Проверка установки

Проверь версию:

docker compose version

⚠️ В старых версиях: docker-compose version ✅ В новых (с 2.0): docker compose


Этап 5 — Структура проекта

Проект содержит папки:

  • frontend — React-приложение
  • backend — Node.js-сервис
  • db — (по умолчанию) там хранится точка монтирования тома для БД

Все сервисы описаны в одном docker-compose.yaml в корне.


Этап 6 — Дополнительные возможности реального docker-compose.yaml

Healthchecks: Убедитесь, что сервис готов прежде чем запускать зависимые.

  • test: команда проверки (напр. pg_isready, curl)
  • interval, timeout, retries, start_period

depends_on с условиями:

depends_on: db: condition: service_healthy db-init: condition: service_completed_successfully

Сервис db-init: Одноразовая задача для инициализации БД. Политика рестарта: restart: "no".

Build args для frontend:

args: VITE_BACKEND_URL: ${VITE_BACKEND_URL:-http://localhost:8090/api}

Тома (volumes): Персистентное хранение данных:

volumes: pgdata:

Полный файл docker-compose.yaml

services: db: image: postgres:16 environment: POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_NAME} volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD", "pg_isready", "-U", "${DB_USER}"] interval: 10s timeout: 5s retries: 5 db-init: build: context: ./backend image: shop-backend depends_on: db: condition: service_healthy environment: DB_HOST: db DB_PORT: 5432 DB_NAME: ${DB_NAME} DB_USER: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} command: ["node", "scripts/setup-database.js"] restart: "no" backend: build: context: ./backend image: shop-backend depends_on: db: condition: service_healthy db-init: condition: service_completed_successfully environment: DB_HOST: db DB_PORT: 5432 DB_NAME: ${DB_NAME} DB_USER: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} ports: - "8090:3001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/api/health"] interval: 10s timeout: 5s retries: 3 start_period: 5s frontend: build: context: ./frontend args: VITE_BACKEND_URL: ${VITE_BACKEND_URL:-http://localhost:8090/api} image: shop-frontend ports: - "8080:80" depends_on: backend: condition: service_healthy volumes: pgdata:
Last updated on