Docker und PHP: Vollständiger Leitfaden zur Containerisierung von Anwendungen
Moderne Webentwicklung ist ohne Containerisierung nicht denkbar. Docker ist zum De-facto-Standard für das Verpacken, Ausliefern und Ausführen von Anwendungen geworden. Für PHP-Entwickler löst der Einsatz von Docker zahlreiche Probleme: von inkompatiblen PHP-Versionen bis hin zu Schwierigkeiten bei der Umgebungskonfiguration auf verschiedenen Rechnern. In diesem Artikel werden wir Schritt für Schritt durchgehen, wie man eine PHP-Anwendung von Grund auf mit Docker und docker-compose containerisiert.
1. Grundlagen von Docker für PHP-Entwickler
Docker ist eine Plattform für die Entwicklung, Auslieferung und Ausführung von Anwendungen in isolierten Umgebungen (Containern). Jeder Container enthält alles, was für den Betrieb benötigt wird: Code, Bibliotheken, Systemprogramme und Einstellungen. Für PHP ist dies besonders relevant, da die Anwendung oft von einer bestimmten Interpreter-Version, Erweiterungen (z. B. pdo_mysql, redis, gd) und einem Webserver (Apache oder Nginx) abhängt.
Die Hauptkomponenten von Docker:
- Dockerfile — eine Textdatei mit Anweisungen zum Erstellen eines Images.
- Image — eine unveränderliche Vorlage zum Erstellen von Containern.
- Container — eine laufende Instanz eines Images.
- docker-compose — ein Werkzeug zum Definieren und Ausführen von Multi-Container-Anwendungen.
2. Erstellen eines Dockerfiles für eine PHP-Anwendung
Beginnen wir mit einem einfachen Beispiel. Angenommen, wir haben eine PHP-Anwendung mit dem Framework Laravel oder Symfony. Erstellen wir eine Datei Dockerfile im Stammverzeichnis des Projekts:
# Verwende das offizielle PHP 8.2 Image mit FPMFROM php:8.2-fpm-alpine
# Lege das Arbeitsverzeichnis festWORKDIR /var/www/html
# Installiere Systemabhängigkeiten und PHP-ErweiterungenRUN apk add --no-cache \ git \ unzip \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ pdo_mysql \ mbstring \ exif \ pcntl \ bcmath \ gd
# Installiere ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Kopiere die ProjektdateienCOPY . .
# Setze Berechtigungen (für Laravel/Symfony)RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 storage bootstrap/cache
# Öffne Port 9000 (PHP-FPM)EXPOSE 9000
# StartbefehlCMD ["php-fpm"]Dieses Dockerfile bewirkt Folgendes:
- Es verwendet das leichte Image
php:8.2-fpm-alpine. - Es installiert die erforderlichen Erweiterungen:
pdo_mysql,gd,mbstringund andere. - Es kopiert Composer aus dem offiziellen Image.
- Es überträgt den Anwendungscode.
- Es konfiguriert die Zugriffsrechte für Cache und Logs.
3. Einrichtung von docker-compose: PHP + Nginx + MySQL
Für ein reales Projekt benötigen wir einen Webserver und eine Datenbank. Erstellen wir eine Datei docker-compose.yml:
version: '3.8'
services: # PHP-FPM Service php: build: context: . dockerfile: Dockerfile container_name: app_php volumes: - .:/var/www/html networks: - app-network
# Nginx Webserver nginx: image: nginx:alpine container_name: app_nginx ports: - "8080:80" volumes: - .:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php networks: - app-network
# MySQL Datenbank mysql: image: mysql:8.0 container_name: app_mysql environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: app_password ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql networks: - app-network```