docker compose: поднимаем стек одной командой
Когда сервисов больше одного — приложение, база, кэш, прокси — запускать их вручную через docker run мучительно. docker compose описывает весь стек в одном YAML-файле и поднимает его целиком. Разберём рабочий пример.
Идея compose
Один файл compose.yaml описывает все сервисы, их образы, порты, тома и связи. Команда docker compose up поднимает всё сразу, down — гасит.
Плюс: конфигурация лежит в git, разворачивается идентично на любом сервере. Это инфраструктура как код в миниатюре.
Какой VPS выбрать для небольшого Docker-проекта
Для небольшого Docker-проекта начните со Старт: 2 vCPU, 4 ГБ памяти и 80 ГБ NVMe. Если на сервере будет несколько приложений, сайтов или контейнеров, рассмотрите Стандарт: 4 vCPU и 8 ГБ памяти. Это ориентиры для небольшого проекта, а не обещание конкретного числа посетителей или запросов.
Для небольшого проекта
Старт · 2 vCPU · 4 ГБ RAM
80 ГБ NVMe
Начальная конфигурация для приложения и сопутствующих сервисов.
Для нескольких приложений
Стандарт · 4 vCPU · 8 ГБ RAM
160 ГБ NVMe
Больше памяти и процессорных ресурсов на одном VPS.
После заказа переходите к настройке по статье. Если ресурсы заканчиваются, увеличьте конфигурацию; для базы данных дополнительно учитывайте объём и характер запросов.
В кнопках заказа выбрана локация в Великобритании. Другую страну можно выбрать при оформлении.
Оплата VPS картой РФ или по СБП доступна в личном кабинете. Для безналичной оплаты от юридического лица или ИП запросите счёт у support@maatrix.io, указав тариф и реквизиты.
Рабочий compose.yaml
Стек из веб-приложения, PostgreSQL и nginx. Создаём файл в папке проекта:
services:
db:
image: postgres:16
restart: always
environment:
POSTGRES_PASSWORD: secret
POSTGRES_DB: appdb
volumes:
- db_data:/var/lib/postgresql/data
app:
image: myapp:latest
restart: always
depends_on:
- db
environment:
DATABASE_URL: postgres://postgres:secret@db:5432/appdb
proxy:
image: nginx:latest
restart: always
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- app
volumes:
db_data:
Обратите внимание: app обращается к базе по имени сервиса db, а не по IP — compose создаёт внутреннюю сеть с DNS.
Запуск и управление
docker compose up -d
docker compose ps
Флаг -d запускает в фоне. Логи всего стека или одного сервиса:
docker compose logs -f
docker compose logs -f app
Обновить один сервис после нового образа:
docker compose pull app
docker compose up -d app
Тома и данные
Именованный том db_data хранит базу между перезапусками. Даже docker compose down его не удалит — данные в безопасности.
- Удалить контейнеры, но сохранить данные:
docker compose down - Удалить всё вместе с томами:
docker compose down -v(осторожно!)
Ежедневные бэкапы MAATRIX снимают снапшот всего диска, включая тома Docker — если удалили том по ошибке, есть откуда восстановить.
Частые ошибки
- Порт занят —
bind: address already in use. Уже что-то слушает 80. Найдите:ss -tlnp | grep :80. - app стартует раньше db — depends_on ждёт запуск контейнера, но не готовность базы. Добавьте healthcheck или ретраи в приложении.
- Изменили .yaml, а ничего не поменялось — нужно
docker compose up -dзаново, compose пересоздаст изменённые сервисы.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
compose.yaml или docker-compose.yml?
Оба работают. Современное имя — compose.yaml, старое docker-compose.yml поддерживается для совместимости.
Можно ли собирать образ прямо в compose?
Да, вместо image укажите build: . с путём к Dockerfile. compose соберёт образ при docker compose build или up --build.
Как перезапустить весь стек?
docker compose restart перезапускает контейнеры без пересоздания. Для применения изменений в yaml используйте up -d.
Готовы перейти к настройке?
Закажите Старт с конфигурацией, предложенной для старта, или сравните все тарифы. Оплата картой РФ и через СБП — в личном кабинете.
Заказать Старт Все тарифы и цены