« A portée de main, toutes les informations sur mon parcours. »


BTS Services Informatiques aux Organisations, un parcours passionnant au cœur des technologies et de l’innovation.

Projet Docker

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 local0
defaults
log global
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http_front
bind *:80
default_backend http_back
backend 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 » :

<?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>
<?php
// 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.

Publié par


Laisser un commentaire