Sobes.tech
Middle

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

sobes.tech AI

Отговор от 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: Лимит на броя операции на запис към устройството (операции в секунда).
  • Мрежа:
    • Ограничаването на мрежовите ресурси директно чрез флаговете docker run е ограничено. Обикновено за това се използват външни инструменти, например tc (traffic control), netem или инструменти за оркестрация (Kubernetes NetworkPolicy).

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

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

# Стартиране на контейнер с твърд лимит на CPU Quota и памет
docker run -d --cpu-quota 50000 --memory 1g alpine sleep infinity

Docker преобразува тези флагове в съответните настройки на cgroups за групата процеси, стартирана вътре в контейнера. Тези настройки се управляват чрез виртуалната файлова система /sys/fs/cgroup вътре в контейнера (при монтиране) и на хост системата.