Ресурсы Docker: формула расчета, примеры и онлайн-калькулятор
- Типовой веб-сервис (NGINX+PHP+Redis+Postgres) требует минимум 2 CPU и 4 ГБ RAM, с запасом 30%.
- Формула: `Memory = Base + Peak × buffer` (buffer 1.2-2.0); CPU = ожидаемый load × 1.5.
- Лимит памяти в Docker (--memory) должен быть на 25-50% выше резерва, иначе OOM-killer убьёт контейнер.
- Для баз данных (Postgres, MySQL) выделяйте 60-80% памяти под кэш, остальное — ОС и соединения.
- Используйте `docker stats` и `cadvisor` для реальных цифр, а не гадание.
Зачем рассчитывать ресурсы для Docker?
В 2026 году цена облачного vCPU стартует от 500 ₽/мес, а 1 ГБ RAM — от 200 ₽. Если контейнеру не хватает памяти — OOM-killer убивает процесс, сайт падает. Если перебор — вы переплачиваете за неиспользуемые ресурсы. Типичные сценарии:
- Веб-приложение на PHP/Python с пиковой нагрузкой в 14:00.
- База данных, которая кэширует в памяти.
- Фоновые воркеры, обрабатывающие очередь.
Без расчёта вы либо получаете 502 Bad Gateway, либо тратите в 1.5x больше. Калькулятор Docker ресурсов на нашем сайте считает по методике ниже.
Формула расчёта памяти и CPU
Базовая формула для контейнера:
Где:
- Base — минимальный расход приложения в покое (0.1-0.5 ГБ для PHP-FPM).
- Peak — максимальное потребление на пике (сумма всех параллельных воркеров).
- buffer = 1.2–2.0, зависит от SLA (1.5 для типичного веба).
- overhead — системные процессы: 50–100 МБ на контейнер.
где Expected_load — средний процент использования CPU в час пик в единицах vCPU (1.0 = 100% одного ядра), safety_factor = 1.5 (запас на burst).
Пример для веб-приложения на Laravel с PHP-FPM: Base = 200 МБ, Peak = 600 МБ, buffer = 1.5 → Memory = (200+600)×1.5 = 1200 МБ + 80 МБ overhead → ~1.3 ГБ. Рекомендуем поставить limit 1.5 ГБ.
Пример расчёта: стек LEMP + Redis + Postgres
Рассмотрим типовой проект: NGINX (1 контейнер), PHP-FPM (2 воркера), Redis, Postgres. Все контейнеры на одной машине с 8 vCPU и 32 ГБ RAM.
- NGINX: base 50 МБ, peak 100 МБ → 150 МБ × 1.2 = 180 МБ + overhead → 200 МБ. CPU: load 0.2 vCPU × 1.5 = 0.3 vCPU.
- PHP-FPM: 2 воркера, каждый base 30 МБ, peak 200 МБ (в зависимости от запроса). Memory = (30+200)×2 ×1.5 = 690 МБ + 100 МБ → 790 МБ. CPU: load 0.8 vCPU × 1.5 = 1.2 vCPU.
- Redis: base 10 МБ, peak 1.5 ГБ (кэш) ×1.2 = 1.8 ГБ. CPU: 0.1 vCPU ×1.5 = 0.15.
- Postgres: shared_buffers = 6 ГБ (рекомендуется 25% от ОЗУ хоста, но не более 8 ГБ). Memory = 6 ГБ + base 50 МБ = ~6.1 ГБ ×1.2 = 7.3 ГБ. CPU: load 1 vCPU ×1.5 = 1.5.
Итого: память 200+790+1800+7300 = ~10 ГБ, CPU ~3.15 vCPU. На одной ноде помещаются с запасом. Используйте Калькулятор Docker ресурсов для автоматического суммирования.
- 1Определите Base
Запустите контейнер без нагрузки, замерьте memory и CPU через docker stats
- 2Замерьте Peak
Сгенерируйте нагрузку (например, wrk -c 100), зафиксируйте максимум
- 3Выберите buffer
1.2 для тестового, 1.5 для прода, 2.0 для критичного SLA
- 4Примените формулу
Memory = (Base+Peak)*buffer + overhead, CPU = load*1.5
- 5Установите лимиты
docker run --memory=... --memory-reservation=... --cpus=...
Ограничения cgroups: --memory и --cpus
Docker использует cgroups v2. Параметры запуска:
| Параметр | Пример | Описание |
|---|---|---|
| --memory | 512m | Жёсткий лимит RAM. Превышение → OOM. |
| --memory-reservation | 256m | Мягкий лимит; контейнер может превысить, если есть свободная память. |
| --cpus | 1.5 | Максимум vCPU (дробное). |
| --cpu-shares | 1024 | Вес для планировщика CPU (по умолч. 1024). |
Важно: не задавайте --memory без --memory-reservation — контейнер сразу умрёт при превышении. Всегда ставьте reservation на 30-50% ниже лимита.
На 2026 год в Docker 27+ используется cgroup v2 по умолчанию. Если на хосте OL7 или CentOS 7 — потребуется cgroup v1, проверяйте docker info.
Подводные камни и edge-cases
Даже по формуле можно ошибиться. Частые грабли:
- OOM-killer при нехватке — контейнер убивается, но остаётся в статусе exited. Проверка: docker inspect — видно "OOMKilled": true.
- Memory limit слишком низкий для БД — Postgres с shared_buffers=4 ГБ и лимитом 2 ГБ падает. Учитывайте, что shared_buffers не единственный потребитель — есть work_mem, maintenance_work_mem.
- CPU limit в дробном значении — на хосте с 4 ядрами --cpus=3.5 даст 3.5 vCPU, но если другие контейнеры тоже просят CPU — возникает contention. Используйте cpu-shares для приоритета.
- swap — если на хосте включён swap, Docker может использовать его. Отключайте swap для прода, иначе производительность упадёт.
Отладка: команда docker stats показывает текущее потребление. Для сбора истории — cadvisor или Prometheus.
Инструменты для расчёта: от теории к практике
Помимо ручного расчёта, используйте:
- Калькулятор Docker ресурсов — введите base, peak, количество воркеров, получите верные лимиты.
- docker stats — мониторинг в реальном времени.
- cadvisor — веб-интерфейс для просмотра ресурсов.
- Kubernetes VPA — рекомендации по ресурсам, если у вас кластер.
Лучший способ — измерить реальное потребление под нагрузкой (wrk, siege) и скорректировать.
🧮 Посчитайте сами — инструменты по теме
🧭 Разделы по теме
Частые вопросы
Сколько памяти выделить на PHP-FPM контейнер?
Формула: (num_children × (max_request_memory + base)) × buffer. Для 5 детей с max 50 МБ и base 30 МБ — (5×80)×1.5 = 600 МБ. Добавьте 10% overhead.
Как проверить, хватает ли ресурсов контейнеру?
Запустите docker stats . Если memory usage близок к limit или CPU > 80% часто — увеличьте ресурсы. Логи запросов тоже показывают таймауты при нехватке CPU.
Что такое OOM-killer и как его избежать?
OOM-killer (Out Of Memory killer) — механизм ядра, убивающий процесс при нехватке RAM. Чтобы избежать: ставьте --memory-reservation на 30% ниже лимита и следите за usage.
Можно ли дать контейнеру все ресурсы хоста?
Можно, не указывая лимиты, но это опасно: контейнер может занять всю память и вызвать OOM для других процессов. На проде всегда ограничивайте.
Как считать CPU, если приложение многопоточное?
Измерьте нагрузку под пиком в vCPU через docker stats или htop. Для Java приложений учитывайте GC — он может резко поднимать CPU. Ставьте лимит = средний пик × 1.3.
Почему docker stats показывает больше, чем лимит?
Docker stats показывает общее потребление хоста, если контейнер не ограничен. С лимитом — usage не превышает limit. Проверьте, что контейнер запущен с --memory.
Как настроить swap для Docker?
На проде swap рекомендуется отключить. Если нужно, добавьте --memory-swap=2G (общий лимит RAM+swap). Помните: swap замедляет производительность.
Что такое docker-compose ресурсы?
Параметры deploy.resources.limits и reservations в docker-compose.yml. Пример: services: web: deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.25' memory: 256M
Источники и нормативные документы
- Docker официальная документация по ресурсам
- cgroups v2 — Linux Kernel
- PostgreSQL — настройка shared_buffers