Docker Entwicklungsumgebung unter Windows – Teil 1: Grundlagen

Ein Problem habe ich mit Docker unter Windows – die Aktivierung des benötigten Hyper-V (siehe meinen Artikel zur Dockerinstallation unter Windows) lässt leider die Möglichkeit verfallen, weiterhin Virtual Machines wie zum mit Beispiel Vagrant und VirtualBox zu verwenden. Häufiges Ein- und Ausschalten von Hyper-V kann ebenfalls zu Problemen führen also war das keine Option.

Um dieses Problem zu umgehen habe ich mich umgesehen um meine PHP Projekte auch unter Windows mit Docker laufen lassen zu können und möchte euch in dieser Artikelserie Schritt für Schritt zeigen, wie wir eine eigene Entwicklungsumgebung für PHP Seiten mit Docker schnell erzeugen.

Ziel dieser Serie

Das Ziel dieser Artikelserie soll genug theoretisches Wissen über Docker sein, um eine eigene Entwicklungsumgebung mit Nginx, PHP7 und MySQL in einer Dockerumgebung unter Windows an den Start zu bringen. Die benötigten Dockerfiles gibt es dann natürlich auch gesammelt zum Download um das Getippe zu ersparen (wobei das meiner Meinung nach oft beim Lernen deutlich mehr hilft, als einfach vorgefertigtes auszuführen).

Auf dem Weg dahin gehen wir Schritt für Schritt vor und erzeugen jeden Container einzeln um ihn danach in die bisherige Docker Entwicklungsumgebung zu integrieren – angefangen beim Webserver mit Nginx über die Einbindung von PHP bis hin zu MySQL am Ende.

Bevor es aber im nächsten Artikel ans Eingemachte geht, hier nochmal ein paar kleine Grundlagen zur Auffrischung (für ausführliche Informationen, schau dir einfach meine anderen Artikel zum Thema Docker an).

 

Container und Images

Für eine Docker Entwicklungsumgebung ist unser Ziel, ein passendes Image (oder eigentlich mehrere) zu erzeugen, das die Grundlagen für unsere Umgebung enthält. Dieses Image können wir dann mehrfach wiederverwenden und auch anderen über Docker Hub zur Verfügung stellen.

Images sind sozusagen die Baupläne aus denen ein Container erzeugt wird. Starten wir also ein Container von einem Ubuntu Image können wir uns darin einloggen und Software installieren. Diese Software ist allerdings nur im Container installiert, sobald wir diesen löschen sind die Änderungen wieder Geschichte und der nächste Container wird wieder frisch aufgesetzt.

Um Änderungen dauerhaft zu speichern müssen wir also eventuelle Änderungen aus einem Container in das Image committen.

 

 

Volumes

Ein weiteres Problem sind die Daten. Daten in unserem Container sind auch nur dort vorhanden, das heißt wenn wir ein Projekt anlegen und bearbeiten sind auch diese Änderungen sofort weg, wenn wir den Container löschen. Das ist natürlich nicht im Sinne des Erfinders. Wir müssen also dafür sorgen, dass die Daten von unserem Computer in den Container gespiegelt werden.

Genau das geschieht über die Volumes. Wir sagen Docker damit Hey Docker, ich möchte gerne die Daten aus Verzeichnis X im Container verwenden. Bitte mach alle Änderungen jeweils auch auf der anderen Seite. 

Das bezieht sich allerdings nicht nur auf die Dateien – auch mit der Datenbank beispielsweise müssen wir hier aufpassen. Denn auch MySQL speichert die Daten natürlich physisch auf der Festplatte ab und möchten wir nicht bei jedem Start die Daten neu einspielen brauchen wir auch hier das richtige Volume.

 

Kommunikation zwischen Containern

Die Probleme hören nicht auf (aber keine Sorge, wir lösen sie alle). Unsere Docker Entwicklungsumgebung soll natürlich aus mehreren Containern bestehen. Ein Standardcontainer kann allerdings nicht mit anderen kommunizieren, da er ein komplett geschlossenes System ist.
Damit unser Webserver allerdings die Requests an PHP weitergeben kann und PHP seinerseits dann mit der Datenbank kommunizieren kann benötigen wir genau diese Eigenschaft.

Glücklicherweise bietet Docker uns dafür zwei simple Methoden:

  1. Container Linking – Container können miteinander verlinkt werden. Das heißt einfach, dass die Kommunikation zwischen zwei Containern ermöglicht wird, die verlinkt werden. Dabei ist der Hostname einfach der Name des Containers (was natürlich deutlich simpler und lesbarer ist, als jedes mal die IP rauszufinden).
  2. Networks – Docker bietet außerdem die Möglichkeit, Networks anzulegen. Dabei wird quasi ein privates Netzwerk aus den Containern angelegt, die sich ein Netzwerk teilen. Innerhalb dieses Netzwerks können dann alle Container auf die anderen – ebenfalls anhand des Containernamens – zugreifen. Gerade bei größeren Strukturen ist das natürlich eine angenehme Möglichkeit, auch um zirkuläre Abhängigkeiten zu vermeiden.

 

Soviel zu den Grundlagen. Jetzt wird es Zeit, loszulegen. Im nächsten Artikel kümmern wir uns um den ersten Teil unserer Docker Entwicklungsumgebung – den Webserver!

Schreibe einen Kommentar

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

*