Notre base de données MariaDB est maintenant en fonctionnement dans le réseau monprojet-network.
Il nous reste à déployer la partie web de notre application.
Contrairement à certaines images Docker qui regroupent tout dans un seul conteneur, nous allons volontairement séparer les rôles :
- un conteneur Apache pour servir les pages web
- un conteneur PHP-FPM pour exécuter le code PHP
- et notre conteneur MariaDB déjà en fonctionnement
Cette architecture peut sembler un peu plus complexe au premier abord, mais elle est très courante dans les environnements modernes. Chaque service a un rôle bien précis et communique avec les autres via le réseau Docker.
Notre application ressemblera donc à ceci :
Navigateur
│
▼
Apache
│
▼
PHP-FPM
│
▼
MariaDB
Tous ces conteneurs seront connectés au réseau :
monprojet-network
Ce réseau permettra aux conteneurs de se trouver entre eux grâce à leur nom.
🐘 Lancer le conteneur PHP-FPM
Commençons par démarrer le moteur PHP.
docker run -d \
--name php \
--network monprojet-network \
-v $(pwd)/app:/var/www/html \
--restart unless-stopped \
php:8.3-fpm
Ce conteneur exécutera les scripts PHP de notre site.
Le dossier app est partagé entre notre machine et le conteneur, ce qui permettra d’y placer les fichiers de l’application.
⚙️ Préparer la configuration Apache
Par défaut, Apache ne sait pas exécuter les scripts PHP via PHP-FPM.
Nous devons donc ajouter une petite configuration pour lui indiquer où envoyer les fichiers .php.
Créons un dossier pour stocker la configuration Apache :
mkdir apache
Puis créons le fichier :
apache/httpd.conf
Avec cette configuration minimale :
ServerName localhost
# Modules
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule dir_module modules/mod_dir.so
DocumentRoot "/usr/local/apache2/htdocs"
DirectoryIndex index.php index.html
<Directory "/usr/local/apache2/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Protection et passage à PHP-FPM
<FilesMatch \.php$>
# On vérifie d'abord si le fichier existe pour éviter des erreurs bizarres
SetHandler "proxy:fcgi://php:9000"
</FilesMatch>
# Désactiver le proxy direct pour la sécurité
ProxyRequests Off
La ligne importante est :
proxy:fcgi://php:9000
Elle indique à Apache :
lorsque tu rencontres un fichier
.php, envoie-le au conteneur php sur le port 9000.
Grâce au réseau Docker, le nom php est automatiquement résolu par le DNS interne.
🌐 Lancer le conteneur Apache
Nous pouvons maintenant démarrer le serveur web Apache.
docker run -d \
--name apache \
--network monprojet-network \
-p 8080:80 \
-v $(pwd)/app:/usr/local/apache2/htdocs \
-v $(pwd)/apache/httpd.conf:/usr/local/apache2/conf/httpd.conf \
--restart unless-stopped \
httpd:2.4
Le site sera maintenant accessible depuis votre navigateur à l’adresse :
http://localhost:8080
🔎 Vérifier les conteneurs
Pour voir les conteneurs en cours d’exécution :
docker ps
Vous devriez voir apparaître :
apache
php
mariadb
Notre stack est maintenant complète.
🧪 Tester la communication entre conteneurs
Tous les conteneurs étant connectés au réseau monprojet-network, ils peuvent communiquer entre eux en utilisant leur nom comme adresse.
Pour tester cela, nous allons utiliser la commande :
docker exec
Elle permet d’exécuter une commande à l’intérieur d’un conteneur déjà en cours d’exécution.
Essayons depuis Apache :
docker exec -it apache ping php
Si tout fonctionne, vous devriez obtenir des réponses similaires à :
PING php (172.xx.xx.xx)
64 bytes from php
Apache arrive donc à joindre le conteneur php.
On peut également tester la base de données :
docker exec -it apache ping mariadb
Si des réponses apparaissent, cela signifie que tous les conteneurs communiquent correctement dans le réseau Docker.
(Selon l’image utilisée, la commande ping peut ne pas être installée, mais cela n’empêche pas la communication entre les services.)
📌 À retenir
Dans cette leçon, nous avons :
- lancé un conteneur PHP-FPM
- configuré Apache pour utiliser PHP
- démarré le serveur web Apache
- utilisé docker exec pour tester la communication entre conteneurs
Notre application repose maintenant sur trois conteneurs :
apache
php
mariadb
Tout est prêt pour la prochaine étape.
Dans le TP n°1, nous allons créer un petit site PHP qui se connecte à MariaDB et affiche :
Connexion BDD OK
Notre première application web complète fonctionnant avec Docker. 🚀