Что такое Docker Compose и как с ним быстро поднять стек приложений

7 минут чтения
Средний рейтинг статьи — 4.8

Когда речь заходит о контейнерах, чаще всего вспоминают 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 не предназначен для масштабирования на множество хостов и сложной балансировки нагрузки. Следуя лучшим практикам — использовать переменные окружения, лёгкие сервисы, тома и версионирование — можно построить безопасные, стабильные и удобные для команды многоконтейнерные окружения.

7 минут чтения
Средний рейтинг статьи — 4.8

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний