Skip to content

Как использовать Docker Compose

Коротко:

Docker Compose — tool для defining + running multi-container apps через single YAML file. Удобен для local dev (app + DB + Redis + nginx) и small production deployments. В 2024 rewrite под Compose v2 (Go, integrated в Docker CLI). Commands: docker compose up, down, logs, exec. Для production + scale — migrate to Kubernetes или Docker Swarm.

Ниже: пошаговая инструкция, рабочие примеры, типичные ошибки, FAQ.

Пошаговая настройка

  1. Install Docker Desktop (MacOS/Windows) или Docker Engine + Compose v2 (Linux)
  2. Создайте docker-compose.yml в корне проекта
  3. Define services: app, db, cache. Каждый — image или build path
  4. Volumes для persistence: volumes: { pg_data: {} }, - pg_data:/var/lib/postgresql
  5. Networks (default создаётся): services доступны друг другу по hostname = service name
  6. docker compose up -d — start в background. logs -f — tail logs
  7. Env files: .env loaded автоматически, или env_file: .env.prod
  8. Healthchecks + depends_on для correct startup order

Рабочие примеры

СценарийКонфиг
Basic web + DBservices: app: build: . ports: ["3000:3000"] env_file: .env depends_on: db: { condition: service_healthy } db: image: postgres:16-alpine volumes: - pg_data:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: ${DB_PASS} healthcheck: test: ["CMD", "pg_isready"] interval: 5s volumes: pg_data:
Full stack: app + DB + Redis + nginxservices: nginx: image: nginx:alpine ports: ["80:80"] volumes: [./nginx.conf:/etc/nginx/nginx.conf:ro] depends_on: [app] app: build: . environment: - DATABASE_URL=postgres://app:pass@db:5432/mydb - REDIS_URL=redis://cache:6379 depends_on: [db, cache] db: image: postgres:16 volumes: [pg_data:/var/lib/postgresql/data] cache: image: redis:7-alpine volumes: pg_data:
Scale horizontallydocker compose up -d --scale app=5 # 5 instances of app # Nginx upstream для load balancing между ними
Override для dev vs prod# docker-compose.override.yml (dev) services: app: volumes: [.:/app] # hot reload via code mount command: npm run dev # docker-compose.prod.yml services: app: build: . command: npm run start # Use: docker compose -f docker-compose.yml -f docker-compose.prod.yml up
Exec command в running containerdocker compose exec app bash docker compose exec db psql -U app -d mydb

Типичные ошибки

  • depends_on без condition: healthy → app starts до DB ready → crash. Всегда healthchecks
  • Volume permissions: Postgres нужен uid 999 owning /var/lib/postgresql. На mounted host volume — нужен chown
  • .env passwords в git — plain text. Используйте .gitignore + .env.example template
  • Compose v1 (docker-compose) deprecated. V2 — docker compose (space)
  • Not for production > 1 server. Для multi-host — Docker Swarm или K8s

Больше по теме

Часто задаваемые вопросы

Docker Compose vs Kubernetes?

Compose: single host, dev, small prod. K8s: multi-host, auto-scaling, HA. Порог миграции: >3 services + >1 host + need auto-scaling = K8s.

Сетевое взаимодействие?

Services в одном compose file автоматически в shared network. Access через service name (hostname). External: expose ports через <code>ports:</code>.

Можно ли Docker Compose в prod?

Для small apps (side projects, internal tools) — yes. Для serious business — оставить dev-only, migrate в K8s для prod.

Alternative — Podman Compose?

Podman — daemonless Docker-compatible. Podman Compose — работает с docker-compose.yml. Для rootless Linux — preferable.