Docker et PHP : conteneurisation avancée d'applications

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Docker et PHP : conteneurisation avancée d'applications

\n\n

La 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\n

1. Builds multi-étapes (Multi-stage builds) pour PHP

\n\n

Le 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.

\n\n

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\n

Avantages 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
\n\n

2. Optimisation de la taille des images Docker pour PHP

\n\n

Les 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-alpine pèse ~50 Mo contre ~400 Mo pour le standard php:8.2-fpm.
  • \n
  • Minimisez le nombre de couches. Combinez les commandes RUN avec &&.
  • \n
  • Supprimez les fichiers temporaires. Après l'installation des extensions, nettoyez le cache : docker-php-source delete et apk del .build-deps.
  • \n
  • Utilisez .dockerignore. Excluez .git, node_modules, tests, .env et autres fichiers inutiles.
  • \n
\n\n

Exemple de .dockerignore avancé :

\n\n
.git\n.gitignore\n.env\n.env.example\nnode_modules\ntests\nstorage/logs/*\n!storage/logs/.gitkeep\ndocker-compose.yml\nMakefile\nREADME.md
\n\n

3. Docker Compose pour les projets PHP complexes

\n\n

Pour 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\n
    \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 :<

Blogs

Book Recommendations