Definition

Containerbasierte Virtualisierung (Containerisierung)

Was ist containerbasierte Virtualisierung (Containerisierung)?

Container sind eine Art von Software, die Anwendungen für die Bereitstellung virtuell verpacken und isolieren kann. Container verpacken den Code und die Abhängigkeiten einer Anwendung und sorgen dafür, dass die Anwendung in allen Computerumgebungen zuverlässig ausgeführt werden kann.

Container haben gemeinsamen Zugriff auf den Kern des Betriebssystems (OS), ohne dass virtuelle Maschinen (VMs) erforderlich sind. In Containern können kleine Microservices, größere Anwendungen oder sogar leichtgewichtige Container-Betriebssysteme ausgeführt werden.

Die Container-Technologie hat ihre Wurzeln in der Partitionierung, die bis in die 1960er Jahre zurückreicht, und in der Isolierung von Chroot-Prozessen (Change Root), die als Teil von Unix in den 1970er Jahren entwickelt wurde. Ihre moderne Form findet ihren Ausdruck in der Anwendungs-Containerisierung, zum Beispiel Docker, und der System-Containerisierung, zum Beispiel LXC, als Teil des Linux Containers Project. Beide Container-Arten 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 ermöglicht.

Entwickler verwenden Container für Entwicklungs- und Testumgebungen. IT-Betriebsteams können IT-Produktionsumgebungen auf Containern bereitstellen, die auf Bare-Metal-Servern, VMs und in der Cloud ausgeführt werden können.

Wie Container funktionieren

Container enthalten die Komponenten, die für die Ausführung der gewünschten Software erforderlich sind. Zu diesen Komponenten gehören Dateien, Umgebungsvariablen, Abhängigkeiten und Bibliotheken. Das Betriebssystem des Hosts begrenzt den Zugriff des Containers auf physische Ressourcen wie CPU, Storage und Memory, so dass ein einzelner Container nicht alle physischen Ressourcen des Hosts beanspruchen kann.

Container-Image-Dateien sind vollständige, statische und ausführbare Versionen einer Anwendung oder eines Dienstes, die sich von einer Technologie zur anderen unterscheiden. Docker-Images zum Beispiel bestehen aus mehreren Schichten. Die erste Schicht, das Basis-Image, enthält alle Abhängigkeiten, die zur Ausführung von Code in einem Container erforderlich sind. Jedes Image hat eine lesbare/schreibbare Schicht, die auf statischen, unveränderlichen Schichten liegt. Da jeder Container seine eigene spezifische Containerschicht hat, die den jeweiligen Container anpasst, können die zugrunde liegenden Image-Ebenen gespeichert und in mehreren Containern wiederverwendet werden. Ebenso können mehrere Instanzen eines Images gleichzeitig in einem Container ausgeführt werden, und neue Instanzen ersetzen ausgefallene Instanzen, ohne dass der Betrieb der Anwendung unterbrochen wird.

Ein Open Container Initiative (OCI)-Image besteht aus einem Manifest, Dateisystemschichten 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 mit OCI-Container erforderlich sind.

Die Container-Engine führt Images aus, und viele Unternehmen verwenden einen Container-Scheduler und eine Orchestrierungstechnologie wie Kubernetes, um Bereitstellungen zu verwalten. Container haben eine hohe Portabilität, da jedes Image die für die Ausführung des Codes erforderlichen Abhängigkeiten enthält. Beispielsweise können Container-Benutzer dasselbe Image während eines Tests auf einer AWS-Cloud-Instanz und anschließend für die Produktion auf einem Dell-Server vor Ort ausführen, ohne den Anwendungscode im Container zu ändern.

VMs versus Container
Abbildung 1: Im Gegensatz zu VMs haben Container kein eigenes Betriebssystem, sondern teilen sich ein Host-Betriebssystem.

Container und VMs im Vergleich

Virtualisierung ist die Erstellung einer virtuellen Version einer Entität, zum Beispiel eines Betriebssystems oder Servers. Bei der Virtualisierung wird die Hardwarefunktionalität simuliert, um ein virtuelles System zu erstellen, das von einem Hostsystem abstrahiert. Mit diesem Verfahren können zum Beispiel mehrere Betriebssysteme, mehr als ein virtuelles System und verschiedene Anwendungen auf einem einzigen Server betrieben werden.

Obwohl sie einige grundlegende Ähnlichkeiten aufweisen, unterscheiden sich Container und Virtualisierung dadurch, dass eine virtualisierte Architektur ein Hardwaresystem emuliert. Bei der Virtualisierung wird eine Softwareschicht, ein so genannter Hypervisor, verwendet, um Hardware aus gepoolten CPUs, Memory, Storage und Netzwerkressourcen zu emulieren, die von mehreren Instanzen von VMs mehrfach genutzt werden können.

VMs können einen beträchtlichen Ressourcen-Overhead erfordern, wie zum Beispiel Memory, Festplatten und Netzwerk-Input/Output, da jede VM ein Gastbetriebssystem ausführt. Das bedeutet, dass VMs groß sein können und ihre Erstellung länger dauert als bei Containern.

Da Container den Betriebssystem-Kernel gemeinsam nutzen, kann eine Instanz eines Betriebssystems viele isolierte Container ausführen. Das Betriebssystem, das Container unterstützt, kann auch kleiner sein und weniger Funktionen aufweisen als ein Betriebssystem für eine VM.

Im Gegensatz zur Virtualisierung der zugrunde liegenden Hardware wird bei Containern das Betriebssystem virtualisiert, so dass jeder einzelne Container nur die Anwendung, ihre Bibliotheken und Abhängigkeiten enthält. Container sind im Vergleich zu VMs leichtgewichtig, da Container kein Gastbetriebssystem erfordern.

Anwendungscontainer und Systemcontainer

Anwendungscontainer, wie zum Beispiel Docker, kapseln die Dateien, Abhängigkeiten und Bibliotheken einer Anwendung für die Ausführung auf einem Betriebssystem. Mit Anwendungscontainern kann der Benutzer einen separaten Container für mehrere unabhängige Anwendungen oder mehrere Dienste, die eine einzige Anwendung bilden, erstellen und ausführen. Ein Anwendungscontainer eignet sich beispielsweise gut für eine Microservices-Anwendung, bei der 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. In einem Systemcontainer kann ein Betriebssystem ausgeführt werden, so 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 kann verschiedene Bibliotheken, Sprachen und Systemdatenbank installieren.

Vorteile von Containern

Container bieten die folgenden Vorteile:

  • Effizienz: Da Container denselben Betriebssystemkern wie der Host nutzen, sind sie effizienter als VMs, die separate Betriebssysteminstanzen benötigen.
  • Portabilität: Container haben eine bessere Portabilität als andere Anwendungs-Hosting-Technologien. Sie können auf allen Systemen eingesetzt werden, die den gleichen Host-Betriebssystemtyp verwenden, ohne dass Codeänderungen erforderlich sind. Die Kapselung des Anwendungsbetriebscodes im Container bedeutet, dass keine Umgebungsvariablen des Gastbetriebssystems oder Bibliotheksabhängigkeiten zu verwalten sind.
  • Verbesserungen bei Memory, CPU und Storage: Befürworter der Containerisierung verweisen auf Effizienzgewinne bei Memory, CPU und Storage als Hauptvorteile dieses Ansatzes im Vergleich zur herkömmlichen Virtualisierung. Da Container nicht den Overhead haben, der bei VMs erforderlich ist, wie zum Beispiel separate Betriebssysteminstanzen, ist es möglich, viel mehr Container auf derselben Infrastruktur zu unterstützen. Ein durchschnittlicher physischer Host könnte Dutzende von VMs oder Hunderte von Containern unterstützen. In der Praxis sind die Größen von Host, Containern und VMs jedoch sehr unterschiedlich und hängen von den Anforderungen einer bestimmten Anwendung oder mehrerer Anwendungen ab.
  • Konsistenz: Container sind während des gesamten Lebenszyklus einer Anwendung konsistent. Das fördert eine agile Umgebung und erleichtert neue Ansätze wie die kontinuierliche Integration und die kontinuierliche Bereitstellung (CI/CD). Außerdem lassen sie schneller starten als VMs, was für verteilte Anwendungen wichtig ist.

Nachteile von Containern

Container haben die folgenden Nachteile:

  • fehlende Isolierung: 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, um dieses Sicherheitsproblem zu lösen, besteht darin, Container innerhalb eines Betriebssystems zu erstellen, das auf einer VM läuft. Dieser Ansatz stellt sicher, dass ein Angreifer im Falle eines Sicherheitsvorstoßes auf Containerebene nur auf das Betriebssystem dieser VM und nicht auf andere VMs oder den physischen Host zugreifen kann.
  • 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 die Nutzung auf Windows Server konzipiert sind.
  • schwierige Überwachung der Sichtbarkeit: Bei bis zu Hunderten oder mehr Containern, die auf einem Server laufen, kann es schwierig sein zu sehen, was in den einzelnen Containern passiert.

Verschiedene Technologien von Container- und anderen Anbietern sowie Open-Source-Projekte sind verfügbar oder befinden sich in der Entwicklung, um die betrieblichen Herausforderungen von Containern zu bewältigen. Dazu gehören Sicherheitsüberwachungssysteme, Überwachungssysteme, die auf Protokolldaten basieren, sowie Orchestratoren und Planer, die den Betrieb überwachen.

Häufige Verwendung von Containern

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

Container sind gut für die Arbeit mit Microservices geeignet. Jeder Dienst, aus dem die Anwendung besteht, ist in einem unabhängig skalierbaren Container verpackt. Eine Microservices-Anwendung kann beispielsweise aus containerisierten Diensten bestehen, die Warnungen generieren, Daten protokollieren, die Benutzeridentifizierung handhaben und viele andere Dienste bereitstellen.

Jeder Dienst läuft auf demselben Betriebssystem, bleibt aber individuell isoliert, und kann nach oben und unten skaliert werden, um auf die Nachfrage zu reagieren. Die Cloud-Infrastruktur ist für eine elastische, unbegrenzte Skalierung ausgelegt.

Traditionelle monolithische Anwendungsarchitekturen sind so konzipiert, dass der gesamte Code eines Programms in einer einzigen ausführbaren Datei geschrieben wird. Monolithische Anwendungen lassen sich nicht so leicht skalieren wie verteilte Anwendungen, aber sie können in Container umgewandelt werden. Das Programm Docker Modernize Traditional Applications beispielsweise hilft Anwendern bei der Umstellung monolithischer Anwendungen auf Docker-Container, entweder in unveränderter Form, mit Anpassungen für eine bessere Skalierung oder durch einen vollständigen Neuaufbau und eine Umstrukturierung.

Container werden auch verwendet, um Anwendungen in verschiedenen Umgebungen auszuführen. Da der gesamte Code und die Abhängigkeiten einer Anwendung im Container enthalten sind, können Entwickler die Anwendung verschieben, ohne sie für die neue Umgebung neu entwerfen zu müssen. Falls doch Änderungen erforderlich sind, müssen containerisierte Anwendungen möglicherweise nur ein Code-Refactoring durchlaufen, bei dem nur kleine Segmente des Codes umstrukturiert werden müssen.

Anbieter von Container-Tools und -Plattformen

Zahlreiche Hersteller bieten Container-Plattformen und -Verwaltungs-Tools an, zum Beispiel Cloud-Dienste und Orchestratoren. Docker und Kubernetes sind bekannte Produktnamen im Bereich der Containertechnologie, und die Technologien bilden die Grundlage für viele andere Produkte.

  • Docker ist eine Open-Source-Plattform für Anwendungscontainer, die für Linux und in letzter Zeit auch für Windows, Apple und Mainframe-Betriebssysteme entwickelt wurde. Docker nutzt Funktionen zur Ressourcenisolierung, wie zum Beispiel cgroups und Linux-Kernel, um isolierte Container zu erstellen. Docker ist ein gleichnamiges Unternehmen, das gegründet wurde, um unternehmensunterstützte Container-Hosting- und Verwaltungsprodukte zu verkaufen. Im November 2019 verkaufte das Unternehmen den Geschäftsbereich Docker Enterprise an Mirantis.
  • 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, die die Hosting-Ressourcen darstellen. Kubernetes kann Anwendungscontainer automatisieren, bereitstellen, skalieren, warten und anderweitig betreiben. Eine Vielzahl von Produkten basiert auf Kubernetes mit zusätzlichen Funktionen und oder Unterstützung, wie Rancher, das im Dezember 2020 von SUSE übernommen wurde, Red Hat OpenShift und Platform9.
  • Microsoft bietet Containerisierungstechnologien an, darunter Hyper-V und Windows Server Container. Beide Arten werden auf ähnliche Weise erstellt, gewartet und betrieben, da sie die gleichen Container-Images verwenden. Die Dienste 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 Container-Instanzen, die innerhalb einer leichtgewichtigen VM laufen, was das Produkt eher zu einem Systemcontainer macht.
  • Amazon Elastic Container Service (ECS) ist ein Cloud-Computing-Service in AWS, der Container verwaltet und es Entwicklern ermöglicht, Anwendungen in der Cloud auszuführen, ohne eine Umgebung für die Ausführung des Codes konfigurieren zu müssen. Amazon ECS startet Container über AWS Fargate oder Amazon Elastic Compute Cloud. Zu seinen Funktionen gehören Planung, Docker-Integration, Containerbereitstellungen, automatische Containerwiederherstellung und Containersicherheit.

Daneben sind auch andere Container-Orchestrierungs-Tools verfügbar, wie DC/OS von D2iQ – ehemals Mesosphere – und LXC.

Die großen Cloud-Anbieter bieten ebenfalls verschiedene Container-as-a-Service-Produkte an, darunter das bereits erwähnte Amazon ECS und Amazon Elastic Kubernetes Service, Google Kubernetes Engine, Microsoft Azure Container Instances, Azure Kubernetes Service und IBM Cloud Kubernetes Service. Container können auch auf öffentlichen oder privaten Cloud-Infrastrukturen eingesetzt werden, ohne dass spezielle Containerprodukte des Cloud-Anbieters erforderlich sind.

Die Zukunft von Containern

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

Die Einführung von Containersoftware hat sich auf verschiedene Bereiche der IT ausgeweitet – von der Sicherheit über das Netzwerk bis hin zum Storage. Einige Unternehmen haben zustandsbehaftete (stateful) Anwendungen wie Datenbanken und Anwendungen für maschinelles Lernen (ML) in Containern und Kubernetes implementiert, um eine einheitliche Verwaltung zu gewährleisten. Beispielsweise verlangsamt containerisiertes ML eine Maschine nicht so sehr im Vergleich zu containerlosem ML, und es verbraucht im Laufe der Zeit nicht so viele Ressourcen.

Einige Unternehmen nutzen Container als Teil einer umfassenderen Agile- oder DevOps-Transformation. Ein Beispiel ist die Containerisierung von Microservices in einer CI/CD-Umgebung. Ein weiterer möglicher Einsatzbereich ist die Verbreitung von Containern und Kubernetes bis zum Netzwerkrand (Network Edge), um Software an verschiedenen Standorten und auf einer Vielzahl von Geräten ferngesteuert bereitzustellen und zu verwalten.

Es ist unwahrscheinlich, dass Container die Servervirtualisierung ersetzen werden, da sich beide Technologien gegenseitig ergänzen. Da Container in leichtgewichtigen Umgebungen ausgeführt werden und VMs mehr Ressourcen beanspruchen, erleichtert die Hardwarevirtualisierung die Verwaltung der für Container erforderlichen Infrastruktur.

Neben den oben erwähnten Übernahmen haben auch andere große Anbieter kleinere Startups übernommen, um ihre Toolchain-Angebote zu erweitern. So hat Cisco im Oktober 2020 Portshift – jetzt Panoptica – übernommen und Red Hat hat im Januar 2021 StackRox erworben.

Gartner prognostizierte, dass bis 2024 15 Prozent aller Unternehmensanwendungen in einer Container-Umgebung laufen werden. Das ist ein Anstieg von mehr als 10 Prozent seit 2020.

Diese Definition wurde zuletzt im Juni 2024 aktualisiert

Erfahren Sie mehr über Containervirtualisierung

ComputerWeekly.de
Close