Sobes.tech
Middle

Jak odbywa się ograniczanie zasobów w Dockerze?

sobes.tech AI

Odpowiedź od AI

Ograniczenie zasobów w Dockerze realizowane jest za pomocą namespaces i grup kontrolnych (cgroups) jądra Linux. Namespaces izolują zasoby systemowe, a cgroups ograniczają, rozliczają i izolują użycie zasobów dla grup procesów.

Kluczowe parametry do ograniczania zasobów:

  • CPU:
    • --cpu-shares: Wartość ważona do dystrybucji CPU między kontenerami, gdy jest ograniczona. Domyślna wartość 1024.
    • --cpu-quota: Maksymalna ilość czasu CPU (w mikrosekundach) do wykorzystania w okresie (--cpu-period). Domyślnie 100000.
    • --cpu-period: Okres czasu CPU (w mikrosekundach) dla --cpu-quota.
    • --cpuset-cpus: Wskazuje, które rdzenie CPU mogą używać kontenery.
  • Pamięć:
    • --memory: Sztywny limit pamięci RAM. Jeśli kontener go przekroczy, może zostać zakończony.
    • --memory-swap: Sztywny limit sumy pamięci RAM i swap.
    • --memory-reservation: Miękki limit pamięci RAM. Przy ograniczeniu zasobów kontenery z mniejszą rezerwacją będą wcześniej przenoszone do swapu niż te z większą memory-reservation.
    • --kernel-memory: Limit pamięci jądra.
    • --memswap-swappiness: Jak chętnie jądro będzie korzystać z swapu dla tego kontenera (od 0 do 100). 0 - bardzo niechętnie, 100 - bardzo chętnie.
  • Operacje blokowe I/O:
    • --blkio-weight: Wartość ważona do dystrybucji I/O między kontenerami.
    • --blkio-weight-device: Wartość ważona dla konkretnego urządzenia blokowego.
    • --device-read-bps: Limit prędkości odczytu z urządzenia (w bajtach na sekundę).
    • --device-write-bps: Limit prędkości zapisu na urządzenie (w bajtach na sekundę).
    • --device-read-iops: Limit liczby operacji odczytu z urządzenia (operacje na sekundę).
    • --device-write-iops: Limit liczby operacji zapisu na urządzenie (operacje na sekundę).
  • Sieć:
    • Ograniczenie zasobów sieciowych bezpośrednio przez flagi docker run jest ograniczone. Zazwyczaj używa się zewnętrznych narzędzi, takich jak tc (traffic control), netem lub narzędzi orkiestracyjnych (Kubernetes NetworkPolicy).

Przykłady użycia:

# Uruchomienie kontenera z ograniczeniem CPU Shares i pamięci
docker run -d --cpu-shares 512 --memory 512m alpine sleep infinity

# Uruchomienie kontenera z sztywnym limitem CPU Quota i pamięci
docker run -d --cpu-quota 50000 --memory 1g alpine sleep infinity

Docker konwertuje te flagi na odpowiednie ustawienia cgroups dla grupy procesów uruchomionej wewnątrz kontenera. Ustawienia te są zarządzane przez system plików /sys/fs/cgroup wewnątrz kontenera (przy montowaniu) i na hoście.