Docker et PHP : conteneurisation avancée d'applications
\n\nLa conteneurisation avec Docker est devenue la norme pour le développement et le déploiement d'applications PHP. Les connaissances de base — lancer un conteneur avec PHP et Nginx — ne sont que la première étape. Au niveau avancé, il est nécessaire de configurer des builds multi-étapes, d'optimiser la taille des images, de travailler avec plusieurs services, de gérer les variables d'environnement, d'intégrer le CI/CD et de construire une architecture de microservices. Dans cet article, nous aborderons les techniques clés qui vous aideront à faire passer votre conteneurisation PHP au niveau supérieur.
\n\n1. Builds multi-étapes (Multi-stage builds) pour PHP
\n\nLe build multi-étapes permet d'utiliser plusieurs instructions FROM dans un seul Dockerfile. C'est idéal pour les applications PHP où, lors de la phase de build, vous avez besoin de Composer, Node.js et d'autres outils, alors que l'image finale ne doit contenir que les fichiers compilés et un ensemble minimal de dépendances.
Exemple de Dockerfile pour une application Laravel avec un build multi-étapes :
\n\n# Étape 1 : Installation des dépendances et 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# Étape 2 : Image finale\nFROM php:8.2-fpm-alpine3.18 AS final\nWORKDIR /var/www/html\n\n# Installation des extensions PHP nécessaires\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# Copie uniquement des fichiers nécessaires depuis les étapes précédentes\nCOPY --from=vendor /app/vendor/ ./vendor/\nCOPY --from=frontend /app/public/build/ ./public/build/\nCOPY . .\n\n# Optimisation pour la production\nRUN php artisan optimize\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\nAvantages clés :
\n- \n
- L'image finale ne contient que les dépendances d'exécution (PHP-FPM, extensions, code). \n
- Les outils de build (Composer, Node.js) ne sont pas inclus dans la production. \n
- Réduction significative de la taille de l'image (de 800-900 Mo à 150-200 Mo). \n
2. Optimisation de la taille des images Docker pour PHP
\n\nLes petites images se chargent plus rapidement, nécessitent moins d'espace disque et réduisent la surface d'attaque. Les stratégies principales :
\n\n- \n
- Utilisez les versions alpine des images de base.
php:8.2-fpm-alpinepèse ~50 Mo contre ~400 Mo pour le standardphp:8.2-fpm. \n - Minimisez le nombre de couches. Combinez les commandes
RUNavec&&. \n - Supprimez les fichiers temporaires. Après l'installation des extensions, nettoyez le cache :
docker-php-source deleteetapk del .build-deps. \n - Utilisez
.dockerignore. Excluez.git,node_modules,tests,.envet autres fichiers inutiles. \n
Exemple de .dockerignore avancé :
.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 pour les projets PHP complexes
\n\nPour les applications PHP utilisant des bases de données, des files d'attente, un cache et un serveur web, le fichier docker-compose.yml devient le fichier de configuration central. Les configurations avancées incluent :
- \n
- Réseaux (networks) : isolez les services (par exemple, la base de données ne doit pas être accessible de l'extérieur). \n
- Volumes :<