Docker Compose
1Docker Compose: многоконтейнерные приложения← вы здесь2Volumes: хранение данных в Docker3Сети Docker Compose: как сервисы общаются
Урок 1~12 минут

Docker Compose: многоконтейнерные приложения

Реальное приложение — это несколько контейнеров: API, база данных, кэш, reverse proxy. Docker Compose запускает их все одной командой.

Минимальный docker-compose.yml

yaml
services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
 
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://postgres:secret@db:5432/myapp
    depends_on:
      - db
bash
docker compose up -d    # запустить всё в фоне
docker compose down     # остановить и удалить

Попробуй в симуляции

Структура файла

yaml
services:              # сервисы (контейнеры)
  service-name:
    image: ...         # готовый образ
    build: .           # или собрать из Dockerfile
    ports:
      - "host:container"
    environment:
      KEY: value
    env_file:
      - .env
    volumes:
      - ./local:/container
    depends_on:
      - другой-сервис
    restart: unless-stopped
 
volumes:               # именованные volumes
  pgdata:
 
networks:              # пользовательские сети
  backend:

Реальный стек: FastAPI + PostgreSQL + Redis

yaml
services:
  db:
    image: postgres:16-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 10s
      timeout: 5s
      retries: 5
 
  redis:
    image: redis:7-alpine
    command: redis-server --requirepass secret
 
  api:
    build: .
    ports:
      - "8000:8000"
    env_file:
      - .env
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    restart: unless-stopped
 
volumes:
  pgdata:

depends_on и порядок запуска

yaml
depends_on:
  db:
    condition: service_started   # просто запущен (default)
  db:
    condition: service_healthy   # прошёл healthcheck
  db:
    condition: service_completed_successfully  # завершился с кодом 0

Без healthcheck нет гарантии, что база готова принимать соединения — только что контейнер запущен.

Команды Compose

bash
docker compose up              # запустить
docker compose up -d           # в фоне
docker compose up --build      # пересобрать образы
docker compose down            # остановить + удалить контейнеры
docker compose down -v         # + удалить volumes
 
docker compose ps              # статус сервисов
docker compose logs            # логи всех
docker compose logs -f api     # логи конкретного
docker compose exec api bash   # войти в сервис
docker compose restart api     # перезапустить сервис
 
docker compose pull            # обновить образы
docker compose build           # пересобрать из Dockerfile

Несколько файлов Compose

bash
# Base + override
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
 
# Переменная COMPOSE_FILE
export COMPOSE_FILE=docker-compose.yml:docker-compose.prod.yml

Удобно: общий docker-compose.yml + docker-compose.dev.yml с hot-reload, docker-compose.prod.yml с ограничениями ресурсов.

В следующем уроке — volumes: как не терять данные между перезапусками.

Compose описывает все сервисы приложения в одном YAML. docker compose up запускает всё разом.
🐙
Docker Compose — порядок запуска
СЕРВИСЫ
🌐
nginx
nginx:alpine
stopped
depends_on: api
depends on
api
myapp:latest
stopped
depends_on: db, redis
🐘
db
postgres:16-alpine
stopped
🔴
redis
redis:7-alpine
stopped
ВЫВОД
нажми docker compose up
🎯
Миссия 1 из 4
Как запустить все сервисы из docker-compose.yml?