Pourquoi conteneuriser les applications PHP avec Docker ?
Le développement web moderne en PHP utilise rarement la conteneurisation. Docker permet d'empaqueter votre application avec toutes ses dépendances (serveur web, extensions PHP, base de données) dans un conteneur isolé. Cela garantit que l'application fonctionnera de la même manière sur la machine locale du développeur, sur le serveur de test et en production. Dans cet article, nous allons voir comment configurer correctement Docker pour PHP, créer un projet prêt à l'emploi et examiner les meilleures pratiques.
Avantages de l'utilisation de Docker avec PHP
- Reproductibilité de l'environnement : oubliez le problème "ça marche sur ma machine".
- Isolation : chaque application vit dans son propre conteneur avec les versions nécessaires de PHP et des bibliothèques.
- Scalabilité : lancez facilement plusieurs instances de l'application avec docker-compose.
- Simplification du CI/CD : les conteneurs sont parfaits pour les pipelines de build et de déploiement automatiques.
Création d'un Dockerfile pour une application PHP
Commençons par l'essentiel — le fichier Dockerfile. Il décrit comment l'image de votre application PHP sera construite. Voici un exemple de base pour une application PHP 8.2 avec le serveur web Apache.
# DockerfileFROM php:8.2-apache
# Installation des extensions PHPRUN docker-php-ext-install pdo pdo_mysql mysqli
# Activation de mod_rewrite pour Apache (utile pour les frameworks)RUN a2enmod rewrite
# Copie du code source de l'applicationCOPY . /var/www/html/
# Changement du propriétaire pour les droits d'accès correctsRUN chown -R www-data:www-data /var/www/html
# Ouverture du port 80EXPOSE 80Ce Dockerfile prend l'image officielle PHP 8.2 avec Apache, installe les pilotes MySQL et copie votre code. Pour des projets plus complexes, comme Laravel ou Symfony, une configuration supplémentaire sera nécessaire.
Exemple pour Laravel avec Nginx et PHP-FPM
Pour les frameworks modernes, on utilise souvent la combinaison Nginx + PHP-FPM. Voici un exemple de Dockerfile pour PHP-FPM :
# Dockerfile.php-fpmFROM php:8.2-fpm
# Installation des dépendances système et des extensionsRUN apt-get update && apt-get install -y \ libpq-dev \ libzip-dev \ unzip \ git \ && docker-php-ext-install pdo pdo_mysql zip
# Installation de ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Copie du projetWORKDIR /var/wwwCOPY . .
# Installation des dépendances PHPRUN composer install --no-interaction --optimize-autoloader
# Droits d'accès pour LaravelRUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache
CMD ["php-fpm"]Et voici la configuration Nginx, qui devra être placée dans un conteneur séparé via docker-compose :
# default.conf (pour Nginx)server { listen 80; server_name localhost; root /var/www/public;
add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / { try_files $uri $uri/ /index.php?$query_string; }
location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \\.php$ { fastcgi_pass php:9000; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; }
location ~ /\\.(?!well-known).* { deny all; }}Orchestration avec docker-compose
Pour gérer plusieurs conteneurs (PHP, Nginx, MySQL), utilisez docker-compose.yml. C'est l'outil standard pour le développement et les tests locaux.
# docker-compose.ymlversion: '3.8'
services: php: build: co