Загрузка...
Загрузка...
Полное руководство по Docker Compose. Синтаксис YAML, сервисы, сети, volumes, переменные окружения. Практические примеры для разработки и продакшена.
Готовые конфигурации Docker Compose для WordPress, Node.js, PHP. Локальная разработка, базы данных, кэш. Копируй и адаптируй под свой проект.
DevOpsСравнение YAML и JSON: синтаксис, преимущества, конвертация. Примеры для Docker Compose, Kubernetes, CI/CD. Онлайн-конвертер YAML ↔ JSON.
DevOpsПолное руководство по cron. Синтаксис полей, специальные значения, переменные окружения. Настройка, отладка и типичные ошибки планировщика задач.
DevOpsEscape и Unescape: что такое экранирование, зачем нужно (XSS, целостность данных). HTML entities, JSON, JS, URL, Base64. Примеры кода и типичные ошибки.
Поделитесь с коллегами или изучите другие материалы блога
Docker Compose — инструмент оркестрации контейнеров, который позволяет описывать и запускать многоконтейнерные приложения одним файлом. Вместо десятков команд docker run вы определяете сервисы в YAML, и Compose поднимает всю инфраструктуру одной командой. В этом руководстве разберём синтаксис, ключевые концепции и практические сценарии использования.
Docker Compose — это инструмент командной строки, входящий в состав Docker Desktop. Он читает файл docker-compose.yml (или compose.yaml) и создаёт сети, volumes и контейнеры согласно описанной конфигурации. Compose особенно полезен для локальной разработки, когда нужно поднять базу данных, кэш, очередь сообщений и само приложение одновременно.
Основные преимущества:
docker compose up -d вместо скриптов и документацииДля быстрой генерации конфигурации используйте Docker Compose Builder на reChecker.
Compose V2 встроен в Docker Desktop. Для Linux установите плагин:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install docker-compose-plugin
# Проверка
docker compose version
Файлы совместимы с Compose V1 (docker-compose) и V2 (docker compose). Рекомендуется использовать V2 — он поддерживает Compose Specification и новые возможности.
| Версия | Особенности |
|---|---|
| 2.x | Поддержка сетей, расширенные опции |
| 3.x | Упрощённый синтаксис, совместимость со Swarm |
| 3.8+ | Рекомендуемая для новых проектов |
Базовый файл состоит из секций services, networks и volumes:
services:
app:
image: nginx:alpine
ports:
- "8080:80"
networks:
default:
driver: bridge
volumes:
data:
Секция services обязательна. Каждый сервис — это контейнер с именем, образом и настройками. Сети и volumes опциональны, но часто необходимы для связи между контейнерами и сохранения данных.
services:
# Готовый образ из реестра
db:
image: postgres:16-alpine
# Сборка из Dockerfile
app:
build:
context: .
dockerfile: Dockerfile
image: myapp:latest
При использовании build образ создаётся при первом запуске. Директива image задаёт имя и тег результата сборки.
ports:
- "3000:3000" # host:container
- "127.0.0.1:8080:80" # только localhost
- "9000" # случайный порт на хосте
expose:
- "5432" # порт доступен только в сети Compose
ports публикует порты на хост. expose делает порт видимым только для других сервисов в той же сети.
environment:
NODE_ENV: production
DATABASE_URL: postgres://user:pass@db:5432/mydb
- DEBUG=1 # альтернативный синтаксис
env_file:
- .env
- .env.production
Переменные из env_file переопределяются значениями из environment. Файл .env в корне проекта подхватывается автоматически для подстановки в значения.
volumes:
- /host/path:/container/path # bind mount
- named_volume:/container/path # named volume
- ./config:/app/config:ro # read-only
Named volumes управляются Docker и сохраняют данные между перезапусками. Bind mounts привязывают директорию хоста — удобно для разработки с hot-reload.
services:
app:
depends_on:
- db
- redis
db:
image: postgres:16
redis:
image: redis:alpine
Compose запускает контейнеры в порядке зависимостей. Важно: depends_on не ждёт готовности сервиса — PostgreSQL может ещё инициализироваться. Для ожидания готовности используйте condition: service_healthy с healthcheck.
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 5
start_period: 10s
app:
depends_on:
db:
condition: service_healthy
С condition: service_healthy приложение не стартует, пока база не пройдёт проверку. Подробнее о стеках с базами — в статье Docker Compose для веб-разработки.
По умолчанию Compose создаёт сеть projectname_default. Все сервисы получают DNS-имена по имени сервиса: db, redis, app. Обращение к db:5432 из контейнера app работает автоматически.
Кастомные сети:
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # без доступа в интернет
services:
web:
networks:
- frontend
- backend
db:
networks:
- backend
Сеть internal: true изолирует контейнеры от внешнего мира — полезно для баз данных.
Named volumes объявляются в корне и подключаются к сервисам:
volumes:
postgres_data:
redis_data:
services:
db:
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
volumes:
- redis_data:/data
Данные сохраняются при docker compose down. Для полного удаления используйте docker compose down -v.
Профили позволяют запускать подмножество сервисов:
services:
app:
image: myapp
profiles:
- production
dev-tools:
image: dev-container
profiles:
- dev
db:
image: postgres
docker compose up -d # только db (без профиля)
docker compose --profile dev up # db + dev-tools
docker compose --profile production up # db + app
Compose поддерживает переменные окружения в значениях:
services:
app:
image: myapp:${TAG:-latest}
environment:
DB_HOST: ${DB_HOST:-db}
Синтаксис ${VAR:-default} подставляет значение или default при отсутствии. Файл .env в корне проекта загружается автоматически.
| Команда | Описание |
|---|---|
docker compose up -d | Запуск в фоне |
docker compose down | Остановка и удаление контейнеров |
docker compose ps | Список контейнеров |
docker compose logs -f app | Логи сервиса |
docker compose exec app sh | Shell в контейнере |
docker compose build --no-cache | Пересборка без кэша |
docker compose config | Валидация и вывод итоговой конфигурации |
deploy.resources.limits для CPU и памятиdepends_on и мониторингаlatest в продакшенеdocker-compose.yml для базы, docker-compose.override.yml для локальных переопределенийservices:
app:
image: myapp:1.0
deploy:
resources:
limits:
cpus: '2'
memory: 1G
reservations:
memory: 256M
В режиме docker compose up (без Swarm) директива deploy может не применяться. Используйте mem_limit и cpus на уровне сервиса для совместимости.
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Второй файл переопределяет и дополняет первый. Удобно для разных окружений без дублирования.
services:
app:
image: myapp
restart: unless-stopped
Варианты: no, always, on-failure, unless-stopped. Для продакшена обычно unless-stopped или on-failure.
services:
app:
image: myapp
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Ограничивает размер логов на диске. Альтернативы: syslog, journald, awslogs.
Файл docker-compose.override.yml автоматически подхватывается при docker compose up. Используйте его для локальных переопределений (порты, volumes с исходниками), не коммитьте чувствительные данные.
# Детальный вывод конфигурации
docker compose config
# Запуск с выводом логов
docker compose up
# Проверка зависимостей
docker compose config --services
При проблемах с сетью проверьте docker network ls и docker network inspect. Убедитесь, что сервисы в одной сети.
Compose V1 (docker-compose) — отдельный бинарник. V2 (docker compose) — плагин Docker CLI. Команды совместимы, синтаксис файлов одинаков. Для миграции достаточно установить плагин и заменить дефис на пробел в командах.
| Инструмент | Масштаб | Сложность | Применение |
|---|---|---|---|
| Docker Compose | 1 хост | Низкая | Разработка, малые деплои |
| Docker Swarm | Кластер | Средняя | Оркестрация без K8s |
| Kubernetes | Кластер | Высокая | Продакшен, масштабирование |
Compose не предназначен для высокодоступных кластеров. Для одного сервера или локальной разработки его возможностей достаточно.
Docker Compose покрывает большинство сценариев локальной разработки и небольших деплоев. Для масштабируемых кластеров рассмотрите Kubernetes или Docker Swarm. Начните с Docker Compose Builder на reChecker — он поможет сгенерировать базовую конфигурацию под ваш стек. Готовые стеки для WordPress, Node.js и PHP — в Docker Compose для веб-разработки.