Ресурсы Docker: формула расчета, примеры и онлайн-калькулятор

💻 IT и кодОбновлено: 13 июля 2026 г.4 мин чтения
Вы настраиваете Docker контейнеры, но не знаете, сколько CPU и памяти выделить? Перебор — платите за idle, недобор — падает прод. Разбираем формулу расчёта, примеры под 2026 год и даём готовый инструмент — <a href="/onlayn-kalkulyatory/dlya-programmistov/kalkulyator-docker-resursov">Калькулятор Docker ресурсов</a>.
⚡ Коротко: главное
  • Типовой веб-сервис (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

Базовая формула для контейнера:

Memory_limit = (Base + Peak × buffer) + overhead

Где:

  • Base — минимальный расход приложения в покое (0.1-0.5 ГБ для PHP-FPM).
  • Peak — максимальное потребление на пике (сумма всех параллельных воркеров).
  • buffer = 1.2–2.0, зависит от SLA (1.5 для типичного веба).
  • overhead — системные процессы: 50–100 МБ на контейнер.
CPU_limit = Expected_load × safety_factor

где 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.

  1. NGINX: base 50 МБ, peak 100 МБ → 150 МБ × 1.2 = 180 МБ + overhead → 200 МБ. CPU: load 0.2 vCPU × 1.5 = 0.3 vCPU.
  2. 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.
  3. Redis: base 10 МБ, peak 1.5 ГБ (кэш) ×1.2 = 1.8 ГБ. CPU: 0.1 vCPU ×1.5 = 0.15.
  4. 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. 1
    Определите Base

    Запустите контейнер без нагрузки, замерьте memory и CPU через docker stats

  2. 2
    Замерьте Peak

    Сгенерируйте нагрузку (например, wrk -c 100), зафиксируйте максимум

  3. 3
    Выберите buffer

    1.2 для тестового, 1.5 для прода, 2.0 для критичного SLA

  4. 4
    Примените формулу

    Memory = (Base+Peak)*buffer + overhead, CPU = load*1.5

  5. 5
    Установите лимиты

    docker run --memory=... --memory-reservation=... --cpus=...

5 шагов для определения корректных лимитов

Ограничения cgroups: --memory и --cpus

Docker использует cgroups v2. Параметры запуска:

ПараметрПримерОписание
--memory512mЖёсткий лимит RAM. Превышение → OOM.
--memory-reservation256mМягкий лимит; контейнер может превысить, если есть свободная память.
--cpus1.5Максимум vCPU (дробное).
--cpu-shares1024Вес для планировщика 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

Источники и нормативные документы

  1. Docker официальная документация по ресурсам
  2. cgroups v2 — Linux Kernel
  3. PostgreSQL — настройка shared_buffers

Ещё по теме «IT и код»