Docker Entwicklungsumgebung unter Windows – Teil 3: PHP7

Aktuell haben wir in der Artikelserie bereits den Webserver zum Laufen gekriegt. Dafür mussten wir nur einen einzelnen Container verwalten. Ein Grundsatz von Docker ist das Auslagern von einzelnen Tasks in eigene Container. In diesem Artikel erweitern wir also nun unsere Entwicklungsumgebung um ein dockerisiertes PHP7 und sorgen dafür, dass wir PHP Scripts über unseren Nginx aufrufen können.

Das Docker PHP7 Image

Auch von PHP gibt es diverse offizielle Docker PHP Images, die wir praktischerweise verwenden können. Zum Testen können wir einfach mal folgenden Befehl ausführen:

Sezieren wir den Befehl (docker run kennen wir bereits, das lasse ich also ab sofort aus).

  • –rm – die rm Flag sorgt dafür, dass der Container nach der Ausführung automatisch gelöscht wird. Andernfalls müllen wir unseren Computer mit unzähligen ungenutzten Containern voll, wenn wir nur Dinge ausprobieren
  • php:7.1-fpm – wir wollen eine bestimmte Version des offiziellen PHP Images. Dafür wählen wir einen bestimmten Tag aus, in diesem Fall Version 7.1 als fpm Version
  • php -v – zum Testen ob es funktioniert führen wir einfach einen Befehl aus – und zwar den PHP Befehl mit dem -v Parameter was uns die verwendete PHP Version ausgibt (nämlich 7.1)

 

Struktur unserer Docker Entwicklungsumgebung

Da wir mehrere Images verwenden ist eine etwas andere Verzeichnisstruktur angebracht. Folgende Verzeichnisse wird unser Projekt am Ende haben:

  • nginx – das nginx Verzeichnis enthält alles für unseren Webserver: Dockerfile, Configdateien etc
  • php – für PHP gilt dasselbe, auch hier packen wir Dockerfile und Configdateien in ein Extraverzeichnis
  • mysql – und nochmal: Dockerfile etc auch hier
  • application – endlich was neues: In das app Verzeichnis packen wir die Daten unserer Applikation, also unsere PHP Dateien

 

 

Docker PHP aus einem Dockerfile

Selbes Prinzip wie bei Nginx. Wir legen ein neues Dockerfile in unserem PHP Ordner mit folgendem Inhalt an:

Hier ist nicht wirklich etwas neues. Builden wir nun das Image mit

können wir dasselbe Ergebnis wie oben mit folgendem Befehl erhalten:

Und schon ist unser PHP7 aus einem Dockerfile erzeugt. Widmen wir uns dem nächsten Schritt: Unsere PHP Konfiguration!

 

PHP7 konfigurieren und für Nginx bereit machen

Zwei kleine Änderungen müssen wir in unserem Dockerfile allerdings noch einbauen, damit es dann für die Verbindung mit dem Nginx Container fit ist. Das finale Dockerfile sieht dann so aus:

Zuerst schalten wir den Port 9000 für die Verbindung aus anderen Containern frei, da dieses der Standardport ist, auf den php-fpm nach Anfragen lauscht.
Dann fügen wir noch unserem Befehl am Ende den Parameter –nodaemonize zu, da ansonsten der Container nach dem erfolgreichen Start – genau wie bei Nginx – automatisch wieder beendet wird was ja nicht in unserem Sinn ist.

 

 

Nginx PHP tauglich machen

Nun da wir funktionierende Container haben müssen wir noch dafür sorgen, dass diese auch zusammenarbeiten. Zuerst ändern wir dabei unsere nginx/default.conf ab um PHP zu ermöglichen. Hier ist eine einfache Grundversion einer Nginx Konfiguration.

Hier ist vor allem die Zeile mit fastcgi_pass php:9000; zu beachten. Hier legen wir fest, wo PHP Requests hingeschickt werden. php ist dabei der Hostname, das gilt es später noch zu beachten. Port 9000 ist der Standard für php-fpm wie oben erwähnt.

 

Alle Container starten und miteinander verbinden

Nun da unsere Container bereit sind müssen wir sie noch starten. Fangen wir mit PHP an. Wir verwenden folgenden Befehl:

  • –name=php – sorgt dafür, dass unser Container den Namen php bekommt. Dadurch können wir ihn später einfacher ansprechen was beim Starten des Nginx Containers noch wichtig wird.
  • -v /$(pwd)/application:/usr/share/nginx/html – auch hier müssen wir unseren application Ordner freigeben, da ansonsten unsere PHP Dateien nur im Nginx Container verfügbar sind, PHP aber nicht auf sie zugreifen kann.

 

 

Ein kurzer Blick auf docker ps sollte unseren laufenden PHP Container zeigen. Wenn alles passt machen wir weiter und starten den Nginx Container.

  • –name=nginx – auch hier geben wir dem Container einen Namen, das macht es einfacher
  • –link=php:php – ein wichtiger Teil für unsere Zwecke. Damit Nginx mit PHP kommunizieren kann müssen wir die Container verlinken. Dadurch wird eine Verbindung zwischen den Containern hergestellt und Nginx kann PHP Requests an php-fpm schicken. Der Teil vor dem Doppelpunkt ist dabei der Name des anderen Containers (oben durch das –name=php vergeben). Der zweite Teil ist der Hostname innerhalb des PHP Containers unter dem der Container erreicht werden kann. Das ist der Name php:9000 in der Nginx Konfiguration

 

Legen wir jetzt noch eine index.php Datei im Ordner application an können wir im Browser http://localhost aufrufen und sollten das Ergebnis direkt im Browser sehen.

 

Wieder ein Schritt geschafft. Im nächsten Artikel bringen wir dann MySQL noch in die Umgebung um das magische Trio der Webentwicklung zu vervollständigen.

 

Downloads

Auch hier wieder die gesammelten erwähnten Dateien damit ihr direkt loslegen könnt! docker-nginx-php.zip jetzt herunterladen

2 Kommentare zu “Docker Entwicklungsumgebung unter Windows – Teil 3: PHP7

  1. Jetzt wäre es noch interessant zu wissen, wie wir aus dem Container auf eine lokale Domain zugreifen können 🙂

    Z.B. habe ich eine lokale Domain test.local in meiner Host Datei die auf 127.0.0.1 zeigt. Innerhalb des Docker Containers kann ich darauf nicht zugreifen, wie ginge das? Pakete wie Snappy zur PDF Erzeugung stützen sich darauf.

    Danke für die gut gemachte Serie 🙂

    • Hi Bernd,

      puh, das ist eine gute Frage, Snappy hab ich lokal zuletzt zu Vagrant Zeiten gebraucht. Allerdings steht das bei mir auch bald an, wenn ich das dann rausgefunden habe schreibe ich dazu einfach auch wieder einen Artikel.
      Wenn du in der Zwischenzeit die Lösung findest freu ich mich natürlich wenn du mir die Sucharbeit ersparst. 😉

      Viele Grüße und vielen Dank fürs Kompliment!
      Frank

Schreibe einen Kommentar

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

*