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:
- dbbash
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?