Unterschied zwischen cgroups und Namespaces


84

Ich habe vor kurzem angefangen, Docker zu lernen, und es scheint, dass der größte Teil des schweren Hebens vom Linux-Kernel unter Verwendung von Namespaces und cgroups ausgeführt wird.

Ein paar Dinge, die ich verwirrend finde, sind:

  1. Was ist der Unterschied zwischen einem Namespace und einer cgroup? Welche unterschiedlichen Anwendungsfälle werden angesprochen?

  2. Was hat Docker zusätzlich implementiert, um an Popularität zu gewinnen?

  3. Ich würde gerne wissen, welche Interna diese Funktionen haben und wie sie implementiert sind.


Antworten:


107

Die richtigen Links für diese beiden Begriffe wurden in PR 14307 festgelegt :

Unter der Haube basiert Docker auf folgenden Komponenten:

Die Gruppen und namespacesFunktionen des Linux-Kernels

Mit:

  • cgroup : Kontrollgruppen bieten einen Mechanismus zum Aggregieren / Partitionieren von Aufgabensätzen und all ihren zukünftigen untergeordneten Elementen in hierarchischen Gruppen mit speziellem Verhalten.
  • Namespace : Umschließt eine globale Systemressource mit einer Abstraktion, die den Prozessen im Namespace den Eindruck vermittelt, dass sie über eine eigene isolierte Instanz der globalen Ressource verfügen.

Zusamenfassend:

  • Cgroups = begrenzt, wie viel Sie verwenden können;
  • Namespaces = begrenzt, was Sie sehen (und daher verwenden) können

Weitere Informationen finden Sie unter " Anatomie eines Containers: Namespaces, cgroups & Some Filesystem Magic " von Jérôme Petazzoni .

Bei Cgroups werden Ressourcen gemessen und begrenzt:

  • Erinnerung
  • Zentralprozessor
  • Block I / O.
  • Netzwerk

Namespaces bieten Prozessen eine eigene Sicht auf das System

Mehrere Namespaces:


Vielen Dank. Basiert chrootauf einem Namespace? Kann chrootdurch einen Namespace ersetzt werden?
Tim

1
Nein, chroot basiert nicht auf einem Namespace: siehe itnext.io/… . Beachten Sie jedoch, dass der neue Docker (19.03, noch in der Beta) mehr als drei Jahre später als rootless ausgeführt werden kann: github.com/moby/moby/blob/… . Und kann Ressourcen im Host-Namespace
verfügbar machen

Kann chrootdurch einen Namespace ersetzt werden?
Tim

1
@ Tim Nicht nativ. Vielleicht mit pivot_root? ( unix.stackexchange.com/a/456777/7490 ) Siehe auch github.com/vincentbernat/jchroot
VonC

1
twitter.com/b0rk/status/1225445956734390273 für die Containerillustration
VonC


2

Cgroups (Kontrollgruppen) führt die Ressourcenverwaltung durch.
Es bestimmt, wie viele Ressourcen des Hostcomputers Containern zugewiesen werden sollen.

Zum Beispiel: - Wir definieren Ressourcen in der Docker-Compose-Yaml-Datei zum Erstellen von Diensten wie:

Ressourcen:
  Grenzen:
    cpus: 0,1 (100 Millicores)
    Speicher: 50M

In diesem Beispiel bitten wir cgroups explizit, diese Ressourcen einem bestimmten Container zuzuweisen.


Namespaces : Bietet Prozessisolierung, vollständige Isolierung von Containern und separates Dateisystem.


Es gibt 6 Arten von Namespaces:
1. mount ns - für Dateisystem.
2. UTS (Unique Time Sharing) ns-, die nach unterschiedlichen Hostnamen laufender Container sucht
3. IPC ns - Interprozesskommunikation
4. Netzwerk ns- sorgt für unterschiedliche IP-Zuordnung zu verschiedenen Containern
5. PID ns - Prozess-ID-Isolation
6. Benutzer ns - anderer Benutzername (UID)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.