Mit Docker automatisiert Anwendungscontainer erstellen
Seite 3: Datenzugriff, Ökosystem und Fazit
Die Verbindung zwischen Containern stellt derzeit die einzige Möglichkeit in Docker dar, Dienste für andere Container zur Verfügung zu stellen. Denkbar sind zukünftig allerdings weitergehende Szenarien. Einen ersten Ausblick auf zukünftige Varianten stellt die Verwendung eines weiteren Containers als Vermittler zwischen Node.js und MongoDB dar: Der Einsatz eines solchen "Ambassador"-Containers wird in der Dokumentation von Docker ausführlich beschrieben.
Gemeinsamer Zugriff auf Daten
Außer dem direkten Zugriff auf einen Dienst, der von einem anderen Container bereitgestellt wird, unterstützt Docker auch die Integration mit der Umgebung über gemeinsam genutzte Laufwerke. Das gilt gleichermaßen für die Integration mehrerer Container und für die mit dem Wirtssystem.
Im einfachsten Fall wird ein Verzeichnis des Wirts für einen Container freigegeben, sodass er direkt lesend und schreibend darauf zugreifen kann. Das birgt insbesondere den Vorteil, dass ein solches Verzeichnis dauerhaft und unabhängig vom Container existiert und daher auch dessen Neustart oder Löschen anstandslos übersteht. Um ein Wirtsverzeichnis aus einem Container heraus verwenden zu können, dient der Parameter -v beim Aufruf des run-Kommandos:
$ docker run -v /home/golo/.ssh:/root/.ssh goloroden/nodejs
Das Verzeichnis /home/golo/.ssh des Wirts dient in diesem Fall als /root/.ssh innerhalb des Containers: Da sowohl der Wirt als auch der Container nun das gleiche Verzeichnis verwenden, wirken sich Änderungen in beide Richtungen sofort aus.
Verzichtet man auf die Angabe eines Wirtsverzeichnisses, erzeugt Docker ein Verzeichnis und bindet es in den Container ein. Auf dem Weg lassen sich externe Verzeichnisse unabhängig vom Wirt definieren. Das kann beispielsweise bei der Verwendung mit einem Datenbank-Container ausgesprochen hilfreich sein:
$ docker run -v /data/db -name mongodb dockerfile/mongodb
Diese Variante wird auch im Rahmen von Dockerfiles mit dem VOLUME-Schlüsselworts unterstützt. Die Angabe von
VOLUME [ "/data/db" ]
erfüllt dabei den gleichen Zweck wie die Angabe des Parameters -v im vorigen Beispiel. Eine Zuordnung auf ein dediziertes Wirtsverzeichnis ist über das Dockerfile nicht möglich, da – ähnlich wie bei den Ports – sonst eine Abhängigkeit des Containers zu seinem Wirt bestünde.
Ein bemerkenswerter Effekt ist, dass derart erzeugte Datenverzeichnisse auch dann erhalten bleiben, wenn der Container selbst nicht mehr ausgeführt wird: Es genügt, wenn er existiert. Auf diese Weise lassen sich sogenannte "data-only container" erzeugen, die keine andere Aufgabe haben als ein Datenverzeichnis zu definieren. Sie lassen sich aus anderen Containern über die Angabe des Parameters -volumes-from einbinden:
$ docker run -v /data -name data my-data-only-container
$ docker run -volumes-from data goloroden/nodejs
Nun hat der Node.js-Container Zugriff auf das /data-Verzeichnis, sodass er externe Daten mit anderen Container dauerhaft teilen kann, ohne von einem dedizierten Verzeichnis auf dem Wirt abhängig zu sein.
Und drum herum?
Obwohl es sich bei Docker um ein noch äußerst junges Projekt handelt, ist bereits ein bemerkenswertes Ökosystem entstanden. Besonders aktiv ist jener Bereich, der sich mit dem Deployment und dem Hosting von Docker-Containern beschäftigt.
Vor allem das Deployment und die Verwaltung von unterschiedlichen Docker-Servern ist ein verbreitetes Thema, wie die Projekte MaestroNG und ShipYard zeigen. Ergänzt werden diese Werkzeuge durch professionelles Hosting, wie es Orchard und Tutum anbieten. Was derzeit noch fehlt, ist eine echte Infrastructure-as-a-Service- beziehungsweise Platform-as-a-Service-Alternative auf Basis von Docker, wobei auch hier erste Projekte aktiv sind.
Zu guter Letzt besteht mit CoreOS bereits eine Linux-Distribution, die auf Docker als alleinige Paketverwaltung setzt und mit Diensten wie systemd und etcd die notwendigen Komponenten für eine verteilte Ausführung von Docker-basierten Anwendungen enthält. Wer Software entwickelt, die in einem derartigen Kontext auszuführen ist, ist gut beraten, sich mit den sogenannten "12-Factor-Apps" vertraut zu machen.
Fazit
Docker ist, wie im ersten Teil erwähnt, eine ausgesprochen bemerkenswerte Software, die einen wesentlichen Anteil zum zukünftigen Hosting von Anwendungen leistet. Mit den in diesem Artikel beschriebenen Möglichkeiten, Container mit Dockerfiles automatisiert zu erzeugen, sie zu verbinden und mit anderen Containern und dem Wirt zu integrieren, lassen sich auch komplexe Szenarien abbilden.
Allerdings mangelt es noch an geeigneten Verwaltungswerkzeugen für umfangreiche Deployments. Erste Schritte in diese Richtung wurden bereits unternommen, auch erste Hoster sind am Markt; man merkt an vielen Stellen aber noch deutlich, dass es sich um eine noch junge Technik handelt: Viele Features fehlen den Werkzeugen und Hostern derzeit noch. Doch das könnte sich in kurzer Zeit ändern.
In Zukunft dürften Docker-basierte Container eine ernsthafte Alternative zur klassischen Virtualisierung darstellen. Daher ist jeder Entwickler schon heute gut beraten, sich mit Docker zu beschäftigen.
Golo Roden
ist Gründer der "the native web UG", eines auf native Webtechniken spezialisierten Unternehmens. Für die Entwicklung moderner Webanwendungen bevorzugt er JavaScript und Node.js und hat mit "Node.js & Co." das erste deutschsprachige Buch zum Thema geschrieben
(jul)