Klassische Tools wie XAMPP oder MAMP haben lange als Standard für lokale PHP Entwicklung gedient. Docker bietet jedoch eine modernere Alternative, die Projekte in isolierten Containern ausführt und so Konflikte zwischen verschiedenen PHP Versionen oder Extensions zuverlässig vermeidet. Dieses Tutorial zeigt, wie sich eine vollständige PHP Entwicklungsumgebung mit Docker aufsetzen lässt, vom offiziellen PHP Docker Image über das Dockerfile bis hin zu Docker Compose mit Nginx und MySQL.

Den Ausgangspunkt bildet das offizielle PHP Image auf Docker Hub, das in mehreren Varianten für unterschiedliche Einsatzzwecke bereitsteht.
Das offizielle PHP Docker Image
Auf Docker Hub stellt PHP ein offizielles Image bereit, das in drei Hauptvarianten verfügbar ist. Die Wahl der richtigen Variante bestimmt, wie der Container später arbeitet.
/* Die drei Hauptvarianten des PHP Images */
docker pull php:8.4-cli
docker pull php:8.4-fpm
docker pull php:8.4-apache
Die Variante cli eignet sich für Kommandozeilenskripte und Cronjobs. Die Variante fpm stellt PHP als FastCGI Process Manager bereit und benötigt einen separaten Webserver wie Nginx. Die Variante apache bringt den Apache Webserver bereits mit und ist damit die einfachste Lösung für den Einstieg. Alle Varianten existieren zusätzlich als Alpine Builds, die deutlich kleiner ausfallen, aber bei manchen Extensions die Paketinstallation über apk statt apt-get erfordern.
Dockerfile für PHP erstellen
Ein Dockerfile definiert, wie das Image aufgebaut wird. Es legt das Basis Image fest, installiert Extensions und kopiert den Quellcode in den Container.
/* Einfaches Dockerfile mit Apache */
FROM php:8.4-apache
RUN docker-php-ext-install pdo pdo_mysql
COPY ./src /var/www/html/
EXPOSE 80
Der Befehl docker-php-ext-install ist das Standardwerkzeug für Core Extensions. Er kompiliert und aktiviert die angegebenen Module automatisch. Nach dem Erstellen lässt sich das Image mit docker build -t mein-php-app . bauen und mit docker run -p 8080:80 mein-php-app starten.
PHP Extensions hinzufügen
Viele PHP Projekte benötigen Extensions wie GD für Bildverarbeitung oder Xdebug zum Debuggen. Core Extensions werden über docker-php-ext-install installiert, während PECL Extensions einen separaten Installationsweg nutzen.
/* Dockerfile mit GD, Redis und Xdebug */
FROM php:8.4-fpm
RUN apt-get update && apt-get install -y
libfreetype-dev
libjpeg62-turbo-dev
libpng-dev
&& docker-php-ext-configure gd
--with-freetype --with-jpeg
&& docker-php-ext-install -j$(nproc) gd pdo pdo_mysql
RUN pecl install redis xdebug
&& docker-php-ext-enable redis xdebug
Der Befehl docker-php-ext-configure erlaubt es, Kompilierungsoptionen für Extensions wie GD zu setzen. PECL Extensions wie Redis und Xdebug werden zunächst über pecl install heruntergeladen und anschließend mit docker-php-ext-enable aktiviert. Ein PHP Skript im Container kann die verfügbaren Extensions prüfen.
<?php
$extensions = get_loaded_extensions();
$erforderlich = ['gd', 'pdo_mysql', 'redis', 'xdebug'];
foreach ($erforderlich as $ext) {
$status = in_array($ext, $extensions) ? 'geladen' : 'fehlt';
echo $ext . ': ' . $status . PHP_EOL;
}
/*
gd: geladen
pdo_mysql: geladen
redis: geladen
xdebug: geladen
*/
Docker Compose für PHP Projekte
In der Praxis besteht eine Entwicklungsumgebung aus mehreren Diensten. Docker Compose ermöglicht es, PHP, einen Webserver und eine Datenbank gemeinsam zu starten und zu verwalten.
Das folgende Diagramm zeigt den Aufbau eines typischen Multi Container Setups.
flowchart LR
A["Dockerfile"] --> B["PHP-FPM Container"]
D["docker-compose.yml"] --> B
D --> E["Nginx Container"]
D --> F["MySQL Container"]
B <--> E
B <--> F
Die zugehörige docker-compose.yml bringt alle drei Dienste zusammen.
/* docker-compose.yml */
services:
php:
build: .
volumes:
- ./src:/var/www/html
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: geheim
MYSQL_DATABASE: app
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
Mit docker compose up startet die gesamte Umgebung. Die Volumes sorgen dafür, dass Änderungen am Quellcode im src Verzeichnis sofort im Container sichtbar werden. Das benannte Volume db_data persistiert die Datenbankdaten über Container Neustarts hinweg.
Von XAMPP zu Docker wechseln
Der Umstieg von XAMPP oder MAMP auf Docker bringt mehrere Vorteile mit sich. Jedes Projekt kann eine eigene PHP Version und individuelle Extensions nutzen, ohne dass globale Konfigurationen kollidieren. Die gesamte Umgebung ist im Dockerfile und in der docker-compose.yml dokumentiert und lässt sich von jedem Teammitglied identisch reproduzieren. Zudem spiegelt ein Docker Setup die Produktionsumgebung deutlich besser wider als ein klassisches lokales Setup.
<?php
$info = [
'php_version' => phpversion(),
'server_api' => php_sapi_name(),
'extensions' => count(get_loaded_extensions()),
'docker' => file_exists('/.dockerenv') ? 'ja' : 'nein'
];
foreach ($info as $key => $value) {
echo $key . ': ' . $value . PHP_EOL;
}
/*
php_version: 8.4.0
server_api: fpm-fcgi
extensions: 42
docker: ja
*/
Die Funktion file_exists('/.dockerenv') ist ein einfacher Weg, um zu erkennen, ob das Skript innerhalb eines Docker Containers läuft. So lassen sich umgebungsabhängige Konfigurationen direkt im Code steuern.
Fazit
Docker ersetzt klassische Tools wie XAMPP durch eine flexible, reproduzierbare Entwicklungsumgebung. Das offizielle PHP Image auf Docker Hub bietet mit den Varianten cli, fpm und apache eine passende Basis für jeden Einsatzzweck. Extensions lassen sich über docker-php-ext-install und PECL installieren, und Docker Compose vereinfacht den Betrieb von PHP zusammen mit Nginx und MySQL. Wer einmal mit Docker arbeitet, wird die isolierten und portablen Container nicht mehr missen wollen.