Docker und PHP: Fortgeschrittene Anwendungscontainerisierung
\n\nDie Containerisierung mit Docker ist längst zum Standard für die Entwicklung und Bereitstellung von PHP-Anwendungen geworden. Grundkenntnisse – das Ausführen eines Containers mit PHP und Nginx – sind nur der erste Schritt. Auf fortgeschrittener Ebene müssen Sie Multi-Stage-Builds konfigurieren, die Image-Größe optimieren, mit mehreren Diensten arbeiten, Umgebungsvariablen verwalten, in CI/CD integrieren und eine Microservice-Architektur aufbauen. In diesem Artikel werden wir die wichtigsten Techniken aufschlüsseln, die Ihnen helfen, die PHP-Containerisierung 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 Composer, Node.js und andere Tools während der Build-Phase benötigt werden, aber nur die kompilierten Dateien und ein minimaler Satz von Abhängigkeiten im finalen Image landen sollen.
Beispiel-Dockerfile für eine Laravel-Anwendung mit Multi-Stage-Builds:
\n\n# Stage 1: Install dependencies and build\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# Stage 2: Final image\nFROM php:8.2-fpm-alpine3.18 AS final\nWORKDIR /var/www/html\n\n# Install required PHP extensions\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# Copy only necessary files from previous stages\nCOPY --from=vendor /app/vendor/ ./vendor/\nCOPY --from=frontend /app/public/build/ ./public/build/\nCOPY . .\n\n# Optimize for production\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. \n
- Deutliche Reduzierung der Image-Größe (von 800-900 MB auf 150-200 MB). \n
2. Optimierung der Docker-Image-Größe für PHP
\n\nKleinere Images laden schneller, benötigen weniger Speicherplatz und verringern die Angriffsfläche. Wichtige Strategien:
\n\n- \n
- Alpine-Versionen von Basis-Images verwenden.
php:8.2-fpm-alpinewiegt ~50 MB im Vergleich zu ~400 MB für das Standard-Imagephp:8.2-fpm. \n - Anzahl der Layer minimieren. Kombinieren Sie
RUN-Befehle mit&&. \n - Temporäre Dateien löschen. Nach der Installation von Erweiterungen den Cache bereinigen:
docker-php-source deleteundapk del .build-deps. \n .dockerignoreverwenden. Schließen Sie.git,node_modules,tests,.envund andere unnötige Dateien aus. \n
Beispiel für eine erweiterte .dockerignore:
.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, Cache und einen Webserver verwenden, wird docker-compose.yml zur zentralen Konfigurationsdatei. Zu den erweiterten Einstellungen gehören:
- \n
- Netzwerke: Dienste isolieren (z. B. sollte die Datenbank von außen nicht erreichbar sein). \n
- Volumes:<