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 das Unternehmen den gleichen Namen haben, kann verwirrend sein.

Hier ist eine kurze Erklärung:

  • Die IT-Software „Docker“ ist eine Containerisierungstechnologie, mit der Linux®-Container erstellt und verwendet werden können.
  • Die Open Source Docker-Community arbeitet an der Verbesserung dieser Technologien zum Nutzen aller Anwender – und zwar umsonst.
  • Das Unternehmen Docker Inc. verbessert die Arbeiten der Docker-Community, macht diese sicherer und teilt diese Verbesserungen mit der gesamten Community. Außerdem bietet Docker den Unternehmenskunden Support für diese verbesserten und zuverlässigeren Technologien an.

Mit Docker können Sie Container wie extrem leichtgewichtige, modulare virtuelle Maschinen behandeln. Diese Container können Sie flexibel erstellen, bereitstellen, kopieren und zwischen Umgebungen verschieben.


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 gewährleistet, 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. Außerdem wird mit Docker die Bereitstellung der Anwendung (oder der Prozesskombinationen, die eine Anwendung ausmachen) in dieser Container-Umgebung automatisiert.

Diese Tools bauen auf Linux-Containern auf – was Docker sehr benutzerfreundlich macht – und sorgen für einen äußerst guten Zugriff auf die Anwendungen. Anwendungsversionen können so deutlich schneller bereitgestellt, verteilt und gesteuert werden.


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

Nein. Die Docker-Technologie setzte ursprünglich auf der LXC-Technologie auf. Diese wird meistens mit „herkömmlichen“ Linux-Containern assoziiert, allerdings ist diese Abhängigkeit nicht mehr so groß. LXC war als leichtgewichtige Virtualisierung von Nutzen, bot aber keine gute Entwickler- oder Benutzererfahrung. Die Docker-Technologie umfasst mehr als nur das Ausführen von Containern. Mit ihr können unter anderem Erstellung und Entwicklung von Containern sowie Versand und Versionierung von Images stark vereinfacht werden.

Herkömmliche Linux-Container verwenden ein init-System, das mehrere Prozesse verwalten kann. Das bedeutet, dass mehrere Anwendungen als ein System ausgeführt 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 Layers werden in einem Image zusammengefasst. 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. Jedes Mal, wenn es eine neue Änderung gibt, 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 (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. Bei dieser Entwicklungsgeschwindigkeit können die von den Containern erzeugten Daten einfach und kosteneffizient erstellt und bedenkenlos wieder gelöscht werden.

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 im Container neben Ihrer App zu verwenden. Es gibt auch Einschränkungen beim Löschen von Enkelprozessen nach dem Beenden von Kindprozessen – etwas, das von herkömmlichen 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 viel 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. Besonderes Augenmerk muss daher darauf gerichtet werden, wer Zugriff zu diesem Prozess erhält und wo der Prozess sich befindet. Ein lokaler Daemon hat beispielsweise eine kleinere Angriffsfläche als einer, der sich an einer öffentlicheren Stelle befindet, zum Beispiel auf einem Webserver.

Container haben noch mehr zu bieten