Docker und PHP: Containerisierung von Anwendungen auf fortgeschrittenem Niveau

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

\n\n

Die Containerisierung mit Docker ist längst zum Standard für die Entwicklung und Bereitstellung von PHP-Anwendungen geworden. Grundkenntnisse – einen Container mit PHP und Nginx starten – sind nur der erste Schritt. Auf fortgeschrittenem Niveau sind die Konfiguration von Multi-Stage-Builds, die Optimierung der Image-Größe, die Arbeit mit mehreren Diensten, die Verwaltung von Umgebungsvariablen, die Integration in CI/CD und der Aufbau einer Microservice-Architektur erforderlich. In diesem Artikel behandeln wir die wichtigsten Techniken, die Ihnen helfen, die Containerisierung von PHP auf die nächste Stufe zu heben.

\n\n

1. Multi-Stage-Builds für PHP

\n\n

Multi-Stage-Builds ermöglichen die Verwendung mehrerer FROM-Anweisungen in einem einzigen Dockerfile. Dies ist ideal für PHP-Anwendungen, bei denen in der Build-Phase Composer, Node.js und andere Tools benötigt werden, aber nur die kompilierten Dateien und ein minimaler Satz an Abhängigkeiten in das finale Image gelangen sollen.

\n\n

Beispiel eines Dockerfiles für eine Laravel-Anwendung mit Multi-Stage-Build:

\n\n
# Stufe 1: Abhängigkeiten installieren und bauen\nFROM composer:2.5 AS vendor\nWORKDIR /app\nCOPY composer.json composer.lock ./\nRUN composer install --no-dev --optimize-autoloader --no-interaction\n\nFROM node:18 AS frontend\nWORKDIR /app\nCOPY package.json package-lock.json ./\nRUN npm ci --only=production\nCOPY resources/ ./resources/\nRUN npm run production\n\n# Stufe 2: Finales Image\nFROM php:8.2-fpm-alpine3.18 AS final\nWORKDIR /var/www/html\n\n# Installation der notwendigen PHP-Erweiterungen\nRUN apk add --no-cache \\\n        libpng-dev \\\n        libjpeg-turbo-dev \\\n        freetype-dev \\\n        libzip-dev \\\n        oniguruma-dev \\\n    && docker-php-ext-configure gd --with-freetype --with-jpeg \\\n    && docker-php-ext-install -j$(nproc) \\\n        pdo_mysql \\\n        mbstring \\\n        gd \\\n        zip \\\n        opcache\n\n# Kopieren nur der notwendigen Dateien aus den vorherigen Stufen\nCOPY --from=vendor /app/vendor/ ./vendor/\nCOPY --from=frontend /app/public/build/ ./public/build/\nCOPY . .\n\n# Optimierung für die Produktion\nRUN php artisan optimize\n\nEXPOSE 9000\nCMD ["php-fpm"]
\n\n

Wichtigste Vorteile:

\n
    \n
  • Das finale Image enthält nur Laufzeitabhängigkeiten (PHP-FPM, Erweiterungen, Code).
  • \n
  • Build-Tools (Composer, Node.js) gelangen nicht in die Produktion.
  • Deutliche Reduzierung der Image-Größe (von 800-900 MB auf 150-200 MB).
\n\n

2. Optimierung der Größe von Docker-Images für PHP

\n\n

Kleine Images werden schneller geladen, benötigen weniger Speicherplatz und verringern die Angriffsfläche. Die wichtigsten Strategien:

\n\n
    \n
  • Verwenden Sie Alpine-Versionen der Basis-Images. php:8.2-fpm-alpine wiegt ~50 MB im Vergleich zu ~400 MB für das Standard-php:8.2-fpm.
  • \n
  • Minimieren Sie die Anzahl der Schichten. Fassen Sie RUN-Befehle mit && zusammen.
  • \n
  • Entfernen Sie temporäre Dateien. Bereinigen Sie nach der Installation von Erweiterungen den Cache: docker-php-source delete und apk del .build-deps.
  • \n
  • Verwenden Sie .dockerignore. Schließen Sie .git, node_modules, tests, .env und andere unnötige Dateien aus.
  • \n
\n\n

Beispiel für eine fortgeschrittene .dockerignore-Datei:

\n\n
.git\n.gitignore\n.env\n.env.example\nnode_modules\ntests\nstorage/logs/*\n!storage/logs/.gitkeep\ndocker-compose.yml\nMakefile\nREADME.md
\n\n

3. Docker Compose für komplexe PHP-Projekte

\n\n

Für PHP-Anwendungen, die Datenbanken, Warteschlangen, Caches und Webserver verwenden, wird docker-compose.yml zur zentralen Konfigurationsdatei. Fortgeschrittene Einstellungen umfassen:

\n\n
    \n
  • Netzwerke (networks): Isolieren Sie Dienste (z. B. sollte die Datenbank nicht von außen erreichbar sein).
  • \n
  • Volumes (volumes):<

Blogs

Buchempfehlungen