Ограничения CPU & памяти
Тема дорожной карты · Docker & Containers
Ограничения CPU и памяти для контейнеров Docker реализуются с помощью флагов --cpus, --cpu-shares, --memory и --memory-swap команды docker run. Эти параметры позволяют контролировать потребление ресурсов и предотвращают ситуацию, когда один проблемный контейнер может заблокировать доступ к ресурсам для других контейнеров, включая сам демон Docker. Управление ресурсами через cgroups является ключевым элементом обеспечения стабильной работы контейнеров.
Ограничения ресурсов особенно важны для производственной среды, где один OOM (Out Of Memory) контейнер может привести к отказу всего хоста. Кроме того, правильная настройка лимитов памяти и CPU помогает предотвратить сбои и обеспечивает стабильную работу сервисов.
Как это работает
Ограничения ресурсов в Docker реализуются через систему управления группами контейнеров (cgroups). С помощью флагов --memory и --cpus можно установить жесткие ограничения на использование памяти и процессорного времени контейнером. Флаг --cpu-shares позволяет задать относительный приоритет контейнеров при распределении процессорного времени, а флаг --memory-swap управляет отношением между памятью и swap-пространством.
Ограничения ресурсов также могут быть настроены через конфигурационные файлы Docker, такие как docker-compose.yml или через API Docker. Это позволяет автоматизировать процесс настройки ресурсов для множества контейнеров, что особенно полезно для больших сред.
Когда применять
Лимиты памяти и CPU следует устанавливать для каждого производственного контейнера, чтобы предотвратить ситуацию, когда один OOM-сервис может уронить весь хост. Важно также настроить правильную политику перезапуска контейнеров, чтобы система могла автоматически восстановиться после сбоя.
Явно настройте политику вращения логов (--log-opt max-size=10m --log-opt max-file=5), чтобы избежать ситуации, когда логи могут заблокировать диск хоста. Без явного ограничения размера логов файлы могут расти без ограничений, что может привести к проблемам с производительностью и стабильностью системы.
Типичные ошибки
Одной из распространенных ошибок является отсутствие ограничений ресурсов для контейнеров, что может привести к ситуации, когда Linux OOM Killer будет активирован в неподходящее время. Другой распространенной ошибкой является установка политики перезапуска restart: always для контейнера, который находится в бесконечном цикле аварийного завершения. Это может привести к DDoS-атаке на реестр из-за постоянных попыток перезапуска контейнера.
Логи могут быстро заполнить диск хоста, особенно если они не настроены для автоматической ротации. Обычно виновником являются файлы логов, расположенные по пути /var/lib/docker/containers/*-json.log.