Что такое Docker Compose и как с ним быстро поднять стек приложений
Когда речь заходит о контейнерах, чаще всего вспоминают Docker. Но если нужно запустить несколько сервисов одновременно (например, веб-сервер, базу данных и кэш), то управлять ими вручную становится неудобно. Именно для этого существует Docker Compose — инструмент, который позволяет описывать и запускать многоконтейнерные приложения с помощью одного файла.
Что такое Docker Compose
Docker Compose — это утилита для оркестрации контейнеров, которая использует YAML-файлы для описания сервисов. Она автоматизирует:
- запуск нескольких контейнеров одной командой;
- настройку сетей и связей между ними;
- управление переменными окружения;
- масштабирование сервисов.
Главный файл — docker-compose.yml
.
Пример: поднимаем стек "Nginx + PHP + MySQL"
Файл docker-compose.yml
:
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./code:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
php:
image: php:8.1-fpm
volumes:
- ./code:/var/www/html
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: userpass
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
Что здесь происходит:
web
— контейнер с Nginx, который проксирует запросы на PHP.php
— контейнер с PHP-FPM.db
— база данных MySQL.volumes
— для сохранения данных даже после перезапуска.
Запуск и управление
Запустить стек:
docker compose up -d
Остановить:
docker compose down
Посмотреть логи:
docker compose logs -f
Масштабировать сервис (например, 3 контейнера PHP):
docker compose up -d --scale php=3
Переменные окружения
Чтобы хранить пароли и ключи отдельно, можно создать файл .env
:
MYSQL_ROOT_PASSWORD=rootpass
MYSQL_DATABASE=mydb
MYSQL_USER=user
MYSQL_PASSWORD=userpass
И использовать их в docker-compose.yml
:
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
Другие примеры
Кроме стандартного стека из веб-сервера, базы и PHP, через Docker Compose легко подключать и другие сервисы. Рассмотрим несколько популярных вариантов, которые часто нужны в реальных проектах.
Как поднять Redis
Redis понадобится, когда нужно хранить сессии, кешировать данные или организовывать очереди. Добавить его просто:
services:
app:
environment:
- REDIS_HOST=redis
- REDIS_PORT=6379
depends_on:
- redis
redis:
image: redis:7
restart: always
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
redis_data:
Теперь внутри app
можно обращаться к Redis по хосту redis:6379
.
Обратный прокси через Nginx
Зачем нужен обратный прокси?
- Балансировка между несколькими экземплярами приложения.
- Раздача статики.
- SSL-терминация.
- Красивые доменные имена вместо
localhost:3000
.
Пример docker-compose.yml
с Nginx:
services:
app:
expose:
- "3000" # доступно только внутри сети Compose
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- app
nginx.conf:
server {
listen 80;
location / {
proxy_pass http://app:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Разбор:
proxy_pass http://app:3000;
— Nginx отправляет запросы внутрь контейнераapp
.proxy_set_header
— пробрасываем заголовки (нужно для корректного логирования и работы приложений).- Порт
3000
наружу не торчит — всё идёт через Nginx.
Плюсы и минусы Docker Compose
Преимущества | Недостатки |
---|---|
Упрощает управление многоконтейнерными приложениями (один YAML-файл для всех сервисов) | Ограниченная масштабируемость, не подходит для крупных развертываний |
Обеспечивает согласованность окружений (разработка, тест, продакшн) | Работает только на одном хосте, не подходит для распределённых систем |
Автоматизирует многоконтейнерные рабочие процессы (подъём/остановка, CI/CD) | Простейшая балансировка нагрузки, нет автоскейлинга |
Эффективное управление ресурсами (распределение между контейнерами) | Минимальные встроенные возможности мониторинга и логирования |
Лучшие практики использования Docker Compose
- Используйте переменные окружения: Рекомендуется хранить конфигурационные значения и секреты в переменных окружения, чтобы
docker-compose.yml
оставался чистым и безопасным. - Держите сервисы лёгкими: Желательно, чтобы каждый сервис выполнял одну конкретную задачу, обеспечивая модульность и простоту поддержки.
- Используйте тома (volumes): Томa помогают сохранять данные вне контейнера, что позволяет сохранять данные между перезапусками и обновлениями контейнеров.
- Версионируйте Compose-файлы: Рекомендуется хранить
docker-compose.yml
в системе контроля версий (например, Git), чтобы отслеживать изменения и эффективно сотрудничать с командой.
Заключение
Docker Compose — мощный инструмент для управления многоконтейнерными приложениями на одном хосте. Он упрощает разработку, тестирование и развёртывание приложений, позволяя:
- быстро поднимать целый стек сервисов;
- сохранять согласованность окружений;
- автоматизировать рабочие процессы и CI/CD;
- эффективно управлять ресурсами.
При этом важно учитывать его ограничения: Compose не предназначен для масштабирования на множество хостов и сложной балансировки нагрузки. Следуя лучшим практикам — использовать переменные окружения, лёгкие сервисы, тома и версионирование — можно построить безопасные, стабильные и удобные для команды многоконтейнерные окружения.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний