Lesedauer 3 Minuten

Heute basteln wir einen Web Application Stack mit Docker-Containern, bestehend aus Apache, PostgreSQL, PHP (inkl. Redis) und PhpPgAdmin. Der Container-Verbund ist modular aufgebaut und so jederzeit mit weiteren Diensten erweiterbar.

Mit geringem Aufwand  kann z.B. ein PostgreSQL Cluster mit Replikation simuliert, oder PostgreSQL 12 und PHP 7.4 gegen andere Versionen getauscht werden. SSL und XDdebug sind unter PHP vorkonfiguriert. Der Stack kann somit für Development oder App Deployment benutzt werden. Zum Einsatz kommen die  Docker Images von Bitnami.

Für unser Projekt benötigen wir die folgende Verzeichnisstruktur:

docker contanier postgres apache php

Da später alle Container mit Docker Compose gestartet werden, erstellen wir zuerst die docker-compose.yml-Datei im Ordner “appp”, neben dem Unterordner “docker”:

Außer PhpPgAdmin benutzen alle Dienste ihre Standard-Ports. Alle wichtigen Daten werden in persistenten Ordnern ausserhalb der Docker-Container gespeichert (Volumes).

Apache

Zuerst generieren wir ein selbst signiertes SSL-Zertifikat und speichern dessen Dateien  im Ordner ./docker/apache/certs:

Für die Apache-Konfiguration legen wir folgende Datei an: ./docker/apache/my_vhost.conf:

Für unsere Website-Daten legen wir noch den Ordner ./docker/www an. In unserem Beispiel liegt hier die Datei info.php mit folgendem Inhalt:

Damit ist Apache samt SSL fertig konfiguriert.

PostgeSQL Server

Für PostgreSQL benötigen wir einen leeren Ordner namens ./docker/postgresq. Nach dem Start des PostgrSQL-Containers, werden in diesem Ordner die Daten des PostgreSQL-Servers erzeugt.

Des weiteren benötigen wir einen Ordner ./docker/postgresql/certs in den wir ebenfalls die im Abschnitt “Apache” erzeugten Zertifikatsdateien kopieren. PostgreSQL ist so konfiguriert, dass alle Datenbank-Verbindungen bei Bedarf verschlüsselt sind.

PHP

Für die PHP-Konfiguration erzeugen wir die Datei ./docker/php/php.ini:

Unter Anderem werden hier die ImageMagick und pdo_pgsql Extensions aktiviert sowie XDebug konfiguriert. PHP ist damit ebenfalls fertiggestellt.

PhpPgAdmin

PhpPgAdmin benötigt keine extra Konfiguration und ist später über die Adresse 127.0.0.1:82 oder :8243 (SSL) erreichbar. Die Anmeldung geschieht mit dem Datenbankbenutzer aus unserer PostgreSQL-Konfiguration.

Alle Docker-Container gleichzeitig starten

Der folgende Befehlt starten nun alle Container gleichzeitig:

Zum Test geben wir im Browser http://127.0.0.1/info.php ein. Wenn wir alles richtig gemacht haben, erscheint nun die PHP-Info Page.

Docker: Zugriff von PHP auf Postgres liefert “Connection refused”

Hier ist folgende Besonderheit zu beachten:
Da ja alle Dienste in getrennten Docker-Containern laufen, wird ein Aufbau des DBConnects mit

nicht funktionieren. Statt dessen ist der Docker-Containername als Hostname zu verwenden:

Solltet Ihr in docker-compose.yaml Port 5432 auf eine andere Portnummer gemapped haben, bleibt es in diesem Fall trotzdem bei 5432, da aus Perspektive des Webservers der interne Port des Containers sichtbar ist.

Nur für Apps, die von außen auf Postgres zugreifen (z.B. Postico, Navicat etc), wäre dann der gemappte Port gültig.

Viel Spaß mit dem neuen Docker Stack :-)

Hat Dir der Beitrag gefallen?

Wenn Du Fragen oder Anmerkungen zu diesem Beitrag hast, dann starte einen Kommentar. DANKE für Dein Feedback!