Docker et PHP : conteneurisation d'applications de A à Z
La conteneurisation d'applications PHP avec Docker est devenue la norme du développement web moderne. Que vous créiez une simple page d'atterrissage ou une application d'entreprise complexe, Docker assure l'uniformité de l'environnement à toutes les étapes : du développement local à la production. Dans cet article, nous allons parcourir toutes les étapes de création d'une infrastructure Docker pour une application PHP — du Dockerfile de base à une pile complète avec Nginx et MySQL.
Pourquoi Docker est important pour un développeur PHP
Le développement PHP traditionnel est souvent confronté au problème "ça marche sur ma machine". Différentes versions de PHP, extensions, configurations de serveur — tout cela entraîne des conflits. Docker résout ce problème une fois pour toutes :
- Isolation de l'environnement — chaque application possède son propre ensemble de dépendances
- Reproductibilité — environnement identique sur toutes les machines
- Évolutivité — ajout facile de nouveaux services (Redis, Elasticsearch)
- Intégration CI/CD — les conteneurs sont parfaits pour les pipelines
Passons de la théorie à la pratique et créons un environnement Docker complet pour une application PHP.
Création d'un Dockerfile de base pour PHP
Commençons par l'essentiel — le Dockerfile. C'est l'instruction pour construire l'image de votre application PHP. Voici la configuration optimale pour une application prête pour la production :
# Utilisation de l'image PHP officielle avec FPMFROM php:8.2-fpm-alpine
# Installation des dépendances systèmeRUN apk add --no-cache \ git \ unzip \ libpq-dev \ libzip-dev \ && docker-php-ext-install \ pdo_mysql \ zip \ opcache
# Installation de ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Configuration d'OPcache pour la productionRUN { \ echo 'opcache.memory_consumption=128'; \ echo 'opcache.interned_strings_buffer=8'; \ echo 'opcache.max_accelerated_files=4000'; \ echo 'opcache.revalidate_freq=2'; \ echo 'opcache.fast_shutdown=1'; \ echo 'opcache.enable_cli=1'; \} > /usr/local/etc/php/conf.d/opcache.ini
# Copie des fichiers de l'applicationWORKDIR /var/www/htmlCOPY . .
# Définition des permissionsRUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 storage bootstrap/cache
# Lancement de PHP-FPMCMD ["php-fpm"]
EXPOSE 9000Ce Dockerfile utilise Alpine Linux — une image minimale qui réduit considérablement la taille du conteneur final. Nous installons uniquement les extensions nécessaires : pdo_mysql pour travailler avec la base de données et zip pour Composer.
Construction et exécution du conteneur
# Construction de l'imagedocker build -t my-php-app .
# Exécution du conteneurdocker run -d -p 9000:9000 --name php-app my-php-appPile complète avec Nginx et MySQL via docker-compose
Une application réelle est rarement composée d'un seul conteneur PHP. Nous avons besoin d'un serveur web et d'une base de données. C'est là que docker-compose entre en jeu — un outil d'orchestration de plusieurs conteneurs.
Créons le fichier docker-compose.yml :
version: '3.8'
services: # Service PHP-FPM app: build: context: . dockerfile: Dockerfile container_name: php-app volumes: - ./:/var/www/html networks: - app-network
# Serveur web Nginx nginx: image: nginx:alpine container_name: php-nginx ports: - "8080:80" volumes: - ./:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - app networks: - app-network
# Base de données MySQL db: image: mysql:8.0 container_name: php-mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: app_database MYSQL_USER: app_user MYSQL_