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