Containerisierung ist eine Technologie, die es Software-Entwicklern ermöglicht, Software und Anwendungen als Code zu paketieren und in isolierten Computing-Umgebungen als unveränderliche ausführbare Images laufen zu lassen. Die containerisierten Anwendungs-Images enthalten alle Dateien, Konfigurationen, Bibliotheken und Binärdateien, die zur Ausführung der Anwendung nötig sind. Dadurch sind Container bei ihrer Ausführung nur noch vom Betriebssystemkern des Hosts abhängig. Ermöglicht wird dies durch Containerisierungsmodule wie Docker Engine, die als Schnittstelle zwischen der Anwendungslaufzeit und dem Kernel fungieren.

Dieser Artikel bietet einen Überblick über die Rolle der Anwendungs-Containerisierung bei modernen Softwarebereitstellungen und erläutert unter anderem, wie sich Containerisierung von Virtualisierung auf Betriebssystemebene unterscheidet, welche Vorteile Containerisierung bietet und wie eine Anwendung containerisiert wird.

Weitere Informationen

Lesen Sie diesen Beitrag, um die Komponenten einer starken Container-Sicherheitsstrategie kennenzulernen, um die Sicherheit Ihres Unternehmens zu gewährleisten.

Was ist Container-Sicherheit?

Containerisierung und Virtualisierung (VMs) im Vergleich

Virtuelle Maschinen (VMs) sind eine weitere Methode zur Systemisolierung. Es gibt jedoch große Unterschiede zwischen virtuellen Maschinen und Anwendungs-Containern. Virtuelle Maschinen benötigen sehr viel mehr Ressourcen als Anwendungs-Container. Da sie zudem auf die Emulation kompletter Systeme und nicht nur einzelner Anwendungen ausgelegt sind, können sie Workloads mit höheren Ressourcenanforderungen bewältigen.

VMs emulieren oder virtualisieren ein gesamtes Computersystem (einschließlich des Betriebssystemkerns) und ermöglichen einer einzelnen Host-Maschine die Ausführung einer oder mehrerer virtueller Gastmaschinen. Die virtuellen Gastmaschinen werden vom sogenannten Hypervisor verwaltet, der auf der Host-Maschine läuft und das Dateisystem sowie die Hardware-Ressourcen der Host-Maschine für die virtuellen Gastmaschinen koordiniert.

Welchen Vorteil bietet die Ausführung einer oder mehrerer virtueller Maschinen auf einer Host-Maschine? Die Möglichkeit, eine Vielzahl verschiedener Workloads und Anwendungsszenarien auf einer einzelnen Host-Maschine mittels virtueller Gastmaschinen zu hosten, verleiht Unternehmen und Cloud-Anbietern sehr viel mehr Flexibilität in Bezug auf die Ressourcennutzung.

Beispiel: Eine große und leistungsstarke physische Maschine muss im aktuellen Jahr eine bestimmte Auswahl an virtuellen Maschinen bewältigen. Doch wenn sich die Geschäftsanforderungen ändern oder die Architekturen weiterentwickeln, profitieren Cloud-Anbieter und Benutzer mit eigenen Rechenzentren enorm davon, dass sie diese Infrastrukturressourcen hoch- oder herunterskalieren können, ohne dafür neue Hardware kaufen zu müssen.

Die Vorteile der Containerisierung von Anwendungen

Die Entwicklung von Software in containerisierten Umgebungen bietet mehrere Vorteile gegenüber dem konventionellen Ansatz, bei dem Anwendungs-Code verpackt und direkt auf dem Host-System ausgeführt wird. Ebenso wie virtuelle Maschinen Cloud-Anbietern und Rechenzentren mehr Flexibilität und elastische Skalierungsoptionen geben, bietet auch die Containerisierung, die zur Paketierung und Ausführung von Software-Anwendungen genutzt wird, ähnliche und noch weitere Vorteile.

Portabilität

Da eine containerisierte Anwendung nur minimale Abhängigkeiten außerhalb des Containers hat, kann sie in vielen verschiedenen Umgebungen zuverlässig ausgeführt werden. Ein Beispiel, bei dem dies von Vorteil ist, ist das Sidecar-Modell in einer Mikroservices-Architektur. Hierbei läuft eine allgemeine Funktion (z. B. Dienstregistrierung oder Erfassung von Metriken) als Prozess neben einer Reihe verschiedener Dienste. Durch die Containerisierung können die Abhängigkeiten des Sidecar-Prozesses leichter eingekapselt werden, sodass die Abhängigkeiten nicht bereits auf dem Host installiert sein müssen. Einheitliche Entwicklungs-, Bereitstellungs- und Produktionsumgebungen stellen einen weiteren Vorzug der Portabilität containerisierter Anwendungen dar.

Containerisierung ist deklarativ

Die deklarative Definition von Anwendungsabhängigkeiten als Code gibt der Anwendung mehr Kontrolle über ihre Laufzeitumgebung. Anwendungen, die auf vorinstallierte Pakete angewiesen sind, haben mitunter mit Kompatibilitätsproblemen, unerwarteten Laufzeitfehlern und anderen Problemen zu kämpfen – besonders, wenn die Anwendung in verschiedenen Umgebungen laufen muss oder die Host-Umgebung anderweitig instabil ist.

Entwicklungsgeschwindigkeit und Portabilität

Wenn Anwendungen in isolierten Containern ausgeführt werden, die alle nötigen Abhängigkeiten enthalten, fällt für Entwickler eine Reihe an Problemen weg, da die Anwendungen nun überall laufen können. Software, die auf diese Weise paketiert wird, ist nicht mehr an das Betriebssystem gebunden. Dies vereinfacht die Abhängigkeitsverwaltung. Auch der Entwicklungslebenszyklus profitiert von einer einheitlichen, containerisierten Laufzeit in verschiedenen Umgebungen, da die Software in Entwicklungs-, Bereitstellungs- und Produktionsumgebungen zuverlässig ausgeführt werden kann.

Fehlerisolierung und Sicherheitskontrollen

Da containerisierte Anwendungen auf der Prozessebene isoliert sind, haben schwerwiegende Abstürze in einem Container keinen Einfluss auf andere laufende Container. Zudem lassen sich die Container in die Sicherheitsrichtlinien des Hosts integrieren. Darüber hinaus sind die virtualisierten Ressourcen von denen des Hosts isoliert, sodass schädlicher Code nicht auf das Host-System übergreifen kann.

Containerspezifische Konfigurationen können außerdem mit Sicherheitskontrollen versehen werden, um den Zugriff auf Ressourcen zu beschränken und zusätzliche Sicherheitsrichtlinien durchzusetzen. Dennoch bieten Container allein keinen ganzheitlichen Schutz vor Sicherheitsbedrohungen und die Möglichkeit, mehrere Container-Images in einem einzelnen Container aufzusetzen, erhöht die Sicherheitsrisiken, wenn dabei Images von Drittanbietern verwendet werden.

Effizienz der Ressourcen- und Servernutzung

Anwendungs-Container sind schlanker als virtuelle Maschinen, da sie den Betriebssystemkern des Hosts nutzen und in den daraus entstehenden Images nur das paketiert ist, was die Anwendung benötigt. Dies verbraucht weniger Ressourcen und ermöglicht die Ausführung mehrerer Container in einer Computing-Umgebung, sodass die Ressourcen effizienter genutzt werden.

Wenn es um Computing geht – ob mit einer virtuellen Maschine, einem physischen Rechner oder anderswo –, werden viele verschiedene Anwendungs-Container aufgrund ihrer Portabilität und Isolierung parallel und flexibel ausgeführt. Virtuelle Maschinen und Container schließen sich nicht gegenseitig aus und werden häufig sogar gemeinsam genutzt. Zum Beispiel lassen cloudnative Software-Unternehmen ihre containerisierten Anwendungen häufig auf den virtuellen Maschinen des Cloud-Anbieters laufen.

Plattformen wie Kubernetes können die Servereffizienz bei der Nutzung von Anwendungs-Containern weiter steigern, da sie Anwendungen von der zugrundeliegenden Infrastruktur abkoppeln und die Zuweisung von Containern auf mehrere Server-Cluster föderieren. Dies ermöglicht eine noch flexiblere Ressourcenoptimierung als auf Virtualisierungsebene und vereinfacht die Infrastrukturverwaltung für Software-Entwickler.

Containerisierung einer Anwendung

Nachfolgend finden Sie eine allgemeine und vereinfachte Darstellung der Containerisierung einer Software-Anwendung, die einen Überblick darüber geben soll, wie ein Containerisierungsprozess aussehen könnte.

Der Entwicklungslebenszyklus einer containerisierten Anwendung besteht im Prinzip aus drei Phasen.

Entwickeln

Wenn die Anwendung entwickelt und der Quellcode committet wird, werden die Abhängigkeiten einer Anwendung in einer Container-Image-Datei (z. B. einem Dockerfile) definiert. Die herkömmliche Verwaltung von Quellcode harmoniert sehr gut mit dem Containerisierungsmodell, da meist die gesamte Container-Konfiguration zusammen mit dem Quellcode der Anwendung als Code gespeichert ist. In einigen Fällen (z. B. bei der Nutzung der Docker Engine) lässt sich eine bestehende Anwendung ganz einfach containerisieren, indem ein Dockerfile und die dazugehörigen Abhängigkeiten konfiguriert und dem Quellcode hinzugefügt werden.

Aufbauen

Bei diesem Schritt wird das Image entwickelt und in einem Container-Repository veröffentlicht, wo es unveränderlich, versioniert und gekennzeichnet ist. Sobald eine Anwendung eine Image-Definitionsdatei (z. B. ein Dockerfile) enthält und so konfiguriert ist, dass die benötigten Abhängigkeiten installiert und in ein Image gezogen werden, kann das Image erstellt und abgespeichert werden. Dies kann entweder lokal oder in einem Remote-Repository erfolgen, von wo aus es referenziert und heruntergeladen werden kann.

Bereitstellen

Im letzten Schritt wird die containerisierte Anwendung lokal, in CI/CD-Pipelines oder in Test-, Bereitstellungs- bzw. Produktionsumgebungen bereitgestellt und ausgeführt. Sobald ein veröffentlichtes Image in einer Umgebung zugänglich ist, wird es als ausführbare Datei dargestellt. Wir nehmen als Beispiel wieder die Docker Engine: In der Zielumgebung, in welcher der Container laufen soll, muss Docker Daemon installiert sein. Dies ist ein lange laufender Dienst, der die Erstellung und Ausführung containerisierter Prozesse verwaltet. Über die Docker-Befehlszeilenoberfläche kann die containerisierte Anwendung manuell oder programmgesteuert ausgeführt werden.

Unternehmen stehen viele verschiedene Containerisierungstechnologien und Container-Orchestrierungsmethoden bzw. -plattformen zur Auswahl. Die gewünschte Technologie sollte daher im Vorfeld gründlich geprüft werden. Darüber hinaus arbeitet die Open Container Initiative, die zum Teil vom Docker-Team gegründet wurde, an der Definition von Branchenstandards und Spezifikationen für Container-Laufzeiten und -Images.

Weitere Informationen

Die Container-Sicherheit beginnt mit dem Container-Image. Entwickler erstellen ihre Images manchmal anhand der Basis-Images aus einer externen Registrierung. Diese Bilder können leider Malware oder anfällige Bibliotheken enthalten. Entsprechend ist es für Unternehmen von entscheidender Bedeutung, die Bewertung von Images in ihrer Cloud-Sicherheitsstrategie zu priorisieren. 

Ausnutzung falsch konfigurierter Image-Containe

Containerisierung und Mikroservices-Architektur

Die Nutzung monolithischer Services hat viele Vorteile: einheitliche Tools, geringere Latenzen für zahlreiche Abläufe sowie vereinfachte Beobachtbarkeit und Bereitstellungen. Dennoch werden viele komplexe Anwendungen in kleinere Teile oder Services aufgegliedert, um in einer sogenannten Mikroservices-Architektur miteinander zu interagieren. Der Aufbau von Mikroservices-Architekturen und das Zerlegen monolithischer Anwendungen in Mikroservices ist ein komplexes Thema für sich und würde den Rahmen dieses Artikels sprengen. Doch es lässt sich leicht erkennen, warum die Containerisierung von Anwendungen großen Nutzen und viele Vorteile für die Bereitstellung und Ausführung von Mikroservices bietet.

Ein einfaches Beispiel: Stellen Sie sich eine monolithische Anwendung vor, die Webanfragen bedient, diese Anfragen mit Geschäftslogik verarbeitet und zudem mit der Datenbankschicht verbunden ist. Da die Komplexität im Laufe der Zeit mit jeder Schicht zunimmt, trifft das Unternehmen die strategische Entscheidung, die Anwendung in drei einzelne Services aufzuspalten: einen Web-Service, einen Kern-API-Service für Logik und einen Datenbank-Service.

Anstatt nun die ressourcenintensiven Prozesse in VMs laufen zu lassen, entscheidet sich das Unternehmen dazu, die separaten Anwendungen mit einem sehr spezifischen Aufgabenbereich zu containerisieren. Es hat sogar die Wahl, entweder jeden spezialisierten Service in einem eigenen elastischen Cluster virtueller Maschinen zu verwalten und die Anzahl der Container in jeder VM zu skalieren, oder aber eine Plattform wie Kubernetes zu nutzen, um die Verwaltung der Infrastruktur zu abstrahieren.

Ist Containerisierung das Richtige für Sie?

Die Entwicklerfreundlichkeit moderner Containerisierungstechnologien wie Docker machen sie zu einer attraktiven Technologie für die Einbindung in ein Proof of Concept. Wenn Sie die Möglichkeit haben, Containerisierung schrittweise in Ihren Software-Entwicklungszyklus zu integrieren (z. B. durch die Containerisierung eines einzelnen Services oder Sidecar-Services), können Sie auf diese Weise erste Erfahrungen im Umgang mit der Technologie sammeln und sich dann entscheiden.

Wie einfach die Entscheidung ist, hängt auch davon ab, wie groß Ihr Unternehmen momentan ist. Die Einführung neuer Technologien – so entwicklerfreundlich sie auch sein mögen – erfordert ein Verständnis der dazugehörigen Vor- und Nachteile, besonders wenn es um Beobachtbarkeit und Sicherheit geht.

Gleichwohl gibt es eine große und wachsende Community zur Unterstützung von Entwicklern sowie erste Anzeichen dafür, dass Containerisierung sich mehr und mehr zu einem Branchenstandard entwickelt. Besonders wenn Ihre Software noch in einer frühen Phase steckt oder Sie auf der grünen Wiese gegründet haben, könnte Containerisierung die richtige Wahl für Sie sein und es Ihnen ermöglichen, von den Vorteilen der modernsten Technologien zur Entwicklung und Bereitstellung von Software zu profitieren.