Nous avons maintenant les trois conteneurs de notre stack en fonctionnement :
apache
php
mariadb
Ils sont tous connectés au réseau :
monprojet-network
Dans ce premier TP, nous allons mettre en place un petit site PHP capable de se connecter à la base de données MariaDB et d’afficher simplement :
Connexion BDD OK
L’objectif n’est pas de créer une application complexe, mais de valider que tous les conteneurs communiquent correctement entre eux.
🎯 Objectif du TP
À la fin de cet exercice, vous devrez pouvoir ouvrir votre navigateur sur :
http://localhost:8080
Ou depuis indiquant l’adresse IP du serveur hôte Docker depuis un votre ordinateur si vous avez opté pour une installation “serveur” sans interface graphique
et voir apparaître :
Connexion BDD OK
Si ce message apparaît, cela signifie que :
- Apache sert correctement les pages web
- PHP exécute les scripts
- PHP peut contacter MariaDB
- le réseau Docker fonctionne correctement
Bref : toute la stack est opérationnelle.
📁 Créer le fichier du site
Dans le dossier app que nous avons créé précédemment, créons un fichier :
app/index.php
Ajoutez le contenu suivant :
<?php
$host = "mariadb";
$db = "monsite";
$user = "monsiteuser";
$pass = "monsitepassword";
try {
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
echo "Connexion BDD OK";
} catch (PDOException $e) {
echo "Erreur de connexion : " . $e->getMessage();
}
Ce script PHP va simplement essayer de se connecter à la base MariaDB.
🔍 Comprendre ce script
La ligne la plus importante est :
$host = "mariadb";
Pourquoi mariadb ?
Parce que dans le réseau Docker monprojet-network, chaque conteneur est accessible par son nom.
Le conteneur PHP peut donc contacter la base de données via :
mariadb
sans connaître son adresse IP.
🌐 Tester l’application
Ouvrez votre navigateur et rendez-vous sur :
http://localhost:8080
Si tout est correctement configuré, vous devriez voir :
Connexion BDD OK
🎉 Félicitations ! Votre première application web multi-conteneurs fonctionne.
🔎 Que se passe-t-il réellement ?
Lorsqu’un utilisateur accède au site :
http://localhost:8080
le flux devient :
Navigateur
│
▼
Apache
│
▼
PHP-FPM
│
▼
MariaDB
1️⃣ Apache reçoit la requête du navigateur
2️⃣ Apache transmet le script .php au conteneur PHP
3️⃣ PHP exécute le script
4️⃣ PHP se connecte à MariaDB
5️⃣ Le message Connexion BDD OK est renvoyé au navigateur
🧪 En cas de problème
Si le message ne s’affiche pas, plusieurs vérifications sont possibles.
Vérifier les conteneurs
docker ps
Les trois conteneurs doivent être en cours d’exécution.
Vérifier les logs Apache
docker logs apache
Vérifier les logs PHP
docker logs php
Vérifier les logs MariaDB
docker logs mariadb
Les logs sont le premier outil de diagnostic lorsqu’un conteneur ne fonctionne pas comme prévu.
📌 À retenir
Dans ce TP, vous avez :
- déployé un site PHP simple
- connecté PHP à MariaDB
- validé la communication entre trois conteneurs
- testé l’ensemble via un navigateur web
Votre stack Docker fonctionne maintenant pleinement.
Dans la prochaine section, nous allons découvrir Docker Compose, qui permet de décrire toute cette architecture dans un simple fichier YAML, au lieu de lancer plusieurs commandes docker run. 🚀
Réaliser ce TP en ligne, vous avez la possibilité de réalise ces actions directement en ligne en lançant un environnement en cliquant sur le bouton ci-après.
🧪 Lab · membre · 20 min
🧪 Lancer le labConsignes :
- Utiliser le dossier /tp pour stockage les fichiers et la configuration d’Apache sera dans le dossier config
- Le nom du réseau doit être tp-net
Voir la solutionMasquer la solution
1. Creation du réseau pour la communication des conteneurs
docker network create tp-net
2. Créer le dossier qui va contenir notre application, la configuration Apache2 et les données MariaDB.
mkdir -p /tp/app && mkdir /tp/config && mkdir /tp/data && cd /tp
3. Créer et lancer le conteneur MariaDB
docker run -d \
--name mariadb \
--network tp-net \
-v /tp/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-e MYSQL_DATABASE=monsite \
-e MYSQL_USER=monsiteuser \
-e MYSQL_PASSWORD=monsitepassword \
--restart unless-stopped \
mariadb:11
4. Créer et lancer le conteneur PHP
docker run -d \
--name php \
--network tp-net \
-v /tp/app:/var/www/html \
--restart unless-stopped \
rdrit/php83
5. Créer le fichier de configuration pour Apache
nano config/apache2.conf
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog /proc/self/fd/2
CustomLog /proc/self/fd/1 combined
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# Include list of ports to listen on
Include ports.conf
AccessFileName .htaccess
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
IncludeOptional conf-enabled/*.conf
#DocumentRoot "/var/www/html"
DirectoryIndex index.php index.html
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot "/var/www/html"
# Protection et passage à PHP-FPM
<FilesMatch \.php$>
<IfModule mod_proxy_fcgi.c>
SetHandler "proxy:fcgi://php:9000"
</IfModule>
</FilesMatch>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
# Désactiver le proxy direct pour la sécurité
ProxyRequests Off
</VirtualHost>
6. Créer et lancer le conteneur Apache
docker run -d \
--name apache \
--network tp-net \
-p 8080:80 \
-v /tp/app:/var/www/html \
-v /tp/config/apache2.conf:/etc/apache2/apache2.conf \
--restart unless-stopped \
rdrit/apache2
7. Verifier que le conteneur sont démarrés
docker ps
8. Créer le fichier PHP de test :
nano app/index.php
<?php
$host = "mariadb";
$db = "monsite";
$user = "monsiteuser";
$pass = "monsitepassword";
try {
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
echo "Connexion BDD OK";
} catch (PDOException $e) {
echo "Erreur de connexion : " . $e->getMessage();
}
Tester le fonctionnement - comme nous n’avons pas de navigateur, nous allons le faire avec Curl
curl http://dind:8080/index.php