Docker Entwicklungsumgebung unter Windows – Teil 5: docker compose

Unsere Entwicklungsumgebung läuft zwar, ist allerdings relativ aufwendig zu betreiben. Jedes mal wenn wir alles starten oder stoppen wollen brauchen wir die aufwändigen Befehle und die ganzen Parameter sind auch nicht sehr teamfreundlich. Glücklicherweise gibt es hier mit docker compose Abhilfe. In diesem Artikel setzen wir unsere Entwicklungsumgebung also auf docker compose um und setzen uns auch kurz mit den Docker Networks auseinander, die die Links ersetzen werden.

Was ist unser Ziel hier?

Stellen wir uns vor wir arbeiten in einem kleinen Entwicklerteam und alle wollen dieselbe Entwicklungsumgebung nutzen. Jetzt kommt ein neuer Kollege ohne große Docker Erfahrung und wir müssen ihm erklären, wie er die Umgebung startet. „Also, zuerst mal führst du diesen dreizeiligen Befehl mit achtzehn Parametern aus, dann noch den hier und als letztes den hier. Willst du was verändern musst du an den Parametern schrauben aber vorsicht, nicht zuviel schrauben!“. Oder wir wollen etwas an der Umgebung verändern (vielleicht eine andere MySQL Version) also müssen wir durchs Büro schreien „Ab sofort Version 5.6 beim MySQL Container verwenden!!“.

Umständlich und unsicher! Viel besser wäre es, wenn wir unsere Entwicklungsumgebung einfach mit einem einzigen Befehl starten könnten. Und wenn wir die Konfiguration einfach mit in Git committen können. Und genau das ist mit docker compose möglich. Das Ziel dieses Artikels ist also, genau unsere bisherige Entwicklungsumgebung einfach mit docker compose umzusetzen damit wir diese Vorteile genießen können.

Eine kleine Änderung wird es allerdings geben: Docker Networks sind der moderne Nachfolger zu den Links, die wir in den letzten Artikeln verwendet haben. Wir erinnern uns, die Links haben uns ermöglicht, beispielsweise von Nginx auf PHP zuzugreifen und haben die Container untereinander „bekannt gemacht“. Genau diese Funktionalität bilden wir nun über Networks nach.

 

Die docker-compose.yml Datei

Zentrales Element von docker compose ist die Datei docker-compose.yml. Diese können wir direkt im Hauptverzeichnis unserer Umgebung anlegen (also auf der selben Ebene wie die Ordner php, nginx und application) und befüllen sie mit folgendem Inhalt:

Das ist natürlich noch nicht alles aber der Übersichtlichkeit halber gehen wir hier Schritt für Schritt vor.
Dieser Teil ist das Grundgerüst der docker-compose.yml.

  • version: ‚2‘ – definiert die Version der Konfigurationssprache
  • services: – hier kommt noch einiges dazu, denn in diesem Abschnitt werden die einzelnen Container definiert, die gestartet werden sollen
  • networks: – im Bereich networks definieren wir die einzelnen Netzwerke in denen unsere Container miteinander kommunizieren sollen. Wir benötigen nur ein einziges. Bridge ist hierbei der Standardtreiber
  • volumes: – Wie im vorherigen Artikel benutzen wir auch hier wieder ein benanntes Volume zum Abspeichern und Erhalten unserer MySQL Daten

 

 

Nginx

Im Bereich services können wir nun folgenden Abschnitt hinzufügen, um Nginx in unserer Umgebung zu starten:

Wir sagen einfach wir möchten gerne den Docker Container aus dem Ordner nginx builden (das könnten wir auch ersetzen durch image: ftiersch/nginx), den Port 80 auf der lokalen Maschine an den Port 80 im Container leiten, den Ordner application ans Verzeichnis /usr/share/nginx/html im Container verknüpfen und den Container im Netzwerk ftiersch-dev anmelden.

Also definitiv kein Hexenwerk sondern alles Dinge, die wir vorher manuell in unseren docker build und docker run Befehlen gemacht haben (abgesehen von den networks da dies ja ein neuer Teil ist, dafür sparen wir uns das linken).

 

PHP

PHP ist dasselbe Prinzip, nach unserem Nginx Service können wir nun also einen PHP Service definieren:

Auch hier ganz simpel: Erzeuge einen Container aus dem Dockerfile im Ordner php, teile das Verzeichnis application und tritt dem Netzwerk ftiersch-dev bei.

 

 

MySQL

Du hast es geahnt, für MySQL machen wir nochmal dasselbe:

Ein kleiner Unterschied hier ist, dass wir direkt das offizielle MySQL Image in der Version 5.7 verwenden, da wir hier keine Veränderungen vornehmen mussten (z.B. Konfigurationsdateien in den Container kopieren wie bei Nginx). Dann mappen wir den Port 3306 in den Container, setzen unsere Environment Variablen zum automatischen Anlegen von Datenbank und User, geben unser benanntes Volume im Container frei und auch hier treten wir wieder dem Netzwerk bei.

 

Entwicklungsumgebung starten und stoppen

Nachdem unser docker-compose.yml File nun fertig ist können wir die Entwicklungsumgebung starten. Dafür führen wir einfach folgenden Befehl aus:

Falls die Container einfach weiterlaufen sollen können wir sie auch im Hintergrund laufen lassen, indem wir noch den Parameter -d anhängen.
Sollten wir mal nur PHP und einen Webserver benötigen (oder gar NUR einen Webserver zum Testen von HTML Dateien etc) können wir auch einzelne Services starten. Zum Beispiel so:

Wenn unsere Container im Hintergrund laufen und wir die Umgebung beenden möchten können wir dies einfach mit dem down Befehl erreichen:

 

 

Nachwort zu Networks

Was machen die Networks jetzt genau? Ein Network beinhaltet mehrere Container. Innerhalb dieses Netzwerks können alle Container auf die anderen Container anhand ihres Namens zugreifen. Was wir vorher umständlich mit einzelnen Links einstellen mussten geht nun simpel flächendeckend über mehrere Container hinweg, was die Arbeit natürlich wesentlich erleichtert.

Wenn wir Container mit docker compose starten bekommen diese automatisch einen Namen zugewiesen, nämlich VERZEICHNIS_SERVICE_ZAHL. Glücklicherweise löst docker compose diese Änderung automatisch für uns auf (sowohl bei networks als auch bei links), wir können also beispielsweise in unserem PHP Script immernoch zum Host mysql verbinden anstatt hier umständlich jedes mal den Namen zu ändern, wenn wir beispielsweise den Verzeichnisnamen verändern.

 

Downloads

Auch in diesem Artikel wieder – die verwendeten Dateien zum Download und direkt loslegen! docker-compose.zip jetzt herunterladen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*