Definition

Container (containerbasierte Virtualisierung)

Container sind virtuell abgetrennte Umgebungen, in denen Software Anwendungen für die Bereitstellung verpackt und isoliert. Container greifen gemeinsam auf einen Betriebssystemkern zu, ohne dass virtuelle Maschinen (VMs) erforderlich sind.

Container basieren auf der Grundidee der Partitionierung, die bis in die 1960er Jahre zurückreicht, und in der Isolierung von Chroot-Prozessen, die als Teil von Unix in den 1970er Jahren entwickelt wurde. Ihre moderne Form findet ihren Ausdruck in der Anwendungscontainerisierung, zum Beispiel mit Docker, und der Systemcontainerisierung, zum Beispiel mit LXC (Linux Containers). Beide Containerarten ermöglichen es einem IT-Team, den Anwendungscode von der zugrundeliegenden Infrastruktur zu abstrahieren, was die Versionsverwaltung vereinfacht und die Portabilität über verschiedene Bereitstellungsumgebungen hinweg verbessert.

Container-Images enthalten die Informationen, die während der Laufzeit über eine Container-Engine auf dem Betriebssystem laufen. Containerisierte Anwendungen können aus mehreren Container-Images zusammengesetzt sein. So kann beispielsweise eine dreistufige Anwendung aus Front-End-Webserver-, Anwendungsserver- und Datenbankcontainern bestehen, die jeweils unabhängig voneinander laufen. Container sind von Natur aus zustandslos und speichern keine Sitzungsinformationen. Sie sind dennoch für Anwendungen, geeignet, die mit Zuständen arbeiten. Mehrere Instanzen eines Container-Images können gleichzeitig laufen, und neue Instanzen können andere ersetzen, ohne den Betrieb der Anwendung zu unterbrechen. Entwickler verwenden Container während der Entwicklung und beim Testen, und zunehmend setzen Administratoren Container in produktiven IT-Umgebungen ein, die auf Bare-Metal-Servern, auf virtuellen Maschinen (VMs) und in der Cloud laufen können.

Wie Container funktionieren

Container enthalten die Komponenten, die für das Ausführen der gewünschten Software erforderlich sind. Zu diesen Komponenten gehören Dateien, Umgebungsvariablen, Abhängigkeiten und Bibliotheken. Das Host-Betriebssystem schränkt den Zugriff des Containers auf physische Ressourcen wie CPU, Speicher und Arbeitsspeicher ein, so dass ein einzelner Container nie alle physischen Ressourcen eines Hosts nutzt.

Container-Image-Dateien sind vollständige, statische und ausführbare Versionen einer Anwendung oder eines Dienstes und unterscheiden sich von einer Technologie zur anderen. Docker-Images bestehen aus mehreren Schichten, die mit einem Basis-Image beginnen, das alle Abhängigkeiten enthält, die zum Ausführen von Code in einem Container erforderlich sind. Jedes Image hat eine les- und schreibbare Schicht, die auf statischen, unveränderlichen Schichten liegt. Da jeder Container seine eigene spezifische Containerschicht hat, die den jeweiligen Container anpasst, lassen sich die zugrunde liegenden Bildschichten speichern und in mehreren Containern wiederverwenden. OCI-Images (Open Container Initiative) bestehen aus einem Manifest, Dateisystemebenen und Konfigurationen. Für den Betrieb eines OCI-Images sind zwei Spezifikationen erforderlich: eine Laufzeit- und eine Image-Spezifikation. Die Laufzeitspezifikationen beschreiben die Funktionsweise eines Dateisystembündels, das heißt Dateien, die alle für die Leistung und die Laufzeiten erforderlichen Daten enthalten. Die Image-Spezifikation enthält die Informationen, die zum Starten einer Anwendung oder eines Dienstes im OCI-Container erforderlich sind.

Die Container-Engine führt die Images aus, und viele Unternehmen verwenden einen Container-Scheduler oder eine Orchestrierungstechnologie wie Kubernetes zur Verwaltung der Bereitstellungen. Container haben eine hohe Portabilität, da jedes Image die Abhängigkeiten enthält, die zum Ausführen des Codes in einem Container erforderlich sind. Beispielsweise ist es möglich, dass Containerbenutzer dasselbe Image während der Testphase auf einer Amazon-Web-Services-Cloud-Instanz (AWS) und anschließend für die Produktion auf einem Dell-Server vor Ort ausführen, ohne den Anwendungscode im Container zu ändern.

Vergleicih virtuelle Maschine und Container
Abbildung 1: Virtuelle Maschine bringen ihr eigenes Betriebssystem mit, während Container sich ein Host-Betriebssystem teilen.

Container versus VMs

Container unterscheiden sich von der Servervirtualisierung dadurch, dass eine virtualisierte Architektur ein Hardwaresystem emuliert. Jede VM führt ein Betriebssystem in einer unabhängigen Umgebung aus und bietet der Anwendung durch Abstraktion einen Ersatz für eine physische Maschine. Der Hypervisor emuliert Hardware aus gepoolten CPUs, Speicher-, Storage- und Netzwerkressourcen, welche sich die VM-Instanzen untereinander teilen.

VMs können einen beträchtlichen Ressourcen-Overhead erfordern, zum Beispiel Arbeitsspeicher, Festplatten und Netzwerk-Eingabe/Ausgabe (E/A), da jede virtuelle Maschine ein Betriebssystem ausführt. Das bedeutet, dass VMs meistens größer sind als Container und die Verwaltung länger dauert. Da Container den Betriebssystem-Kernel gemeinsam nutzen, führt eine Instanz eines Betriebssystems viele isolierte Container aus. Ein Betriebssystem, das Container unterstützt, ist häufig kleiner und mit weniger Funktionen ausgestattet als ein Betriebssystem für eine VM oder eine physische Anwendungsinstallation.

Anwendungscontainer und Systemcontainer

Anwendungscontainer, wie zum Beispiel Docker, kapseln die Dateien, Abhängigkeiten und Bibliotheken einer Anwendung für das Ausführen auf einem Betriebssystem. Mit Anwendungscontainern erstellen Benutzer einen separaten Container für mehrere unabhängige Anwendungen oder mehrere Dienste, die eine einzige Anwendung bilden. Sie eignen sich gut für Microservices, bei denen jeder Dienst, aus dem die Anwendung besteht, unabhängig von den anderen läuft.

Systemcontainer, wie zum Beispiel LXC, sind technologisch sowohl mit Anwendungscontainern als auch mit VMs vergleichbar. Ein Systemcontainer führt ein Betriebssystem aus, ähnlich wie ein Betriebssystem gekapselt auf einer VM laufen würde. Systemcontainer emulieren jedoch nicht die Hardware eines Systems. Stattdessen funktionieren sie ähnlich wie Anwendungscontainer, und ein Benutzer installiert mit ihnen verschiedene Bibliotheken, Sprachen und Systemdatenbanken.

Vorteile von Containern

Da Container denselben Betriebssystem-Kernel wie der Host nutzen, sind sie meist effizienter als VMs, die separate Betriebssystem-Instanzen benötigen.

Container haben eine bessere Portabilität als andere Anwendungshosting-Technologien: Sie laufen auf allen Systemen, die den gleichen Host-Betriebssystemtyp verwenden, ohne dass Codeänderungen erforderlich sind. Das Kapseln des Anwendungsbetriebscodes im Container bedeutet, dass keine Umgebungsvariablen des Gastbetriebssystems oder Bibliotheksabhängigkeiten zu verwalten sind.

Befürworter der Containerisierung verweisen auf eine effizientere Auslastung von Arbeitsspeicher, CPU und Speicher als Hauptvorteile dieses Ansatzes im Vergleich zur traditionellen Virtualisierung. Da Container nicht den großen Overhead benötigen, wie ihn virtuelle Maschinen haben – zum Beispiel separate Betriebssysteminstanzen, ist es möglich, viel mehr Container auf derselben Infrastruktur zu unterstützen. Ein durchschnittlicher physischer Host kann Dutzende von VMs oder Hunderte von Containern beherberen. Im tatsächlichen Betrieb sind die Größen von Host, Container und VM jedoch sehr variabel und hängen von den Anforderungen einer bestimmten Anwendung oder mehrerer Anwendungen ab.

Ein wichtiger Faktor für das Interesse an Containern ist, dass sie über den gesamten Lebenszyklus einer Anwendung hinweg konsistent sind. Dies begünstigt eine agile Umgebung und erleichtert neue Ansätze wie kontinuierliche Integration (CI) und kontinuierliche Bereitstellung (CD). Außerdem lassen sie sich schneller starten als VMs, was für verteilte Anwendungen wichtig ist.

Nachteile von Containern

Ein potenzieller Nachteil der Containerisierung ist die fehlende Isolierung vom Host-Betriebssystem. Da Container sich ein Host-Betriebssystem teilen, haben Sicherheitsbedrohungen im Vergleich zur Hypervisor-basierten Virtualisierung leichteren Zugang zum gesamten System. Ein Ansatz zur Lösung dieses Sicherheitsproblems ist es, Container innerhalb eines Betriebssystems zu erstellen, das auf einer VM läuft. Das stellt sicher, dass ein Angreifer im Falle eines Sicherheitsverstoßes auf Containerebene nur auf das Betriebssystem dieser VM und nicht auf andere VMs oder den physischen Host zugreifen kann.

Ein weiterer Nachteil der Containerisierung ist die mangelnde Flexibilität des Betriebssystems. Bei typischen Implementierungen muss jeder Container dasselbe Betriebssystem wie das Basisbetriebssystem verwenden, während Hypervisor-Instanzen mehr Flexibilität bieten. Ein Container, der auf einem Linux-basierten Host erstellt wurde, kann beispielsweise keine Instanz des Windows Server-Betriebssystems oder Anwendungen ausführen, die für Windows Server konzipiert sind.

Die Transparenz ist eine weitere Herausforderung beim Arbeiten mit Containern. Bei bis zu Hunderten oder mehr von ihnen, die gleichzeitig im Einsatz sind (und oft jeweils für nur wenige Sekunde und Minuten), ist es schwierig zu sehen, was in den einzelnen Containern vor sich geht.

Verschiedene Technologien von proprietären Anbietern und Open-Source-Projekten sind verfügbar und in der Entwicklung, um die betrieblichen Herausforderungen von Containern zu bewältigen, darunter Sicherheitsüberwachungssysteme, Überwachungssysteme auf der Grundlage von Protokolldaten sowie Orchestratoren und Planer, die den Betrieb überwachen.

Einsatzgebiete für Container

Container werden häufig mit Microservices und der Cloud in Verbindung gebracht, bieten aber auch Vorteile für monolithische Anwendungen und On-Premise-Rechenzentren.

Container eignen sich gut für die Arbeit mit Microservices, da jeder Service, aus dem die Anwendung besteht, in einem unabhängig skalierbaren Container verpackt ist. Eine Microservices-Anwendung kann beispielsweise aus containerisierten Diensten bestehen, die Warnmeldungen generieren, Daten protokollieren, die Benutzeridentifizierung handhaben und viele andere Dienste bereitstellen. Jeder Dienst läuft auf demselben Betriebssystem, bleibt aber individuell isoliert. Dienste lassen sich nach oben und unten skalieren, um auf die Nachfrage zu reagieren. Die Cloud-Infrastruktur ist für diese Art der elastischen, unbegrenzten Skalierung ausgelegt.

Traditionelle monolithische Anwendungsarchitekturen sind so konzipiert, dass der gesamte Code eines Programms in einer einzigen ausführbaren Datei geschrieben wird. Sie sind somit nicht so gut skalierbar wie verteilte Anwendungen. Doch es ist möglich, sie in Container umzuwandeln. Docker Modernize Traditional Applications (MTA) beispielsweise hilft Anwendern dabei, monolithische Anwendungen in Docker-Container zu überführen, mit Anpassungen für eine bessere Skalierung oder durch einen vollständigen Neuaufbau und eine Umstrukturierung.

Anbieter von Container-Tools und -Plattformen

Viele Anbieter haben Container-Plattformen und Container-Verwaltungstools in ihrem Portfolio, zum Beispiel Cloud-Dienste und Orchestratoren. Docker und Kubernetes sind bekannte Produktnamen im Bereich der Containertechnologie und bilden die Grundlage für viele andere Produkte.

Docker ist eine Open-Source-Plattform für Anwendungscontainer, die mit Linux und seit neuestem auch mit Windows, Apple und Mainframe-Betriebssystemen kompatibel ist. Docker nutzt Funktionen zur Ressourcenisolierung, wie cgroups und Linux-Kernel, um isolierte Container zu erstellen. Docker ist ein gleichnamiges Unternehmen, das gegründet wurde, um den zugehörigen Support sowie Container-Hosting- und Verwaltungsprodukte zu verkaufen. Im November 2019 verkaufte das Unternehmen das Docker Enterprise-Geschäft an Mirantis.

Microsoft bietet seinerseits Containerisierungstechnologien an, darunter Hyper-V- und Windows Server-Container. Beide Varianten nutzen die gleichen Images und werden auf die gleiche Weise verwaltet. Sie unterscheiden sich jedoch in Bezug auf den Grad der Isolierung. Die Isolierung in Windows Server-Containern wird durch Namespaces, Ressourcensteuerung und andere Techniken erreicht. Hyper-V-Container bieten Isolierung durch die Containerinstanzen, die in einer leichtgewichtigen VM laufen, was das Produkt eher zu einem Systemcontainer macht.

Der Open-Source-Container-Orchestrator Kubernetes, der von Google entwickelt wurde, hat sich zum De-facto-Standard für die Container-Orchestrierung entwickelt. Er organisiert Container in Pods auf Nodes, auf denen sich die Hosting-Ressourcen befinden. Kubernetes kann Anwendungscontainer automatisieren, bereitstellen, skalieren, warten und anderweitig unterstützen. Eine Vielzahl von Containerprodukten basiert auf Kubernetes, darunter Rancher, Red Hat OpenShift und Platform9.

Neben Kubernetes sind auch andere Container-Orchestrierungstools verfügbar, wie DC/OS von D2iQ (früher Mesosphere) und Docker Swarm. Mirantis, das sich ursprünglich auf Kubernetes konzentrieren wollte, plant nun, die Unternehmensversion von Swarm zu unterstützen und zu verbessern, parallel zur reinen Open-Source-Variante.

Die großen Cloud-Provider bieten ebenfalls verschiedene Container-as-a-Service-Produkte (CaaS) an, darunter Amazon Elastic Container Service (ECS) und Elastic Kubernetes Service (EKS), AWS Fargate, Google Kubernetes Engine (GKE), Microsoft Azure Container Instances (ACI), Azure Kubernetes Service (AKS) und IBM Cloud Kubernetes Service, neben vielen anderen. Container lassen sich jedoch ebenso ohne dass spezielle Container-Produkte des Cloud-Anbieters auf Public- oder Private-Cloud-Infrastrukturen einsetzen.

Die Zukunft von Containern

Unternehmen haben den Einsatz von Containersoftware in der Produktion nach und nach ausgeweitet und das über die Anwendungsentwicklung und -prüfung hinaus. Für die meisten Betriebe hat sich der Schwerpunkt auf die Containerorchestrierung verlagert, insbesondere auf Kubernetes, das inzwischen von den meisten Anbietern unterstützt wird. Da IT-Abteilungen ihre Prozesse und Tools für den IT-Betrieb konsolidieren, wünschen sie sich eine detailliertere Kontrolle, mit der sie die Inhalte von Containern überwachen und sichern.

Containersoftware breitet sich in verschiedenen Bereichen der IT aus, von der Sicherheit über das Netzwerk bis hin zum Speicher. Einige Unternehmen planen, wie sie zustandsabhängige Anwendungen wie Datenbanken und maschinelles Lernen auf Containern und Kubernetes bereitstellen können. Early Adopter von Containern und Container-Orchestrierung haben begonnen, über die Containerfunktionen und -orchestrierung hinaus zu schauen und zu planen, was die Containerinfrastruktur ihnen als Teil einer breiteren Agile- oder DevOps-Transformation ermöglicht. Beispiele hierfür sind Self-Service-Schnittstellen für Entwickler, integrierte CI/CD, GitOps, Service Mesh, Multi-Cloud-Management und mandantenfähige Sicherheit, Serverless und Event-Driven Computing. Ein potenzieller Trend ist, die Verwendung von Containern und Kubernetes bis zum Netzwerkrand zu verbreiten, um Software an verschiedenen Standorten und auf einer Vielzahl von Geräten ferngesteuert bereitzustellen und zu verwalten. Diese Entwicklung steckt jedoch noch in den Kinderschuhen.

Diese Definition wurde zuletzt im August 2022 aktualisiert

Erfahren Sie mehr über Containervirtualisierung

ComputerWeekly.de
Close