Docker-Inspektion, Teil 2

Das Docker-Funktionsprinzip

| Autor / Redakteur: Thomas Drilling / Ulrike Ostler

Wie funktioniert Docker eigentlich?
Wie funktioniert Docker eigentlich? (Bild: Docker)

Container-Technik erlaubt eine Kapselung der Runtime bei der Bereitstellung von Applikationen. Docker setzt das mit bekannten Linux-Kernel-Technologien um, ergänzt um eine von Docker entwickelte Kernel-Schnittstelle.

Applikationen bestehen heute nur selten aus einem einzigen Binary, das einfach auf den Server kopiert wird. Stattdessen umfassen moderne Apps eine Vielzahl unterschiedlicher Module, Services (etwa Webserver), Microservices, Bibliotheken, Datenbanken, Laufzeitumgebungen und vieles mehr.

Isolation

Wir eine solche Applikation mit allen ihren Abhängigkeiten und Eigenschaften in einen Container verfrachtet, „sieht“ sie noch einen ganz kleinen Ausschnitt des Dateisystems und „glaubt“, sie liefe alleine im System. Da die Separierung, Kapselung nicht wie bei einer virtuellen Maschine auf Hypervisor-Ebene und auch nicht im Container selbst erfolgt, sondern im Kernel des Host-Betriebssystems, hat der Containern aus seinem „Inneren“ heraus keine Möglichkeit festzustellen, dass er ein Container ist. Denn die abgeleitete Prozess-Hierarchie im Container beginnt jeweils wieder mi der PID 1 für den Init-Prozess: „/sbin/init“. Neben dem Teilen des Host-Betriebssystems haben einzelne Container zusätzlich auch die Möglichkeit, sich einzelne Libraries zu teilen.

Das Separieren erfolgt im Kernel des Host-Betriebssystems.
Das Separieren erfolgt im Kernel des Host-Betriebssystems. (Bild: Docker)

Dies führt zu einer Reduzierung des gesamten Overheads mit dem Ergebnis, dass Container im Vergleich zu VMs sehr viel schneller starten, in der Regel im Bereich von Sekunden statt Minuten. Das erlaubt das Entwickeln agiler, skalierbarer Architekturen.

Die Linux-Kernel-Schnittstelle

Primär haben Container den Zweck, Prozesse auf Linux und Unix-Systemen voneinander und vom Root-System zu isolieren. Dazu bedarf es zunächst einer leicht verwaltbaren Kernel-Schnittstelle wie LXC (Linux Containers), wie sie auch von Docker in Version 0.9 ursprünglich genutzt wurde. Später hat Docker die Schnittstelle LXC durch eine eigene Implementierung mit der Bezeichnung „libcontainer“ ersetzt. Diese ist heute ein de facto Standard und wird etwa auch von Google und Red Hat unterstützt.

Das libcontainer-Interface besteht aus diversen Funktionen. Docker selbst ist dabei lediglich ein Systemdienst, der auf höchster Ebene als Root-Nutzer im Betriebssystem läuft und unter anderem über eine REST-API angesprochen wird. Das Funktioniert zum Beipiel aus Web-Anwendungen heraus oder vom mitgelieferten Kommandozeile-Client oder bei Bedarf vom grafischen Client „Kitematic“ aus. Der Docker-Dienst weist auf die libcontainer-Bibliothek zurück und richtet je nach Konfiguration die für Container-Virtualisierung maßgeblich verantwortlichen Linux-Kernel-Features CGroups, Namesspaces und Capabilities ein.

Diese Kernel-Feature bilden das Fundament von Docker

Das Linux-Kernel-Feature Namespaces ist bei LXC und auch bei Docker für das eigentliche „Simulieren“ in sich geschlossener Umgebungen gegenüber der jeweiligen ausgeführten Anwendung (COntainr Host) zuständig. Jede containerisierte Anwendung „sieht“ damit nur denjenigen „Ausschnitt“ einer Umgebung, der sie selbst betrifft, ganz so als gäbe es tatsächlich eigene Mount-Punkte, einen eigenen Host-Namen für die oder eigene virtuelle Netzwerkkarten und andere Geräte. Namespaces ermöglichen auch die Existenz eigener „Nutzer“, die unabhängig von Host-Betriebssystem sichtbar sind.

Das Linux-Kernel-Feature Control Groups (CGroups) beschreibt die Fähigkeit des Linux-Kernels, Ressource-Limits zu definieren und Anwendungen nach Bedarf zu limitieren. Das gilt zum Beispiel in Form von Rechenzeit, die auf der CPU des Container-Host konsumiert werden darf, oder der Speichermengen, die im Container genutzt werden können.

Das dritte Kernel-Konzept, von dem Docker Gebrauch macht, sind Capabilities. Prinzipiell läuft jeder Linux-Container als Root-Nutzer. Mittels Capabilities lassen sich allerdings einzelne „Fähigkeiten“ aus gestarteten Anwendungen „entfernen“ oder lediglich on demand zuweisen. Somit kann eine Container-Anwendung auch, wenn sie mit Root-Rechten läuft, etwa keine administrativen Tasks im Netzwerk ausführen oder den Container-Host herunterfahren – ein Sicherheits-Feature.

Die libcontainer-Bibliothek in Verbindung mit den Linux-Kernel-Features CGroups, Namesspaces und Capabilities
Die libcontainer-Bibliothek in Verbindung mit den Linux-Kernel-Features CGroups, Namesspaces und Capabilities (Bild: Docker)

Zusätzliche Mandate

Je nach verwendeter Linux-Distribution gibt es zusätzlich Mandatory Access Control in Form von „SELinux“ (Red Hat, CentOS) oder „AppArmor“ (Suse, Ubuntu), die von Docker ebenfalls mit eingerichtet werden. Darüber hinaus lassen sich Container-Lösungen für eine effizientere Dateisystemen-Nutzung hierarchische Dateisysteme mit besonderen Fähigkeiten einsetzen, beispielsweise „AUFS“ und „ext4“ mit „devmapper“ auf Red Hat oder „btrfs“, einer anderen Art „versionierender“ Dateisysteme mit Copy-On-Write.

Schließlich brauchen Container das „change root“-Feature, also die Fähigkeit des Linux-Kernels, den Mountpunktes des Root Ordners zu verschieben. Dadurch kann erst eine geschlossene Betriebssystemumgebung simuliert werden.

Was meinen Sie zu diesem Thema?

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 45486647 / Anwendungen)