Docker ist keine Virtualisierungsmethode. Es basiert auf anderen Tools, die tatsächlich containergestützte Virtualisierung oder Virtualisierung auf Betriebssystemebene implementieren. Zu diesem Zweck verwendete Docker zunächst den LXC-Treiber und wechselte dann zu libcontainer, der jetzt in runc umbenannt wird. Docker konzentriert sich hauptsächlich auf die Automatisierung der Bereitstellung von Anwendungen in Anwendungscontainern. Anwendungscontainer dienen zum Packen und Ausführen eines einzelnen Dienstes, während Systemcontainer zum Ausführen mehrerer Prozesse wie virtuelle Maschinen ausgelegt sind. Daher wird Docker als Containerverwaltungs- oder Anwendungsbereitstellungstool auf containerisierten Systemen betrachtet.
Um zu wissen, wie es sich von anderen Virtualisierungen unterscheidet, gehen wir die Virtualisierung und ihre Typen durch. Dann wäre es einfacher zu verstehen, was dort den Unterschied ausmacht.
Virtualisierung
In seiner konzipierten Form wurde es als Methode zur logischen Aufteilung von Mainframes angesehen, damit mehrere Anwendungen gleichzeitig ausgeführt werden können. Das Szenario änderte sich jedoch drastisch, als Unternehmen und Open Source-Communities in der Lage waren, eine Methode zum Behandeln der privilegierten Anweisungen auf die eine oder andere Weise bereitzustellen und die gleichzeitige Ausführung mehrerer Betriebssysteme auf einem einzigen x86-basierten System zu ermöglichen.
Hypervisor
Der Hypervisor verwaltet die virtuelle Umgebung, in der die virtuellen Gastmaschinen ausgeführt werden. Es überwacht die Gastsysteme und stellt sicher, dass den Gästen bei Bedarf Ressourcen zugewiesen werden. Der Hypervisor befindet sich zwischen der physischen Maschine und den virtuellen Maschinen und stellt den virtuellen Maschinen Virtualisierungsdienste zur Verfügung. Um dies zu realisieren, fängt es die Operationen des Gastbetriebssystems auf den virtuellen Maschinen ab und emuliert die Operation auf dem Betriebssystem der Hostmaschine.
Die rasche Entwicklung von Virtualisierungstechnologien, hauptsächlich in der Cloud, hat die Verwendung der Virtualisierung weiter vorangetrieben, indem mithilfe von Hypervisoren wie Xen, VMware Player, KVM usw. mehrere virtuelle Server auf einem einzigen physischen Server erstellt werden konnten Integration von Hardware-Unterstützung in Standardprozessoren wie Intel VT und AMD-V.
Arten der Virtualisierung
Die Virtualisierungsmethode kann basierend darauf kategorisiert werden, wie sie Hardware für ein Gastbetriebssystem nachahmt und eine Gastbetriebsumgebung emuliert. In erster Linie gibt es drei Arten der Virtualisierung:
- Emulation
- Paravirtualisierung
- Containerbasierte Virtualisierung
Emulation
Die Emulation, auch als vollständige Virtualisierung bezeichnet, führt den Betriebssystemkern der virtuellen Maschine vollständig in Software aus. Der in diesem Typ verwendete Hypervisor ist als Typ 2-Hypervisor bekannt. Es wird oben auf dem Host-Betriebssystem installiert, das für die Übersetzung des Kernel-Codes des Gastbetriebssystems in Softwareanweisungen verantwortlich ist. Die Übersetzung erfolgt vollständig in Software und erfordert keine Hardware-Beteiligung. Die Emulation ermöglicht die Ausführung jedes nicht geänderten Betriebssystems, das die zu emulierende Umgebung unterstützt. Der Nachteil dieser Art der Virtualisierung ist ein zusätzlicher Overhead an Systemressourcen, der zu einer Leistungsminderung im Vergleich zu anderen Arten von Virtualisierungen führt.
Beispiele in dieser Kategorie sind VMware Player, VirtualBox, QEMU, Bochs, Parallels usw.
Paravirtualisierung
Die Paravirtualisierung, auch als Typ 1-Hypervisor bezeichnet, wird direkt auf der Hardware oder „Bare-Metal“ ausgeführt und stellt Virtualisierungsdienste direkt für die darauf ausgeführten virtuellen Maschinen bereit. Es hilft dem Betriebssystem, der virtualisierten Hardware und der realen Hardware, zusammenzuarbeiten, um eine optimale Leistung zu erzielen. Diese Hypervisoren haben normalerweise einen relativ geringen Platzbedarf und erfordern selbst keine umfangreichen Ressourcen.
Beispiele in dieser Kategorie sind Xen, KVM usw.
Containerbasierte Virtualisierung
Die containergestützte Virtualisierung, auch als Virtualisierung auf Betriebssystemebene bezeichnet, ermöglicht mehrere isolierte Ausführungen innerhalb eines einzelnen Betriebssystemkerns. Es bietet die bestmögliche Leistung und Dichte sowie ein dynamisches Ressourcenmanagement. Die isolierte virtuelle Ausführungsumgebung, die von dieser Art der Virtualisierung bereitgestellt wird, wird als Container bezeichnet und kann als verfolgte Gruppe von Prozessen angesehen werden.
Das Konzept eines Containers wird durch die Namespaces-Funktion ermöglicht, die der Linux-Kernel-Version 2.6.24 hinzugefügt wurde. Der Container fügt jedem Prozess seine ID hinzu und fügt jedem Systemaufruf neue Zugriffskontrollprüfungen hinzu. Der Zugriff erfolgt über den Systemaufruf clone () , mit dem separate Instanzen zuvor globaler Namespaces erstellt werden können.
Namespaces können auf viele verschiedene Arten verwendet werden. Am häufigsten wird jedoch ein isolierter Container erstellt, der keine Sichtbarkeit oder keinen Zugriff auf Objekte außerhalb des Containers hat. Prozesse, die im Container ausgeführt werden, scheinen auf einem normalen Linux-System ausgeführt zu werden, obwohl sie den zugrunde liegenden Kernel mit Prozessen teilen, die sich in anderen Namespaces befinden, wie dies auch für andere Arten von Objekten der Fall ist. Wenn Sie beispielsweise Namespaces verwenden, wird der Root-Benutzer im Container nicht als Root außerhalb des Containers behandelt, was zusätzliche Sicherheit bietet.
Das Subsystem Linux Control Groups (cgroups), die nächste Hauptkomponente zur Aktivierung der containergestützten Virtualisierung, wird zum Gruppieren von Prozessen und zum Verwalten ihres gesamten Ressourcenverbrauchs verwendet. Es wird häufig verwendet, um den Speicher- und CPU-Verbrauch von Containern zu begrenzen. Da ein containerisiertes Linux-System nur einen Kernel hat und der Kernel die Container vollständig sichtbar ist, gibt es nur eine Ebene für die Ressourcenzuweisung und -planung.
Für Linux-Container stehen verschiedene Verwaltungstools zur Verfügung, darunter LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker usw.
Container gegen virtuelle Maschinen
Im Gegensatz zu einer virtuellen Maschine muss ein Container den Betriebssystemkern nicht starten, sodass Container in weniger als einer Sekunde erstellt werden können. Diese Funktion macht die containergestützte Virtualisierung einzigartig und wünschenswert als andere Virtualisierungsansätze.
Da die containergestützte Virtualisierung dem Hostcomputer nur wenig oder gar keinen Overhead hinzufügt, weist die containergestützte Virtualisierung eine nahezu native Leistung auf
Für die containergestützte Virtualisierung ist im Gegensatz zu anderen Virtualisierungen keine zusätzliche Software erforderlich.
Alle Container auf einem Hostcomputer teilen sich den Scheduler des Hostcomputers und sparen zusätzliche Ressourcen.
Containerzustände (Docker- oder LXC-Images) sind im Vergleich zu Images virtueller Maschinen klein, sodass Container-Images einfach zu verteilen sind.
Das Ressourcenmanagement in Containern wird durch cgroups erreicht. In Cgroups dürfen Container nicht mehr Ressourcen verbrauchen, als ihnen zugewiesen wurden. Ab sofort sind jedoch alle Ressourcen der Host-Maschine in virtuellen Maschinen sichtbar, können jedoch nicht verwendet werden. Dies kann durch gleichzeitiges Ausführen top
oder htop
auf Containern und Hostcomputern realisiert werden . Die Ausgabe in allen Umgebungen sieht ähnlich aus.
Aktualisieren:
Wie führt Docker Container in Nicht-Linux-Systemen aus?
Wenn Container aufgrund der im Linux-Kernel verfügbaren Funktionen möglich sind, ist die offensichtliche Frage, wie Nicht-Linux-Systeme Container ausführen. Sowohl Docker für Mac als auch Windows verwenden Linux-VMs, um die Container auszuführen. Docker Toolbox zum Ausführen von Containern in Virtual Box-VMs. Der neueste Docker verwendet jedoch Hyper-V unter Windows und Hypervisor.framework unter Mac.
Lassen Sie mich nun detailliert beschreiben, wie Docker für Mac Container ausführt.
Docker für Mac verwendet https://github.com/moby/hyperkit , um die Hypervisor-Funktionen zu emulieren, und Hyperkit verwendet hypervisor.framework in seinem Kern. Hypervisor.framework ist die native Hypervisor-Lösung von Mac. Hyperkit verwendet außerdem VPNKit und DataKit, um das Netzwerk bzw. das Dateisystem zu benennen.
Die Linux-VM, die Docker auf einem Mac ausführt, ist schreibgeschützt. Sie können jedoch darauf zugreifen, indem Sie Folgendes ausführen:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
Jetzt können wir sogar die Kernel-Version dieser VM überprüfen:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
Alle Container werden in dieser VM ausgeführt.
Es gibt einige Einschränkungen für hypervisor.framework. Aus diesem Grund macht Docker die docker0
Netzwerkschnittstelle in Mac nicht verfügbar . Sie können also nicht vom Host aus auf Container zugreifen. Ist ab sofort docker0
nur noch in der VM verfügbar.
Hyper-v ist der native Hypervisor in Windows. Sie versuchen auch, die Funktionen von Windows 10 zu nutzen, um Linux-Systeme nativ auszuführen.