Docker und PHP: Fortgeschrittene Techniken zur Containerisierung von Anwendungen

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

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.json und composer.lock vor dem Kopieren des Codes kopieren.
  • composer install vor 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 --optimize


Tipp: 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                

Blogs

Buchempfehlungen