Warum jeder PHP-Entwickler Docker beherrschen sollte?
\n\nHaben Sie schon einmal die Situation erlebt, in der lokal alles einwandfrei funktioniert, aber auf dem Server ein „weißer Bildschirm des Todes“ erscheint? Oder noch schlimmer, wenn ein Kollege sagt: „Bei mir funktioniert alles, aktualisiere composer“ – und Ihr Projekt verwandelt sich in einen Kürbis? Kommt Ihnen das bekannt vor? Dann willkommen in der Welt der Containerisierung von PHP-Anwendungen mit Docker.
\n\nDocker ist nicht nur ein modisches Buzzword. Es ist ein Werkzeug, das Ihre Herangehensweise an die Entwicklung für immer verändern wird. Stellen Sie sich vor: Sie verschwenden keine Stunden mehr mit der Einrichtung der Umgebung. Sie müssen kein XAMPP, OpenServer installieren oder sich mit PHP-Versionen herumplagen. Ein docker-compose up – und Ihre Anwendung lebt in einer isolierten, vorhersagbaren Welt. Und diese Welt können Sie an Kollegen weitergeben, auf einen Server hochladen oder sogar an Kunden verkaufen. In diesem Artikel werden wir die Containerisierung von PHP-Anwendungen von A bis Z durchgehen: vom grundlegenden Dockerfile bis zur Produktionsoptimierung.
Was ist Containerisierung und warum ist sie für PHP wichtig?
\n\nContainerisierung ist eine Methode, um eine Anwendung zusammen mit all ihren Abhängigkeiten (PHP, Erweiterungen, Webserver, Datenbank) in eine isolierte Umgebung – einen Container – zu verpacken. Im Gegensatz zu virtuellen Maschinen sind Container leichtgewichtig, starten in Sekundenschnelle und verbrauchen minimale Ressourcen.
\n\nFür PHP ist dies besonders relevant. Warum? Weil eine typische PHP-Anwendung eine Kombination aus PHP-FPM, Nginx oder Apache, MySQL/PostgreSQL, Redis und einer Aufgabenwarteschlange ist. Die manuelle Einrichtung dieses Ökosystems auf jedem Rechner ist die Hölle. Mit Docker beschreiben Sie die gesamte Infrastruktur als Code (Infrastructure as Code) und reproduzieren sie mit einem einzigen Befehl.
\n\nDie wichtigsten Vorteile der Containerisierung für PHP-Entwickler:
\n- \n
- Einheitlichkeit der Umgebungen: lokale Umgebung = Staging = Produktion. Vergessen Sie „bei mir funktioniert es“. \n
- Isolation von Abhängigkeiten: Ein Projekt mit PHP 7.4 koexistiert problemlos mit einem Projekt mit PHP 8.3 auf demselben Host-Computer. \n
- Schnelle Bereitstellung: Pushen Sie einfach das Image in die Registry und aktualisieren Sie den Container auf dem Server. \n
- Skalierbarkeit: Fügen Sie bei Bedarf einfach einen weiteren Container mit PHP-FPM hinzu. \n
Erstellen des ersten Dockerfiles für eine PHP-Anwendung
\n\nBeginnen wir mit dem Wichtigsten – dem Dockerfile. Dies ist die Anleitung zum Erstellen des Images Ihrer Anwendung. Nehmen wir an, wir haben eine einfache PHP-Anwendung mit Laravel oder Symfony (das Prinzip ist für jedes Framework gleich).
# Verwenden des offiziellen PHP 8.2-Images mit FPM\nFROM php:8.2-fpm-alpine\n\n# Installieren von Systemabhängigkeiten\nRUN apk add --no-cache \\\n nginx \\\n supervisor \\\n libpng-dev \\\n libjpeg-turbo-dev \\\n freetype-dev \\\n && docker-php-ext-configure gd --with-freetype --with-jpeg \\\n && docker-php-ext-install -j$(nproc) pdo_mysql gd opcache\n\n# Kopieren der Konfigurationen\nCOPY ./docker/nginx.conf /etc/nginx/http.d/default.conf\nCOPY ./docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf\nCOPY ./docker/php.ini /usr/local/etc/php/conf.d/custom.ini\n\n# Installieren von Composer\nCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer\n\n# Kopieren des Anwendungsquellcodes\nCOPY . /var/www/html\nWORKDIR /var/www/html\n\n# Installieren der PHP-Abhängigkeiten\nRUN composer install --no-dev --optimize-autoloader\n\n# Berechtigungen\nRUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache\n\nEXPOSE 80\n\nCMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]\n\nIm Detail erklärt:
\n- \n
FROM php:8.2-fpm-alpine– Verwenden eines leichten Images basierend auf Alpine Linux. Es wiegt ~50 MB statt 200+ MB bei Desktop-Images. \n docker-php-ext-install– Der magische Befehl zum Installieren von PHP-Erweiterungen direkt im Container. \n COPY --from=composer:latest– Multi-Stage-Build. Wir nehmen die fertige Composer-Binärdatei aus dem offiziellen Image, ohne PHP separat zu installieren.