Docker für PHP-Entwickler: Der vollständige Leitfaden zur Containerisierung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Ihr PHP-Projekt Docker verdient

\n\n

Haben Sie schon einmal einen halben Tag damit verbracht, einem neuen Entwickler zu erklären, wie man die Umgebung einrichtet? Oder waren Sie mit der Situation konfrontiert, dass Code auf Ihrem localhost funktioniert, aber auf dem Server abstürzt? Kommt Ihnen bekannt vor? Dann ist dieser Artikel genau das Richtige für Sie.

\n\n

Docker ist nicht nur ein modisches Buzzword. Es ist ein Werkzeug, das den Satz „Bei mir funktioniert es“ in „Es funktioniert bei allen“ verwandelt. Für einen PHP-Entwickler ist die Containerisierung eine Superkraft: Sie verpacken die Anwendung, den Webserver und die Datenbank in leichte Container, die sich auf jeder Maschine garantiert gleich verhalten.

\n\n

In diesem Leitfaden werden wir keine langweilige Theorie lesen. Wir kommen sofort zur Sache: Wir schreiben ein Dockerfile für PHP, richten die Kombination Nginx + PHP-FPM + MySQL mit Docker Compose ein und stellen eine echte Anwendung bereit. Schwupps – und Ihr Projekt ist bereit für das Deployment!

\n\n

Was ist Containerisierung und warum braucht ein PHP-Entwickler sie?

\n\n

Stellen Sie sich vor, Sie ziehen in eine neue Wohnung. Anstatt jedes Mal die Möbel neu zusammenzubauen (PHP installieren, Apache konfigurieren, Module hinzufügen), nehmen Sie einfach eine fertige Kiste mit Ihrer Umgebung. Docker sind solche Kisten. Sie heißen Container.

\n\n

Für PHP ist das besonders relevant. PHP-Versionen ändern sich, verschiedene Erweiterungen werden benötigt (gd, mysqli, redis), und in der Produktion muss alles stabil sein. Die Containerisierung löst drei Hauptprobleme:

\n
    \n
  • Reproduzierbarkeit – die Umgebung ist für alle gleich: Entwickler, Tester, Server.
  • \n
  • Isolation – Projekte geraten nicht in Konflikt (Ihre alte Website wird nie wieder aufgrund eines PHP-Updates kaputtgehen).
  • \n
  • Einfaches Deployment – Start mit einem Befehl docker-compose up.
  • \n
\n\n

Dockerfile für die PHP-Anwendung vorbereiten

\n\n

Beginnen wir mit dem Wichtigsten – der Erstellung des Images für unser PHP-Projekt. Nehmen wir an, wir haben eine einfache Anwendung mit PHP 8.2, die PDO für die Arbeit mit MySQL verwendet. So sieht ein minimales Dockerfile aus:

\n\n
# Verwende das offizielle PHP 8.2-Image mit FPM\nFROM php:8.2-fpm-alpine\n\n# Installiere notwendige Systempakete\nRUN apk add --no-cache \\\n    nginx \\\n    supervisor \\\n    libpq-dev \\\n    && docker-php-ext-install pdo pdo_mysql\n\n# Kopiere Konfigurationen (wir werden sie später erstellen)\nCOPY ./docker/nginx.conf /etc/nginx/nginx.conf\nCOPY ./docker/supervisord.conf /etc/supervisord.conf\n\n# Kopiere den Anwendungscode\nCOPY . /var/www/html\n\n# Schreibrechte für Logs und Cache\nRUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache\n\n# Öffne Ports\nEXPOSE 80\n\n# Starte Supervisor (er verwaltet nginx und php-fpm)\nCMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
\n\n

Was ist hier wichtig? Wir verwenden die Alpine-Version – sie wiegt um ein Vielfaches weniger. Wir installieren nur die benötigten Erweiterungen über docker-php-ext-install. Und ja, wir verwenden Supervisor, damit innerhalb eines Containers sowohl Nginx als auch PHP-FPM laufen. Das ist praktisch für kleinere Projekte.

\n\n

Nginx-Konfiguration erstellen

\n\n

Jetzt müssen wir den Webserver konfigurieren. Erstellen Sie die Datei docker/nginx.conf:

\n\n
worker_processes auto;\nevents {\n    worker_connections 1024;\n}\n\nhttp {\n    include /etc/nginx/mime.types;\n    default_type application/octet-stream;\n\n    server {\n        listen 80;\n        server_name _;\n        root /var/www/html/public;\n        index index.php index.html;\n\n        location / {\n            try_files $uri $uri/ /index.php?$query_string;\n        }\n\n        location ~ \\.php$ {\n            fastcgi_pass 127.0.0.1:9000;\n            fastcgi_index index.php;\n            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n            include fastcgi_params;\n        }\n    }\n}
\n\n

Beachten Sie: PHP-FPM hört auf Port 9000 innerhalb des Containers.

Blogs

Buchempfehlungen