Apache2 mit PHP (mod_php) auf Docker mit Compose einrichten

Als Video ansehen
Bereitgestellt über YouTube

Apache2 mit PHP (mod_php) auf Docker mit Compose einrichten

In einem vorherigen Beitrag habe ich eine einfache Apache2-Installation mit den Paketquellen vom Raspberry Pi OS gezeigt, die unter Debian auf x86 Hardware eben so umgesetzt werden kann. Webserver und PHP werden dabei direkt auf dem Pi installiert. Dies hat mehrere Nachteile:

  • Wenig Isolation gegenüber dem Hostsystem
  • Wir sind auf die Paketquellen angewiesen, wo wir tendenziell eher ältere Versionen bekommen
  • Mehrere Versionen parallel zu installieren (z.B. PHP 7 und 8) ist schwierig und kann Konflikte verursachen, auch in Kombination mit anderer Software

Daher macht es Sinn, hierfür Docker zusammen mit Docker-Compose einzusetzen. Beides ist daher Voraussetzung. Wie ihr Docker installiert, habe ich bereits in einem vorherigen Beitrag gezeigt . Auch die Installation von Docker-Compose, womit die Verwaltung insbesondere von mehreren Containern deutlich vereinfacht wird, war bereits in der Vergangenheit Thema.

Welches Basis-Image soll ich für Apache2 mit PHP nehmen?

Wir fokussieren uns hier auf die einfachste Variante mit mod_php. Zwar gibt es Alternativen, die vor allem hinsichtlich der Performance besser abschneiden. Diese sind etwas komplexer und für kleine private Instanzen ist der Unterschied überschaubar, dies schauen wir uns in einem eigenen Beitrag an. Gerade für Einsteiger ist mod_php einfacher, hier genügt ein einzelner Container.

Apache2 stellt das offizielle httpd Image bereit. Dort ist das Modul mod_php jedoch nicht enthalten. Allerdings hilft uns hier PHP, dort stellt man Apache2 zusammen mit mod_php in einem eigenen Tag bereit. Zum Erstellzeitpunkt sind Version 7 und 8 von PHP aktuell, daher machen folgende Tags am meisten Sinn:

  • 7-apache und 7.4-apache
  • 8-apache und 8.1-apache

Natürlich könnte man hier auch den exakten Tag nehmen, etwa derzeit 8.0.12-apache. Gerade bei Webanwendungen macht es jedoch Sinn, nur auf die Haupt- oder Nebenversion zu gehen. So lassen sich (Sicherheits-) Updates einfacher einspielen, da ihr im Grunde nur den Tag (z.B. 8.0-apache) pullen müsst.

Einfache Docker-Compose.yml für Apache2 mit PHP

Erstelle einen Ordner, z.B. apache2-docker und lege darin eine Datei namens docker-compose.yml an. Als Vorlage kannst du folgenden Inhalt hinein kopieren:

version: "2.4"

services:
    apache:
        image: php:8-apache
        restart: always
        ports:
            - 80:80
        volumes:
            - ./www:/var/www/html

Den grundsätzlichen Aufbau einer docker-compose.yml habe ich in diesem Beitrag ausführlicher erklärt. Diese docker-compose.yml unterscheidet sich nur in drei Aspekten davon:

  1. Der Dienst wurde umbenannt und heißt nun apache statt webserver, wobei dies frei wählbar ist.
  2. Wir nutzen ein PHP-Image mit entsprechend angepasstem Tag statt Nginx. Man kann PHP auch zusammen mit Nginx ausliefern lassen, allerdings ist dies etwas komplexer als mit Apache2 – dies schauen wir in einem eigenen Beitrag genauer an.
  3. Unseren www-Ordner als Wurzelverzeichnis für alle auszuliefernden Skripte und andere Dateien wird dem Container nicht in /usr/share/nginx/html bereitgestellt, sondern in /var/www/html. Dies liegt einfach daran, dass Nginx einen anderen Standardpfad verwendet als Apache2.

Nun muss nur noch der Unterordner www angelegt werden. Zum Test macht es Sinn, eine index.php Datei anzulegen, die eine PHPInfo ausgibt. So sehen wir Details zu unserer PHP-Installation.

mkdir www
echo '<?php phpinfo();' > www/index.php

Das Herunterladen des Images sowie das anschließende Erzeugen des Containers übernimmt Docker-Compose mit dem up-Befehl:

docker-compose up -d

Nach Beendigung des Befehles kann man den Hostname oder die IP-Adresse des Pis im Browser gefolgt von einem Slash / eingeben:

So einfach kannst du die PHP-Version wechseln

Möchtest du die PHP-Version wechseln, ist dies mit Docker-Compose ein Kinderspiel: Suche dir einen passenden Tag für die von dir gewünschte Version. In diesem Szenario benötigen wir einen auf -apache endenden Tag. Beispielsweise 7-apache, um die derzeit aktuellste PHP 7 Version zu erhalten. In der docker-compose.yml änderst du diesen entsprechend, hier etwa von 8-apache auf 7-apache. Anschließend lässt du Docker-Compose den Container neu erstellen:

docker-compose up -d

Compose erkennt deine Änderung und lädt das Image herunter, falls nötig. Anschließend wird dein Apache-Container mit der gewünschten Version gestartet. Aktualisierst du nun im Browser die Testseite, steht dir PHP 7 zur Verfügung:

Praktisch, oder? Nützlich ist dies etwa für ein Update: Du hast eine Software, die noch auf PHP 7 läuft. Mit dem PHP 8 Image kannst du testen, ob sie auch mit der neuen Version funktioniert. Und das sogar ohne Ausfallzeit: Du könntest einfach eine zweite docker-compose.yml erstellen und deine Anwendung so duplizieren. Hierfür musst du den Port entsprechend Anpassen oder einen Reverse Proxy verwenden, dies erklären wir an anderer Stelle ausführlicher. So kann in Ruhe die neue Version getestet werden. Klappt alles, wechselst du mit deiner Hauptinstanz ebenfalls nur neuen PHP-Version – oder eben erst später, falls es zu Problemen kommt.

Weitere Schritte

Im www Ordner kannst du nun PHP-Anwendungen bereitstellen oder selbst mit dem Programmieren beginnen. Dafür wirst du in den meisten Fällen MySQL oder eine andere Datenbank benötigen. Diese lässt sich ebenfalls mit Docker-Compose sehr einfach bereitstellen.

Während dies für eine Testinstanz ausreichend ist, solltest du allerdings zusätzliche Sicherheitsmaßnahmen ergreifen, bevor du dies per Internet bereitstellst. Auch das greifen wir in einem eigenen Beitrag auf.

Leave a Reply