Docker und PHP: Containerisierung von Anwendungen auf fortgeschrittenem Niveau
Die Containerisierung von PHP-Anwendungen mit Docker ist längst nicht mehr nur ein praktisches Werkzeug für die Entwicklung. Auf fortgeschrittenem Niveau ist sie der Schlüssel zur Erstellung skalierbarer, sicherer und reproduzierbarer Umgebungen. In diesem Artikel behandeln wir Techniken, die Ihnen helfen, vom einfachen Start eines PHP-Containers zur professionellen Orchestrierung überzugehen: Multi-Stage-Builds, Image-Optimierung, Arbeit mit Docker Compose für eine Microservice-Architektur und fortgeschrittenes Caching.
1. Multi-Stage-Build: Minimales finales Image
Eines der Hauptprobleme standardmäßiger Docker-Images ist ihre Größe. Das Basis-Image php:8.2-apache wiegt über 400 MB, mit installierten Erweiterungen sogar 600+. Für die Produktion ist das inakzeptabel: Ein großes Image lädt langsamer, belegt Platz in der Registry und vergrößert die Angriffsfläche.
Ein Multi-Stage-Build ermöglicht es, den Prozess in Phasen zu unterteilen: eine für die Kompilierung und Installation von Abhängigkeiten (mit vollständigem Werkzeugsatz), eine zweite für die minimale Laufzeitumgebung. Das finale Image enthält nur die kompilierten Artefakte und notwendigen Bibliotheken.
Beispiel eines Dockerfile für eine Laravel-Anwendung:
# Phase 1: Kompilierung und Installation von AbhängigkeitenFROM composer:latest AS vendorWORKDIR /appCOPY composer.json composer.lock ./RUN composer install --no-dev --optimize-autoloader --no-interaction
# Phase 2: Build der Node-Ressourcen (falls Frontend vorhanden)FROM node:18-alpine AS frontendWORKDIR /appCOPY package.json package-lock.json ./RUN npm ci --productionCOPY resources/ ./resources/RUN npm run production
# Phase 3: Finales PHP-ImageFROM php:8.2-fpm-alpine AS productionRUN docker-php-ext-install pdo_mysql opcacheCOPY --from=vendor /app/vendor /var/www/html/vendorCOPY --from=frontend /app/public/build /var/www/html/public/buildCOPY . /var/www/html
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cacheEXPOSE 9000CMD ["php-fpm"]Dieser Ansatz reduziert die Image-Größe von 500+ MB auf ~120 MB. composer:latest und node:18-alpine werden nur in den Build-Phasen verwendet und gelangen nicht in die finale Schicht.
2. Optimierung des Docker-Layer-Cachings
Jede Anweisung in einem Dockerfile erzeugt einen Layer. Um wiederholte Builds zu beschleunigen, sollten sich selten ändernde Layer so früh wie möglich positioniert werden. Für ein PHP-Projekt bedeutet das:
composer.jsonundcomposer.lockvor dem Kopieren des Codes kopieren.composer installvor dem Kopieren der Quelltexte ausführen.- Den Code als Letztes kopieren.
Beispiel einer optimierten Reihenfolge der Anweisungen:
FROM php:8.2-fpm-alpine AS baseWORKDIR /var/www/html
# Systemabhängigkeiten einmal installierenRUN apk add --no-cache $PHPIZE_DEPS \ && docker-php-ext-install pdo_mysql opcache bcmath
# Nur die Abhängigkeitsdateien kopierenCOPY composer.json composer.lock ./RUN composer install --no-dev --no-interaction --no-scripts --prefer-dist
# Restlichen Code kopierenCOPY . .
# Autoload generieren und optimierenRUN composer dump-autoload --optimizeTipp: Verwenden Sie .dockerignore, um vendor, .git, node_modules und andere temporäre Dateien aus dem Build-Kontext auszuschließen. Dies beschleunigt die Übergabe des Kontexts an den Docker-Daemon.
3. Docker Compose für Microservice-Architektur
Moderne PHP-Anwendungen bestehen selten aus nur einem Service. Eine typische Architektur umfasst PHP-FPM, Nginx, Redis, eine Aufgabenwarteschlange (RabbitMQ/Beanstalkd) und eine Datenbank. Docker Compose ermöglicht es, die gesamte Infrastruktur in einer einzigen docker-compose.yml zu beschreiben.
Beispiel einer Konfiguration für einen Microservice in PHP:
version: '3.8'services: app: build: context: . target: production