Contexte
Dans le cadre du projet Docker-2025, nous sommes stagiaire au sein de l’entreprise STESIO. Notre mission est le développement d’une application de gestion des ressources humaines pour la société ‘X’ . Ce projet permet de mettre en place une infrastructure haute disponibilité, comprenant un serveur d’application et une base de données MariaDB.

Qu’est ce que Docker ?
Docker est une plateforme de virtualisation légère qui permet de créer, déployer et gérer des applications dans des conteneurs. Ces conteneurs encapsulent tout ce dont une application a besoin pour fonctionner, y compris le code, les bibliothèques et les dépendances, ce qui garantit une cohérence entre les environnements de développement, de test et de production. Nous allons également utiliser son interface graphique : Portainer
Pourquoi Docker ?
Docker offre de nombreux avantages pour le développement et le déploiement d’applications. Ses conteneurs sont portables, fonctionnant sur n’importe quel système compatible, ce qui simplifie le déploiement. Chaque conteneur est isolé, évitant les conflits entre applications et renforçant la sécurité. Docker permet aussi une scalabilité facile, avec la possibilité d’ajouter ou de retirer des conteneurs rapidement. De plus, les conteneurs sont légers et démarrent plus vite que les machines virtuelles, grâce à leur partage du même noyau. Enfin, des outils comme Docker Compose et Docker Swarm rendent la gestion des conteneurs simple et efficace.
Mission
Nous allons déployer un conteneur utilisant l’image MariaDB et un autre avec l’image phpMyAdmin pour gérer la base de données. Ensuite, nous mettrons en place deux conteneurs Apache servant de serveurs web, tout en configurant HAProxy pour assurer la haute disponibilité. Ces serveurs web hébergeront une page affichant dynamiquement les rangs de notre base de données.
Étape 1 : MariaDB & phpMyAdmin
Tout d’abord, nous allons déployer un conteneur MariaDB à l’aide la commande :
docker run --name mariadb -e MYSQL_ROOT_PASSWORD=password -d mariadb:latest
‘-e’ : Permet de définir une variable d’environnement, en l’occurence notre mot de passe en tant que root : MYSQL_ROOT_PASSWORD=password, ‘-d ‘ lance le container en arrière plan.
Nous vérifions le bon fonctionnement de l’image en utilisant la console :

Maintenant, déployons le container phpMyAdmin :
docker run --name phpmyadmin -d -e PMA_HOST=mariadb -p 8080:80 phpmyadmin/phpmyadmin
Ici, PMA_HOST=mariadb spécifie que phpMyAdmin se connecte au conteneur MariaDB. On pourra accéder à phpMyadmin via le port 8080

Étape 2 : HAproxy & serveurs Apache
Afin de déployer notre service HAproxy et nos serveurs Apache, nous utilisons le fichier docker compose suivant :
version: '3.8'services: haproxy: image: haproxy:latest ports: - "80:80" volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg networks: - haproxy-net srvapache1: image: php:apache networks: - haproxy-net srvapache2: image: php:apache networks: - haproxy-net
Il nous faudra également créer un fichier de configuration nommé haproxy.cfg :
global log stdout format raw local0defaults log global mode http timeout connect 5000ms timeout client 50000ms timeout server 50000msfrontend http_front bind *:80 default_backend http_backbackend http_back server srvapache1 srvapache1:80 check server srvapache2 srvapache2:80 check
Nous déployons ainsi notre service haproxy ainsi que nos 2 serveurs Apache à l’aide de la commande : docker compose up -d
Etape 3 : Connexion PDO
Nous allons maintenant lier nos serveurs Apache à notre base de donnée grâce à une connexion PDO. Nous créons alors un fichier « connexion.php » :
// Paramètres de connexion à la base de données$db = "dbcontact"; // Nom de la base de données$dbhost = "172.22.0.3"; $dbport = 3306; // Port par défaut pour MySQL/MariaDB$dbuser = "user"; $dbpasswd = "secret"; try { // Création de la chaîne de connexion DSN (Data Source Name) $dsn = "mysql:host=$dbhost;port=$dbport;dbname=$db;charset=utf8mb4"; // Création d'une instance PDO pour se connecter à la base de données $connexion = new PDO($dsn, $dbuser, $dbpasswd); // Configuration de PDO pour lancer des exceptions en cas d'erreur $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);} catch (PDOException $e) { die("Erreur de connexion : " . $e->getMessage());}
Ensuite nous allons éditer notre fichier index.php :
<html> <body> <h1>Hello!</h1> // Inclure le fichier de connexion include 'connexion.php'; // Exécuter la requête pour récupérer les données $query = "SELECT * FROM personne"; $stmt = $connexion->prepare($query); $stmt->execute(); // Récupérer les résultats $resultats = $stmt->fetchAll(PDO::FETCH_ASSOC); // Afficher les résultats if ($resultats) { echo "<h2>Liste des personnes :</h2>"; echo "<ul>"; foreach ($resultats as $personne) { echo "<li>" . htmlspecialchars($personne['nom']) . " - " . htmlspecialchars($personne['age']) . " ans</li>"; } echo "</ul>"; } else { echo "Aucune personne trouvée."; } // Afficher le nom d'hôte $hostname = gethostname(); echo " hostname : " . htmlspecialchars($hostname); </body></html>
Afin de vérifier le bon fonctionnement de notre service haute disponibilité, nous modifions la page index de nos 2 serveurs apache afin qu’elles retournent le nom d’hôte de leur « machine », pour cela nous utiliserons la fonction .php gethostname()
Pour un aspect un peu plus plaisant, je me suis permis de rajouter un du CSS à notre page :

En multipliant les requêtes HTTP, on constate que le nom d’hôte change, ce qui confirme le bon fonctionnement de la répartition des charges entre les deux hôtes.

Résultat :
Notre connexion PDO est fonctionnelle, notre page web accède à la base de donnée et affiche les informations de manière dynamique ! Lorsque nous actualisons notre page, les 2 serveurs Apache se relayent de sorte à gérer les nombreuses requêtes. On constate que les nom d’hôtes changent à chaque requête signifiant qu’il s’agit d’un serveur différent.
Laisser un commentaire