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

8 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

  2. Ich hab leider ein Problem beim build des php Images aus dem Dockerfile:
    Docker PHP aus einem Dockerfile

    FROM php:7.1-fpm

    MAINTAINER Frank Tiersch

    CMD [„php-fpm“]

    Step 2/3 : MAINTAINER Frank Tiersch
    Invalid signal: SIGQUIT

    Ich bin neu bei Linux und Docker. Was kann ich gegen den Fehler tun? Das Image wird nicht erstellt. CMD [„php“] geht auch nicht.

    • Hallo Chris,

      den Fehler hab ich leider auch noch nie gesehen. Bin selbst mehr in der Windows Welt unterwegs.

      Hast du mal ein anderes php Image probiert? vll php:7.2-fpm

      Viele Grüße
      Frank

      • Also es wird noch besser:
        Ich hab die Dockerfile auf
        FROM php:7.2-fpm

        CMD [„php-fpm“]

        runtergebrochen. Selbe Fehler. Ich hab bei Docker-Desktop mal den Experimental Modus ausgemacht, weil es dann viel eher nicht ging. Dann hieß es „OS is not supported“ Darauf hin hab ich es wieder umgestellt. Ich hab dann noch ein weiteres Experiment gemacht und in die Dockerfile nur das hier geschrieben:
        FROM php:7.1-fpm

        EXPOSE 9000

        hab es gespeichert und CMD gleich mal weggelassen. Selbe Fehler wie am Anfang.

      • PS: Nicht auf die letzte Nachricht antworten, von wegen OS is not supported. Beim ausschalten von Experimental hat er meine ganzen Images runtergeworfen

  3. Images wieder da! Docker Desktop macht da offenbar ein großen Unterschied zwischen experimental und stable. Der Fehler ist geblieben. Anscheinend funktioniert der Dämon nicht mehr. restart vom Computer half nicht.

    Vllt mal ein wenig zur Umgebung. Ich versuch es möglichst manuell durchzuziehen um erstmal Fehler auszugrenzen. Es läuft eigentlich nur Docker Desktop auf Windows 10 Pro x64. Kein Git oder sonst was. Nebenbei gibs noch xampp mit nem lokalen webserver druf; Modul Apache und MySQLAdmin läuft. Bei meinen kleinen Experimenten mit Docker funktionierten die Requests per Browser aber ganz normal.

    PS: Vielen Dank für die schnellen Antworten. Ihr Tutorial fand ich richtig gut. Vielleicht sollten wir direkt per Email schreiben. Das würde es vllt einfacher machen oder… sie kennen ein gutes Forum. Am besten deutsch

Schreibe einen Kommentar

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

*