Назад к вопросам
Middle
111
questionbank

Как осуществляется ограничение ресурсов в Docker?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Ограничение ресурсов в Docker реализуется через namespaces и control groups (cgroups) ядра Linux. Namespaces изолируют системные ресурсы, а cgroups ограничивают, учитывают и изолируют использование ресурсов для групп процессов.

Ключевые параметры для ограничения ресурсов:

  • CPU:
    • --cpu-shares: Весовое значение для распределения CPU между контейнерами, когда он ограничен. Значение по умолчанию 1024.
    • --cpu-quota: Максимальное количество времени CPU (в микросекундах) для использования в течение периода (--cpu-period). По умолчанию 100000.
    • --cpu-period: Период времени CPU (в микросекундах) для --cpu-quota.
    • --cpuset-cpus: Указывает, какие ядра CPU могут использовать контейнеры.
  • Memory:
    • --memory: Жесткий лимит по оперативной памяти. Если контейнер превышает этот лимит, он может быть завершен.
    • --memory-swap: Жесткий лимит по сумме оперативной памяти и swap.
    • --memory-reservation: Мягкий лимит по оперативной памяти. При ограничении ресурсов, контейнеры с меньшим reservation будут раньше вытеснены в swap, чем те, у кого memory-reservation больше.
    • --kernel-memory: Лимит по памяти ядра.
    • --memswap-swappiness: Насколько охотно ядро будет использовать swap для этого контейнера (от 0 до 100). 0 - очень неохотно, 100 - очень охотно.
  • Block I/O:
    • --blkio-weight: Весовое значение для распределения I/O между контейнерами.
    • --blkio-weight-device: Весовое значение для отдельного устройства block I/O.
    • --device-read-bps: Лимит на скорость чтения с устройства (байты в секунду).
    • --device-write-bps: Лимит на скорость записи на устройство (байты в секунду).
    • --device-read-iops: Лимит на количество операций чтения с устройства (операции в секунду).
    • --device-write-iops: Лимит на количество операций записи на устройство (операции в секунду).
  • Network:
    • Ограничение сетевых ресурсов напрямую через флаги docker run ограничено. Обычно для этого используются внешние инструменты, например, tc (traffic control), netem или инструменты оркестрации (Kubernetes NetworkPolicy).

Примеры использования:

# Запуск контейнера с ограничением CPU Shares и памяти
docker run -d --cpu-shares 512 --memory 512m alpine sleep infinity

# Запуск контейнера с жестким лимитом CPU Quota и Memory
docker run -d --cpu-quota 50000 --memory 1g alpine sleep infinity

Docker преобразует эти флаги в соответствующие настройки cgroups для группы процессов, запущенных внутри контейнера. Эти настройки управляются через виртуальную файловую систему /sys/fs/cgroup внутри контейнера (при монтировании) и на хост-системе.