Container

Was ist Docker?

Der Begriff „Docker" kann sich auf verschiedene Dinge beziehen. Das können sein: ein Open Source Community-Projekt; Tools des Open Source-Projekts; Docker Inc., das Unternehmen, das dieses Projekt hauptsächlich unterstützt; und die Tools, die von Docker offiziell unterstützt werden. Die Tatsache, dass die Technologien und die Firma den gleichen Namen haben, kann verwirrend sein.

Hier ist eine kurze Erklärung:

  • Die IT-Software „Docker“ ist eine Containerisierungstechnologie, die die Erstellung und den Betrieb von Linux®-Containern ermöglicht.
  • Die Open Source Docker-Community arbeitet an der Verbesserung dieser Technologien zum Nutzen aller Anwender – und das umsonst.
  • Das Unternehmen Docker Inc. verbessert die Arbeiten der Docker-Community, macht diese sicherer und teilt diese Verbesserungen mit der gesamten Community. Sie unterstützt dann die verbesserten und zuverlässigeren Technologien für Unternehmenskunden.

Mit Docker können Sie Container wie extrem leichtgewichtige, modulare virtuelle Maschinen behandeln. Und mit diesen Containern erhalten Sie Flexibilität – Sie können sie erstellen, einsetzen, kopieren und zwischen Umgebungen bewegen, was wiederum die Optimierung Ihrer Apps für die Cloud unterstützt.


Wie funktioniert Docker?

Die Docker-Technologie verwendet den Linux Kernel und seine Funktionen wie Cgroups und namespaces, um Prozesse zu isolieren, damit diese unabhängig voneinander ausgeführt werden können. Diese Unabhängigkeit ist der Zweck der Container – die Fähigkeit, mehrere Prozesse und Apps getrennt voneinander betreiben zu können. So wird Ihre Infrastruktur besser genutzt und gleichzeitig die Sicherheit bewahrt, die sich aus der Arbeit mit getrennten Systemen ergibt.

Containertools, einschließlich Docker, arbeiten mit einem Image-basierten Bereitstellungsmodell. Das macht es einfacher, eine Anwendung oder ein Paket von Services mit all deren Abhängigkeiten in mehreren Umgebungen gemeinsam zu nutzen. Docker automatisiert außerdem die Bereitstellung der Anwendung (oder Kombinationen von Prozessen, die eine Anwendung darstellen) innerhalb dieser Container-Umgebung.

Diese Tools bauen auf Linux-Containern auf – was Docker benutzerfreundlich und einzigartig macht – und geben den Nutzern so nie dagewesenen Zugriff auf Anwendungen. Sie ermöglichen eine deutlich schnellere Bereitstellung und Kontrolle von Versionen sowie deren Verbreitung.


Ist die Docker-Technologie das Gleiche wie herkömmliche Linux-Container?

Nein. Die Docker-Technologie war ursprünglich auf die LXC-Technologie aufgesetzt – was meistens mit „traditionellen“ Linux-Containern assoziiert wird; sie hat sich aber seitdem von dieser Abhängigkeit befreit. LXC war als leichtgewichtige Virtualisierung von Nutzen, bot aber keine gute Entwickler- oder Nutzererfahrung. Die Docker-Technologie bietet mehr als die Fähigkeit, Container auszuführen – sie vereinfacht auch den Prozess der Erstellung und des Aufbaus von Containern sowie den Versand von Images und unter anderem auch der Versionierung von Images.

Traditionelle Linux-Container verwenden ein init-System, das mehrere Prozesse verwalten kann. Das bedeutet, dass komplette Anwendungen als eins betrieben werden können. Die Docker-Technologie unterstützt jedoch die Aufschlüsselung von Anwendungen in ihre einzelnen Prozesse und stellt hierzu die dementsprechenden Tools bereit. Dieser granulare Ansatz hat seine Vorteile.


Die Vorteile von Docker-Containern

Modularität

Der Docker-Ansatz für die Containerisierung konzentriert sich darauf, nur einen Teil der Anwendung für eine Reparatur oder Aktualisierung außer Betrieb zu nehmen, ohne dass die gesamte Anwendung außer Betrieb genommen werden muss. Zusätzlich zu diesem auf Microservices basierenden Ansatz können Sie Prozesse in mehreren Apps gemeinsam verwenden – so ähnlich wie bei einer serviceorientierten Architektur (SOA).

Layer und Image-Versionskontrolle

Jedes Docker-Image besteht aus einer Reihe von Layern. Diese Layer werden in einem einzelnen Image vereint. Wenn sich das Image ändert, wird ein Layer erstellt. Jedes Mal, wenn ein Nutzer einen Befehl wie run oder copy eingibt, wird ein neuer Layer erstellt.

Mit Docker werden diese Layer für neuer Container wiederverwendet, was die Entwicklung enorm beschleunigt. Zwischenzeitliche Änderungen werden von den Images gemeinsam verwendet, was die Geschwindigkeit, Größe und Effizienz weiter verbessert. Versionskontrolle ist ein fester Bestandteil des Layering. Bei jeder neuen haben Sie im Prinzip ein eingebautes Änderungsprotokoll und damit volle Kontrolle über Ihre Container-Images.

Rollback

Das Beste am Layering ist wahrscheinlich das Rollback, also das Zurücksetzen auf die vorherige Version. Jedes Image hat Layers. Sie sind mit der aktuellen Iteration eines Image nicht zufrieden? Setzen Sie es einfach zurück auf die vorherige Version. Dieser Ansatz unterstützt eine agile Entwicklung und sorgt, was die Tools angeht, für eine kontinuierliche Integration und Bereitstellung (Continuous Integration/Continuous Deployment - CI/CD)).

Schnelle Bereitstellung

Neue Hardware bereitzustellen und zum Laufen zu bringen, dauerte normalerweise Tage und war mit einem enormen Aufwand verbunden. Mit Docker-basierten Containern kann die Bereitstellung auf Sekunden reduziert werden. Indem Sie für jeden Prozess einen Container erstellen, können Sie ähnliche Prozesse schnell mit neuen Apps teilen. Und da zum Hinzufügen oder Verschieben eines Containers das Betriebssystem nicht gebootet werden muss, sind die Bereitstellungszeiten wesentlich kürzer. Darüber hinaus können Sie bei dieser Entwicklungsgeschwindigkeit einfach und kosteneffizient Daten erstellen und die von Ihren Containern erzeugten Daten ohne Bedenken löschen.

Die Docker-Technologie ist also ein granularer, kontrollierbarer, auf Microservices basierter Ansatz, der deutlich effizienter ist.


Gibt es Einschränkungen bei der Verwendung von Docker?

Docker für sich allein ist für die Verwaltung einzelner Container bestens geeignet. Wenn Sie beginnen, mehr und mehr Container und containerisierte Apps zu verwenden, die in Hunderte von Bestandteilen zerlegt sind, können die Verwaltung und Orchestrierung sehr schwierig werden. Irgendwann müssen Sie einen Schritt zurückgehen und Container gruppieren, um Dienste wie Vernetzung, Sicherheit, Telemetrie usw. in all Ihren Containern bereitzustellen. An dieser Stelle kommt Kubernetes ins Spiel.

Mit Docker erhalten Sie nicht dieselben UNIX-ähnlichen Funktionen, die herkömmliche Linux-Container bieten. Dies betrifft auch die Fähigkeit, Prozesse wie cron oder syslog neben Ihrer App innerhalb des Containers zu verwenden. Es gibt auch Einschränkungen beim Säubern von untergeordneten Prozessen nach dem Beenden von Child-Prozessen – etwas, das von traditionellen Linux-Containern durchgeführt wurde. Dem kann abgeholfen werden, indem die Konfigurationsdatei geändert wird und diese Fähigkeiten von Anfang an eingerichtet werden – etwas, das nicht sofort auf den ersten Blick offensichtlich ist.

Darüber hinaus gibt es andere Linux-Untersysteme und -Geräte, die nicht mit namespace versehen sind. Diese beinhalten SELinux, Cgroups und /dev/sd*-Geräte. Wenn ein Angreifer also die Kontrolle über diese Untersysteme erlangt, ist der Host gefährdet. Um komplizierte Strukturen zu vermeiden, werden die Host-Kernels gemeinsam mit den Containern verwendet, und das öffnet diese Sicherheitslücke. Das ist der Unterschied zu virtuellen Maschinen, die strenger vom Host-System getrennt sind.

Auch der Docker Daemon kann Sicherheitsbedenken verursachen. Um Docker-Container zu verwenden und auszuführen, nutzen Sie höchstwahrscheinlich den Docker Daemon, eine persistente Runtime für Container. Der Docker Daemon erfordert Root-Rechte. Es gilt hier also in Bezug auf Zugriffsberechtigungen und der Position der Prozesse besonders vorsichtig zu sein. Ein lokaler Daemon hat beispielsweise eine kleinere Angriffsfläche als einer, der in einer öffentlicheren Position gelagert ist, wie zum Beispiel ein Webserver.

Container haben noch viel mehr zu bieten