Sobes.tech
Middle

Wie erfolgt die Ressourcenbeschränkung in Docker?

sobes.tech KI

Antwort von AI

Die Ressourcenbegrenzung in Docker erfolgt durch Namespaces und Control Groups (cgroups) des Linux-Kernels. Namespaces isolieren Systemressourcen, während cgroups die Nutzung von Ressourcen für Prozessgruppen einschränken, erfassen und isolieren.

Wichtige Parameter zur Ressourcenbegrenzung:

  • CPU:
    • --cpu-shares: Gewichteter Wert zur Verteilung der CPU zwischen Containern, wenn sie begrenzt ist. Standardwert 1024.
    • --cpu-quota: Maximale CPU-Zeit (in Mikrosekunden), die innerhalb eines Zeitraums (--cpu-period) genutzt werden darf. Standard 100000.
    • --cpu-period: Zeitraum in Mikrosekunden für --cpu-quota.
    • --cpuset-cpus: Gibt an, welche CPU-Kerne vom Container genutzt werden dürfen.
  • Speicher:
    • --memory: Feste Begrenzung des Arbeitsspeichers. Überschreitet der Container diese Grenze, kann er beendet werden.
    • --memory-swap: Feste Begrenzung der Summe aus RAM und Swap.
    • --memory-reservation: Weiche Begrenzung des Arbeitsspeichers. Bei Ressourcenbeschränkungen werden Container mit geringerer Reservierung eher in den Swap verschoben.
    • --kernel-memory: Begrenzung des Kernel-Speichers.
    • --memswap-swappiness: Wie bereitwillig der Kernel Swap für diesen Container nutzt (0 bis 100). 0 - sehr unwillig, 100 - sehr willig.
  • Block-I/O:
    • --blkio-weight: Gewichteter Wert für die Verteilung des I/O zwischen Containern.
    • --blkio-weight-device: Gewichteter Wert für ein spezielles Blockgerät.
    • --device-read-bps: Begrenzung der Lesegeschwindigkeit des Geräts (Bytes pro Sekunde).
    • --device-write-bps: Begrenzung der Schreibgeschwindigkeit auf das Gerät (Bytes pro Sekunde).
    • --device-read-iops: Begrenzung der Anzahl der Leseoperationen des Geräts (Operationen pro Sekunde).
    • --device-write-iops: Begrenzung der Anzahl der Schreiboperationen auf das Gerät (Operationen pro Sekunde).
  • Netzwerk:
    • Die Begrenzung der Netzwerkressourcen direkt über die docker run-Flags ist eingeschränkt. In der Regel werden externe Tools wie tc (Traffic Control), netem oder Orchestrierungstools (Kubernetes NetworkPolicy) verwendet.

Beispiele:

# Container mit CPU-Share- und Memory-Limit starten
docker run -d --cpu-shares 512 --memory 512m alpine sleep infinity

# Container mit striktem CPU-Quota- und Memory-Limit starten
docker run -d --cpu-quota 50000 --memory 1g alpine sleep infinity

Docker wandelt diese Flags in entsprechende cgroups-Einstellungen für die Prozessgruppe um, die innerhalb des Containers läuft. Diese Einstellungen werden über das virtuelle Dateisystem /sys/fs/cgroup im Container (bei Mount) und auf dem Host-System verwaltet.