Docker und PHP: Containerisierung von Anwendungen auf fortgeschrittenem Niveau
\n\nDie 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\n1. Multi-Stage-Builds für PHP
\n\nMulti-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.
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\nWichtigste 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).
2. Optimierung der Größe von Docker-Images für PHP
\n\nKleine 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-alpinewiegt ~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 deleteundapk del .build-deps. \n - Verwenden Sie
.dockerignore. Schließen Sie.git,node_modules,tests,.envund andere unnötige Dateien aus. \n
Beispiel für eine fortgeschrittene .dockerignore-Datei:
.git\n.gitignore\n.env\n.env.example\nnode_modules\ntests\nstorage/logs/*\n!storage/logs/.gitkeep\ndocker-compose.yml\nMakefile\nREADME.md\n\n3. Docker Compose für komplexe PHP-Projekte
\n\nFür PHP-Anwendungen, die Datenbanken, Warteschlangen, Caches und Webserver verwenden, wird docker-compose.yml zur zentralen Konfigurationsdatei. Fortgeschrittene Einstellungen umfassen:
- \n
- Netzwerke (networks): Isolieren Sie Dienste (z. B. sollte die Datenbank nicht von außen erreichbar sein). \n
- Volumes (volumes):<