Docker Entwicklungsumgebung unter Windows – Teil 4: MySQL

Der Webserver läuft, PHP interpretiert – es wird Zeit für die Datenbank. Hier ist MySQL natürlich das Programm der Wahl, wie vermutlich für die meisten PHP Entwickler. Auch dafür gibt es bereits ein offizielles Docker Image. Im folgenden Artikel binden wir dieses Image Schritt für Schritt in unsere Entwicklungsumgebung ein.

Das Docker MySQL Image

Die vorgefertigten Images machen uns die Arbeit natürlich einfacher. Um einen MySQL Server zu starten benötigt es – wie immer – nur einen einzigen Befehl:

  • –name=mysql – auch dieser Container bekommt einen vergebenen Namen, da wir ihn später mit PHP verlinken müssen. Andernfalls könnte der PHP Container nicht darauf zugreifen.
  • -e MYSQL_ROOT_PASSWORD=root – der Parameter -e setzt eine Environment Variable innerhalb des Containers. Das MySQL Image ist automatisch darauf getrimmt, das root Passwort für die MySQL Datenbank auf diesen Wert zu setzen, falls er definiert ist.
  • -e MYSQL_DATABASE=testdb – selbes Prinzip, wird die Environmentvariable MYSQL_DATABASE gesetzt wird automatisch eine Datenbank mit diesem Namen angelegt
  • -e MYSQL_USER=testuser – du kannst dir vermutlich denken, was das macht: Es wird ein Benutzer mit diesem Namen für die oben angelegte Datenbank erzeugt
  • -e MYSQL_PASSWORD=testpass – und ein Benutzer benötigt natürlich auch ein Passwort

 

Und schon läuft unser MySQL Server und wir können theoretisch darauf zugreifen. Damit unser PHP aber darauf zugreifen kann benötigen wir noch ein paar weitere Schritte.

 

 

Unseren PHP Container MySQL tauglich machen

Als erstes sorgen wir dafür, dass unsere beiden Container miteinander kommunizieren können. Da eigentlich nur PHP auf MySQL zugreifen können muss können wir den MySQL Container einfach in den PHP Container linken. Dafür verändern wir den Befehl um PHP auszuführen einfach ein klein wenig:

Der einzig neue Teil des Befehls ist der Link –link=mysql:mysql. Dieser sorgt – wie bei Nginx – einfach dafür, dass der MySQL Container innerhalb des PHP Containers unter dem Hostnamen mysql erreichbar ist.

Nun können wir unsere application/index.php abändern:

Führen wir diese Datei aus sehen wir… einen Fehler! Driver not found.
Das heißt ganz einfach, dass der passende PDO Treiber für PHP nicht in unserem Container installiert ist. Glücklicherweise können wir das in unserem Dockerfile ganz simpel ändern.

 

 

PDO für PHP installieren

Wir ändern also php/Dockerfile ein klein wenig ab.

Die markierte Zeile ist einfach zu erklären. RUN führt den angegebenen Befehl aus. Wir updaten also apt-get um die aktuellste Software zu bekommen. Danach installieren wir mit der Hilfsfunktion docker-php-ext-install PDO.

Führen wir also nun unseren docker build Befehl neu aus, starten die Container neu und refreshen die Seite und schon funktioniert das Herstellen der Verbindung.

Leider gibt es ein weiteres Problem mit unserem Container. Stoppen und löschen wir den MySQL Container und starten ihn danach neu sind plötzlich alle Daten weg und die Datenbank ist wieder leer. Das ist natürlich in der Entwicklung lange nicht so schlimm wie im Livebetrieb, trotzdem wollen wir natürlich nicht jedes mal die Datenbank komplett neu erzeugen müssen, wenn wir den Computer neu starten.

Lösen wir dieses Problem nun auch noch.

 

 

Datenbank persistent halten

Um die Daten persistent zu halten benötigen wir auch hier wieder ein Volume. Diese Daten benötigen wir allerdings natürlich nicht in unserem Entwicklungsverzeichnis, also lassen wir uns von Docker helfen. Beginnen wir damit, ein Volume anzulegen.

Der local-Treiber sagt einfach, dass die Daten auf der Festplatte abgelegt werden. Mit der –name Flag geben wir dem Volume wieder einen lesbaren Namen, genau wie bei Containern.

Nun sagen wir MySQL noch, dass MySQL dieses Volume auch verwendet. Dafür stoppen wir den Container, entfernen ihn und starten ihn mit folgendem Befehl neu:

Wieder hat sich nur eine Kleinigkeit geändert, nämlich der Parameter -v mysqldata:/var/lib/mysql. Das teilt Docker mit, dass wir den Ordner /var/lib/mysql (wo MySQL seine Daten abspeichert) bitte mit dem Volume mysqldata (welches wir zuvor angelegt haben) verbinden wollen. Löschen wir nun den Container und starten ihn mit denselben Befehlen neu sind unsere Daten weiterhin vorhanden.

 

Und schon ist unsere lokale Docker Entwicklungsumgebung bereit zum Einsatz. Wir haben einen Webserver der PHP Dateien ausführen kann sowie eine Datenbank, die Daten speichern kann. In den nächsten Artikeln verbessern wir diese Umgebung natürlich noch weiter, machen sie einfacher benutzbar, fügen neue Teile hinzu etc – stell also sicher, dass du regelmäßig vorbei schaust.

Sind noch Fragen zu dieser Entwicklungsumgebung (oder auch gerne Anregungen und Vorschläge), lass sie mich gerne in den Kommentaren wissen!

 

 

Downloads

Auch hier gibt es wieder alle Dateien gesammelt zum Download damit du direkt loslegen kannst: docker-nginx-php-mysql.zip jetzt runterladen

Schreibe einen Kommentar

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

*