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

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

Sobes Copilot

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

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

sobes.tech AI

Docker использует cgroups (control groups) и namespaces для ограничения и изоляции ресурсов контейнеров.

  • cgroups позволяют ограничивать и учитывать использование ресурсов (CPU, память, I/O, сеть).
  • Namespaces обеспечивают изоляцию процессов, сети, монтированных точек, пользователей.

Основные параметры ограничения ресурсов:

  • CPU:
    • --cpu-shares: Задает относительную "важность" контейнера. Контейнер получает долю доступного CPU пропорционально этому значению по сравнению с другими контейнерами, имеющими --cpu-shares. По умолчанию 1024.
    • --cpu-quota: Ограничивает использование CPU абсолютным значением в микросекундах за период --cpu-period. Например, --cpu-period=100000 --cpu-quota=50000 означает 50% одного ядра.
    • --cpuset-cpus: Ограничивает контейнер конкретными ядрами процессора (например, 0,1 или 0-3).
    • --cpuset-mems: Ограничивает доступ контейнера к определенным узлам памяти NUMA.
  • Память:
    • --memory: Ограничивает объем оперативной памяти, доступной контейнеру. Поддерживаются суффиксы b, k, m, g.
    • --memory-swap: Устанавливает лимит на общую память (RAM + Swap). Если меньше --memory, то контейнер не может использовать swap. Если --memory-swap больше --memory, то разница между ними - это максимально доступный swap.
    • --memory-swappiness: Устанавливает коэффициент swappiness для контейнера (по умолчанию -1, что соответствует настройкам хоста).
    • --memory-reservation: Мягкое ограничение памяти. Контейнер будет использовать не менее этого объема, если он доступен, но может потреблять и больше, до --memory. Система попытается сохранить этот объем для контейнера при давлении на память.
    • --kernel-memory: Ограничивает память ядра, используемую контейнером.
  • I/O (Block IO):
    • --blkio-weight: Задает относительный вес для блочного ввода-вывода (по умолчанию 500). Влияет на распределение пропускной способности I/O.
    • --blkio-weight-device: Устанавливает вес для конкретного блочного устройства.
    • --device-read-bps / --device-write-bps: Ограничивает скорость чтения/записи (в байтах в секунду) для конкретного устройства.
    • --device-read-iops / --device-write-iops: Ограничивает количество операций чтения/записи в секунду для конкретного устройства.
  • Network: Непрямое ограничение через настройку сетевых интерфейсов в пространстве имен сети или с помощью инструментов уровня операционной системы (например, tc).

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

# Запуск контейнера с ограничением CPU (50% одного ядра) и памяти (512MB)
docker run -d --name my_limited_app \
    --cpu-quota=50000 --cpu-period=100000 \
    --memory=512m \
    my_image:latest
# Запуск контейнера с ограничением CPU до ядер 0 и 1, памятью 1GB и блочным весом 700
docker run -d --name another_limited_app \
    --cpuset-cpus="0,1" \
    --memory=1g \
    --blkio-weight=700 \
    another_image:latest