Bisher haben wir sehr interaktiv mit Docker gearbeitet und alle Befehle die wir benötigt haben um Docker Container an den Start zu bringen manuell eingegeben. Bei einfachen Setups kann man das durchaus so machen, je komplexer eine Docker Umgebung wird und je mehr Container in dieser Umgebung enthalten sind, desto schwieriger ist es das manuell zu erledigen. Das ist genau der Zeitpunkt zu dem Docker Compose ins Spiel kommt. Docker selbst, bzw. die Docker Container, sind entwickelt worden um einzelne Applikationen auszuführen. Möchte man einen kompletten LAMP Stack erzeugen würde man dies nicht in einem einzelnen Docker Container machen, sondern man würde, ähnlich wie wir das oben unter WordPress gesehen haben, einen Container erzeugen in dem der MySQL Server läuft und einen anderen Container in dem dann der Apache Server mit PHP ausgeführt wird. Diese beiden Container würden dann miteinander verbunden. Je komplexer die Anwendungs-Szenarien werden, desto größer wird auch die Anzahl der Container die für diese Anwendungen benötigt werden. An dieser Stelle wird klar, dass es schwierig und fehleranfällig wird solch komplexe Umgebungen durch die manuelle Eingabe von Befehlen zu erzeugen.
Docker Compose funktioniert so, dass die komplette Konfiguration der Docker Umgebung innerhalb einer YAML (jaja, lustig… YAML Ain`t Markup Language ;)) Datei definiert wird. Diese wird dann an den Befehl docker-compose weitergegeben, der dann wiederum die definierte Docker Umgebung erzeugt.
Wir werden nun unsere WordPress Umgebung noch einmal erzeugen, dieses Mal aber nicht manuell sondern über eine YAML Datei. Die YAML-Datei die wir benötigen sieht wie folgt aus:
Diese Datei ist ziemlich einfach aufgebaut. Über version: wird die Version der YAML-Datei angegeben, in unserem Fall ist das 3. Unter services: sind die verschiedenen Container definiert die erzeugt werden sollen und unter volumes: werden die Volumes definiert die wir zum persistieren unserer Umgebung benötigen. Im letzten Beispiel hatten wir keine Volumes für die Persistierung von Daten, d.h. der komplette Inhalt der MySQL Datenbank würde beim Beenden und Neustarten des Containers verloren gehen. Alle Änderungen die wir an WordPress vorgenommen haben wären dann auch wieder zurückgenommen worden und wir könnten das WordPress Blog komplett neu einrichten. Grundsätzlich entsprechen die einzelnen Befehle in der YAML-Datei den Befehlen die wir auch über die Kommandozeile eingegeben haben, daher werde ich diese an dieser Stelle nicht noch einmal wiederholen.
Es gibt aber ein paar Dinge die anders sind als wir das bisher in der Kommandozeile eingegeben haben. Über den Befehl volumes: – db_data:/var/lib/mysql hängen wir das persistente Volume db_data in den Pfad /var/lib/mysql. Über restart:always geben wir an, dass wann immer es im Container Probleme gibt, dieser neu gestartet werden soll. Das bedeutet beispielsweise, dass der WordPress Container so lange neu gestartet wird bis WordPress eine Verbindung zur MySQL Datenbank im mysql Container herstellen konnte. depends_on:mysql im WordPress Container gibt an, dass dieser erst gestartet wird wenn der mysql Container verfügbar ist. Was auffällt ist, dass wir im YAML Script die Container nicht explizit verlinken. Das ist bei docker-compose nicht notwendig, da docker-compose für die in der YAML-Datei definierten Container automatisch ein virtuelles Netzwerk aufbaut das die Container miteinander verbindet.
Es gibt ein paar Sachen die wir bzgl. der Docker Compose Datei berücksichtigen müssen. Zum einen muss diese Datei entweder docker-compose.yml oder docker-compose.yaml heißen. Außerdem ist es sehr wichtig mit den richtigen Einrückungen und Groß-/Kleinschreibung zu arbeiten. Docker Compose ist da sehr eigen und es hat längere Zeit gedauert bis ich die Datei so hatte, dass Docker Compose damit arbeiten konnte.
1.) Zunächst müssen wir in das Verzeichnis wechseln in dem die docker-compose.yml Datei liegt. Bei mir ist das das Verzeichnis C:\temp. Dorthin wechsel ich mit dem Befehl
cd C:\temp
2.) Um sicherzugehen, dass die Docker Datei auch in diesem Verzeichnis liegt gebe ich den Befehl
dir *.yml ein
Dieser Befehl liefert das folgende Ergebnis zurück
3.) Um unsere WordPress Umgebung mit Hilfe von docker-compose zu erstellen geben wir zunächst
docker-compose pull
ein. Dieser Befehl lädt die Docker Images die benötigt werden vom Docker Hub herunter. Da wir auch dieses Mal keine besondere Versionsnummer angegeben haben werden einfach die neusten Images geladen.
4.) Nachdem die Images heruntergeladen wurden können wir die Container nun über den Befehl
docker-compose up -d
starten. Im Hintergrund wird all das gemacht was wir in der letzten Lektion manuell erledigt haben.
5.) Nachdem dieser Befehl durchgelaufen ist können wir nun mit
docker-compose ps
nachschauen ob die Container wirklich existieren und auch ausgeführt werden.
6.) Dasselbe geht übrigens natürlich auch auf die althergebrachte Art und Weise mit
docker container ps
Was man sehen kann ist, dass durch beide Befehle leicht unterschiedliche Informationen über die laufenden Docker Container zurückgeliefert werden.
7.) Über den Befehl
docker-compose logs
kann man sich die Log-Dateien der beiden Docker Container anzeigen lassen.
8.) Natürlich wollen wir nun einmal überprüfen ob WordPress auch wirklich ausgeführt wird. Hierzu starten wir einfach einen Browser und geben als URL wieder http://65.52.229.47:8080 ein.
Wieder landen wir auf der Installations-Seite von WordPress. Da es sich hier nicht um WordPress Blogserie handelt ist das für uns Beweis genug und wir werden WordPress nicht, wie im vorherigen Blogartikel bschrieben, konfigurieren.
9.) Um die komplette Umgebung zu beenden geben wir
docker-compose stop
ein. Dies beendet die beiden von uns instantiierten Container in einem Schritt.
10.) Um die Container und Images wieder zu entfernen geben wir einfach den Befehl
docker-compose rm
ein. Diesen Befehl müssen wir dann noch mit y bestätigen und unsere lokale Umgebung ist wieder aufgeräumt.