Was ist ein Container?


Antworten:


18

Das allererste, was Sie über einen Container wissen sollten, ist:

Es ist in erster Linie ein Prozess.

Sobald dies verstanden ist, kann man anfangen zu verstehen, wie Container mit virtuellen Maschinen verglichen und kontrastiert werden. Container und VMs sind von ihren Hosts isoliert . Die Methode der Isolierung ist der entscheidende Unterschied.

Containerprozesse verwenden Erweiterungen des Betriebssystem-Kernel-Hosts, auf dem sie ausgeführt werden, um sich von anderen Prozessen zu isolieren. Andere Erweiterungen bieten auch eine Datenträger- und Ressourcenisolierung. Container teilen ihren Kernel und Speicher mit dem Host-Betriebssystem.

Virtuelle Maschinen verwenden einen Hypervisor , um VMs von ihren Hosts zu isolieren. Hierbei handelt es sich um eine Softwareschicht, die Ressourcenanforderungen von "Gästen" (VMs) an die Hardware weiterleitet. Die Datenträgerisolierung wird durch die Datenträgervirtualisierung bereitgestellt. VMs nicht einen Kernel mit dem Wirt sie ihren eigenen Kernel in dem Speicherraum laden zur VM gewidmet teilen.

Ein wichtiger Effekt dieses Unterschieds ist, dass ein Container mit seinem Host kernelkompatibel sein muss. Beispielsweise ist es nicht möglich, einen Windows Nano Server-basierten Container auf einem Linux-Host oder einen Ubuntu-Container direkt auf einem Windows-Host auszuführen. Im Gegensatz dazu können auf virtuellen Maschinen alle Kernel ausgeführt werden, unabhängig vom Host-Betriebssystem. Wenn Sie einen Linux-Container auf einem Windows-Host ausführen, führt Docker den Container auf einer Linux-VM aus.

Die betrieblichen Unterschiede liegen in der Beweglichkeit: Container starten und stoppen ungefähr so ​​schnell wie ein normaler Prozess. VMs sind "schwerer" und erfordern dedizierte Ressourcen, die für sie reserviert sind. Das Starten und Herunterfahren dauert länger.

Container bieten einem DevOps-Betriebsmodell viel Flexibilität:

  • Container isolieren Abhängigkeiten von Softwarekomponenten. Entwickler können Container verwenden, um zu gewährleisten, dass ein Anwendungsmodul auf ihren Entwicklungsmaschinen genauso gut funktioniert wie in QA / UA / Production
  • Container verwenden für die Kommunikation ein softwaredefiniertes Netzwerk
  • Containerdefinitionen sind deklarativ und können über die Quelle gesteuert werden
  • Container-Management-Systeme (Kubernetes, DC / OS, Swarm) können Hardware-Ressourcen-Pools (Compute / RAM / Storage) verwalten und Container dynamisch skalieren

1
Ich mache auch Ihre 3 letzten Aufzählungszeichen auf vSphere, dank Vagrant :)
Tensibai

8

Der Begriff Container bezieht sich auf eine leichte Virtualisierungstechnologie, die auf modernen Linux-Kerneln verfügbar ist. Diese Technologie ist FreeBSD-Jails sehr ähnlich.

Ein älterer, nicht containerfähiger Linux-Kernel kann Prozesse gleichzeitig ausführen. Einige Attribute des Systems können privat verarbeitet werden, z. B. die Prozessumgebung oder der Prozessspeicher. Nur der Prozess, der diese Attribute besitzt, und das Betriebssystem selbst können auf diese Daten zugreifen. (Es gibt eine Menge Schlupflöcher, wie bei einigen ps- Implementierungen, aber das stimmt im Wesentlichen!) Einige andere Attribute werden von den Prozessen gemeinsam genutzt, wie zum Beispiel das Dateisystem und die Netzwerkschnittstellen.

Ein moderner, containerfähiger Linux-Kernel kann mehr Attribute des Systems als private Daten verarbeiten, die einem Prozess oder einer Gruppe von Prozessen zugeordnet sind. Der resultierende Kontext ist ein Container. Anstatt ein Programm in den "Initial Containers" unter Verwendung des Dateisystems und der vom Betriebssystem initialisierten Netzwerkschnittstellen auszuführen, können Prozesse in anderen Containern ausgeführt werden, sodass ein anderes Dateisystem und ein anderes Dateisystem angezeigt werden andere Liste von Netzwerkschnittstellen. Daher teilen sich zwei Prozesse, die in unterschiedlichen Containern ausgeführt werden, nur den Kernel. Sie kennen vielleicht den Befehl chroot, mit dem ein Prozess in einer bestimmten Dateihierarchie ausgeführt werden kann. Container bringen die Idee ein paar Schritte weiter.

Dies ist natürlich nur eine sehr grobe Erklärung, aber ich hoffe, sie hilft bei der Klärung der Idee, was Container sind. Wofür sind sie gut?

Eine beliebte Schnittstelle zu den Containerfunktionen von Linux-Kerneln ist docker, ein Befehlszeilendienstprogramm, mit dem Artefakte für Dateisysteme ( Docker-Images ) erstellt und Prozesse in Containern ausgeführt werden können, auf die diese Dateisysteme zugreifen können. Diese Software-Suite ist auch in der Lage, virtuelle Ad-hoc-Netzwerksysteme zu erstellen, mit denen mehrere Container in einem privaten Netzwerk kommunizieren können.

Containerbasierte Technologien eignen sich für:

  • Beschreiben skalierbarer komplexer Bereitstellungen.
  • Stellen Sie Anwendungsentwicklern eine Umgebung zur Verfügung, die der Produktionsumgebung sehr ähnlich ist.
  • Implementieren Sie unveränderliche Servermuster, da Software-Artefakte in der Regel ein vollständiges Betriebssystem und nicht nur ein Anwendungspaket beschreiben.

(Da Sie mit anderen Virtualisierungstechnologien wie Virtual Box vertraut zu sein scheinen, könnten Sie bemerken, dass diese Technologien auch die drei oben genannten Punkte bequem angehen können. Heutzutage gibt es ein recht kleines Spektrum an Virtualisierungstechnologien, und wir können die Frage nach ihrer Beliebtheit in vergleichen bestimmte Zusammenhänge mit der Popularität von Computersprachen: Es hängt wahrscheinlich von den technischen Vorzügen jeder einzelnen Lösung ab, aber auch von vielen Faktoren, die ich nur als "Zufall" bezeichnen werde.)


1
Windows 16 ist nicht mehr auf Linux beschränkt und verfügt über die gleichen Fähigkeiten
Tensibai

1
Link zur Unterstützung meines Anspruchs docs.microsoft.com/en-us/virtualization/windowscontainers/…
Tensibai

7

Normalerweise beziehen sich Container auf Docker-Container, die den Namen populär gemacht haben

Ich zitiere dort aus der Docker-Definition:

Mit Hilfe von Containern wird alles, was zum Ausführen einer Software erforderlich ist, in isolierte Container verpackt. Im Gegensatz zu VMs wird in Containern kein vollständiges Betriebssystem gebündelt. Es werden nur Bibliotheken und Einstellungen benötigt, die erforderlich sind, damit die Software funktioniert.

Die Wurzelnamen lauten Linux-Container (lxc), deren Ziel es war, einen Prozess von seinem Host-System zu isolieren. Das erste Ziel bestand darin, eine Kompromittierung des Prozesses zur Übernahme des Host-Systems zu vermeiden.

Jetzt werden sie in einem weiteren Bereich verwendet. In einer modernen 'Container'-Definition werden Sie mehr oder weniger ein Paket zur Laufzeit freigeben, das Ihre Anwendung, gegebenenfalls die zugrunde liegende Middleware und alle erforderlichen Bibliotheken enthält, und Sie werden sicher sein, dass es auf jedem kompatiblen System ausgeführt werden kann.

Der zweite Vorteil besteht darin, dass mehrere Anwendungen mit derselben Abhängigkeit in unterschiedlichen Versionen verwendet werden können, ohne dass die Umgebungsvariablen stark angepasst werden müssen, damit die richtige geladen wird.

Anders als bei einem VM-System wie einer virtuellen Maschine mit virtueller Box oder einer EC2-Instanz unter AWS sind Container nur auf Dateisystemebene virtuell und nur auf dem Speicherstapel isoliert. Sie teilen sich immer noch den gleichen Host und das Betriebssystem unter ihnen wird CPU-Ticks vermitteln.

Eine virtuelle Maschine ist auf Hardwareebene virtuell und Sie führen ein Betriebssystem aus, ein Container ist auf Betriebssystemebene virtuell und Sie führen einen Prozess aus.


1
Hm, so etwas wie ein VirtualBox-Image (oder wie auch immer das in VirtualBox heißt) könnte sich auch als "Container" qualifizieren, oder verstehe ich es nicht?
Pierre.Vriens

Als ich sah, dass ich einen Teil der Frage vergessen hatte, fügte ich den Unterschied hinzu und erweiterte die Antwort.
Tensibai

3

Aus der AWS-Definition :

Container sind eine Methode zur Betriebssystemvirtualisierung, mit der Sie eine Anwendung und ihre Abhängigkeiten in ressourcenisolierten Prozessen ausführen können. Mit Containern können Sie den Code, die Konfigurationen und Abhängigkeiten einer Anwendung auf einfache Weise in benutzerfreundliche Bausteine ​​packen, die Umgebungskonsistenz, Betriebseffizienz, Entwicklerproduktivität und Versionskontrolle gewährleisten. Mithilfe von Containern kann sichergestellt werden, dass Anwendungen unabhängig von der Bereitstellungsumgebung schnell, zuverlässig und konsistent bereitgestellt werden. Mit Containern können Sie Ressourcen genauer steuern und so die Effizienz Ihrer Infrastruktur verbessern.

Beim Containerisieren werden alle für die Ausführung einer bestimmten Aufgabe / Umgebung erforderlichen Elemente so verpackt, dass sie autark sind und auf jeder Plattform ausgeführt werden können, die beim Einrichten und Installieren von Dingen mit erheblichem Aufwand verbunden ist.

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.