Multi-Tier-Applikationen mit Docker Compose, Machine und Swarm
Seite 3: Docker Compose
Rezept fĂĽr komplexe Anwendungsszenarien mit Compose
Docker Compose (ehemals fig) ist ein einfaches Orchestrierungswerkzeug für Docker-Container, das in der Skriptsprache Python implementiert ist. Mit ihm ist es möglich, mehrere Container zu definieren, zu verbinden (link) und auf einem beliebigen Docker Host auszuführen. Die Syntax des Werkzeugs ähnelt dem populären Werkzeug vagrant.
Compose ist aktuell für OS X und 64-Bit-Linux verfügbar. Anwender können die Software entweder kompiliert von der GitHub-Projektseite herunterladen oder in einer bestehenden Python-2.7-Umgebung mit dem Hilfswerkzeug pip installieren. Das folgende Beispiel zeigt beide Möglichkeiten:
$ curl -L \
https://github.com/docker/compose/releases/download/1.5.0/docker-compose-`uname\
-s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
# Alternativ mit pip
$ pip install -U docker-compose
Alternativ existieren im Docker Hub fertige Images, die Docker Compose integrieren, sodass eine separate Installation nicht nötig ist. Leider sind die auf dem Docker Hub verfügbaren Images für Compose nicht ganz aktuell.
Grundlage für Docker Compose ist eine Kontrolldatei im Format der Auszeichnungssprache YAML, in der alle zu einem Szenario gehörenden Container mit ihren Einstellungen definiert werden. Jeder Parameter, der bei docker run gültig ist, kann auch in der Kontrolldatei zum Einsatz kommen. Per Default liest docker-compose die Datei "docker-compose.yml" ein. Der Parameter -f überschreibt den Standardnamen.Beispiel 5 zeigt die Definition eines einen einzelnen Containers – docker-compose up liest die Kontrolldatei ein und startet alle Container.
Die Kontrolldatei besteht dabei nur aus einer Definition für den Container "simpledemo". Seine Grundlage ist das Image "busybox:latest". Das Kommando, das im Container ausgeführt werden soll, ist eine einfache Schleife, die einen "Hello World"-Text ausgibt. Mit dem Parameter -p können die Anwender docker-compose einen Projektnamen mitgeben, der als Präfix für den Containernamen dient. Entfällt -p, dann nutzt docker-compose als Präfix den Namen des Verzeichnisses, in dem sich die Kontrolldatei befindet. Der Parameter -d für das Unterkommando up teilt docker-compose mit, dass alle Container im Hintergrund ausgeführt werden sollen. Jeder Container bekommt zusätzlich zum Projekt- und Containernamen einen Index als Suffix. Das ist für die Skalierung relevant. Mit dem Kommando logs verbindet sich docker-compose mit allen gestarteten Containern und gibt deren Bildschirmausgaben aus. Um die Lesbarkeit zu erhöhen, erhält jeder gestartete Container eine eigene Textfarbe im Log. stop und kill stoppen die Container; rm löscht sie.
docker-compose enthält einen einfachen Skalierungsmechanismus. So können Anwender über die Kommandozeile angeben, wie viele Instanzen eines bestimmten Containers sie startet wollen, wie Beispiel 6 zeigt. Auf die Angabe des Unterkommandos scale folgt der Name des Services und Containers und die Anzahl der zu erstellenden Instanzen.
Ein komplexeres Szenario zeigt Beispiel 7, das eine simple Applikation ausfĂĽhrt, die einen Webdienst bereitstellt und einen Wert in ein Redis-Backend schreibt beziehungsweise liest. Der Befehl build startet den Bau eines Images anhand des Dockerfiles im aktuellen Verzeichnis. Daneben definiert der Code noch Volumes, Umgebungsvariablen und Portweiterleitungen sowie die VerknĂĽpfung zu dem weiter unten definiertem Redis-Container.
Im GitHub-Projekt zu diesem Artikel steht das komplette Beispiel und ein weiteres Szenario mit ownCloud und MariaDB zum Herunterladen für eigene Versuche. Die vollständige Dokumentation zu docker-compose steht auf der Docker-Site zum Download bereit.
Docker Compose ist ein sehr nĂĽtzliches Werkzeug, das auch die Definition komplexer Szenarien mit vielen Containern in einer einfachen Syntax erlaubt. Vor allem die integrierte Skalierungsfunktion ist bei Integrationstests von Applikationen hilfreich. Zusammen mit anderen Werkzeugen aus dem Docker-Universum mausert sich Compose zu einem Orchestrierungswerkzeug, das in kleinen Umgebungen auch fĂĽr den Produktiveinsatz taugt.