Challenge C402 10/03/2026
đ§âđ« Pitch de lâexercice : đ DĂ©ployer GLPI avec Docker Compose
Challenge : https://github.com/O-clock-Aldebaran/SC04E02-Deployer-GLPI-GitFreed/blob/master/README.md
đ Contexte
Vous ĂȘtes administrateur systĂšme dans une PME. Votre responsable vous demande de dĂ©ployer GLPI, l'outil de gestion de parc informatique open-source, de façon reproductible et conteneurisĂ©e.
PlutĂŽt que d'installer GLPI directement sur un serveur, vous allez utiliser Docker Compose pour orchestrer plusieurs services : l'application GLPI elle-mĂȘme, sa base de donnĂ©es MariaDB, et en bonus un outil de gestion de BDD via une interface web.
đĄ Pourquoi Docker Compose ?
- Tout l'environnement est décrit dans un seul fichier :
docker-compose.yml- Une seule commande pour tout dĂ©marrer, tout arrĂȘter, tout reconstruire
- L'environnement est identique sur tous les postes de l'équipe
đŻ Objectifs
Ă la fin de cet exercice, vous aurez :
- Rédigé un fichier
docker-compose.ymlfonctionnel de zéro - Configuré un service MariaDB avec variables d'environnement
- Déployé GLPI et réalisé sa configuration initiale via le navigateur
- Mis en place la persistance des données avec des volumes Docker
- (Bonus) Ajouté Adminer pour administrer la base de données
đ Contraintes & RĂšgles du jeu
â ïž Important â Ă respecter impĂ©rativement
â Ne pas copier-coller un
docker-compose.ymltout fait depuis Internet
â Ne pas utiliser d'image GLPI non-officielle ou prĂ©configurĂ©e
â Partir des images officielles :mariadbetdiouxx/glpiouglpi/glpi
â Construire votre fichier Ă©tape par Ă©tape en consultant la documentation
â Tester chaque ajout avant de passer Ă l'Ă©tape suivante
đ Indices & Documentation
Consultez ces ressources si vous ĂȘtes bloquĂ©s â mais essayez d'abord par vous-mĂȘme !
| Ressource | URL / Commande |
|---|---|
| Doc Docker Compose | docs.docker.com/compose/ |
| Image MariaDB (Docker Hub) | hub.docker.com/_/mariadb |
| Image GLPI | hub.docker.com/r/diouxx/glpi ou hub.docker.com/r/glpi/glpi |
| Image Adminer | hub.docker.com/_/adminer |
| Variables MariaDB | Voir section Environment dans la doc de l'image |
| Logs d'un service | docker compose logs -f glpi |
| Entrer dans un conteneur | docker compose exec db bash |
| Lister les conteneurs | docker compose ps |
đ Ressources :
- GLPI Docker Images : https://hub.docker.com/r/glpi/glpi
- Docker Cheatsheet : https://cheatography.com/christian-knell/cheat-sheets/docker-docker-compose-and-docker-swarm/
⏠Aller Ă : đ DĂ©ployer GLPI avec Docker Compose
Tests & démo Docker Build & Docker Compose
Préparation
git clone https://github.com/pmaldi/docker-avancee-app.git
cd docker-avancee-app
Version 1
nano Dockerfile.v1
FROM ubuntu:24.04
# Prérequis d'installation et
RUN apt update
RUN apt upgrade -y
# Installation de NodeJS
RUN apt install nodejs -y
RUN apt install npm -y
# Je copie les fichiers de mon application dans mon conteneur
COPY . /app
# J'installe Vite
WORKDIR /app
RUN npm install
# Expose mon port 5173 (Attention il c'est le port COTE CONTENEUR et pas coté hote)
EXPOSE 5173
# Je lance mon application
CMD npm run prod
Build V1 :
sudo docker build -t dockerdemo:v1 -f Dockerfile.v1 .

Version 2
FROM ubuntu:24.04
# Prérequis d'installation et Installation de NodeJS
RUN apt update && \
apt upgrade -y && \
apt install nodejs -y --no-install-recommends --no-install-suggests && \
apt install npm -y --no-install-recommends --no-install-suggests
# Je copie les fichiers de mon application dans mon conteneur
COPY . /app
# J'installe Vite
WORKDIR /app
RUN npm install
# Expose mon port 5173 (Attention il c'est le port COTE CONTENEUR et pas coté hote)
EXPOSE 5173
# Je lance mon application
CMD npm run prod
Build V2 : sudo docker build -t dockerdemo:v2 -f Dockerfile.v2 .

Comparaison des versions
La commande suivante permet de lister les images et d'observer la différence de taille en mégaoctets :
sudo docker images
C'est ici qu'intervient la commande qui exploite le formatage Go-template pour extraire la métrique exacte :
sudo docker image inspect dockerdemo:v1 --format "V1 Layers: {{len .RootFS.Layers}}"
sudo docker image inspect dockerdemo:v2 --format "V2 Layers: {{len .RootFS.Layers}}"

Version 3
# ---- Stage 1 : Build ----
FROM node:alpine AS builder
WORKDIR /app
# On copie uniquement les fichiers de dépendances d'abord (cache Docker optimisé)
COPY package*.json ./
# Installation de TOUTES les dépendances (dev incluses, nécessaires pour le build)
RUN npm ci
# On copie le reste du code
COPY . .
# Build de l'application
RUN npm run build
# ---- Stage 2 : Production ----
FROM node:alpine AS production
WORKDIR /app
COPY package*.json ./
# On installe UNIQUEMENT les dépendances de production
RUN npm ci --omit=dev
# On récupÚre uniquement le build depuis le stage précédent
COPY --from=builder /app/dist ./dist
EXPOSE 5173
CMD ["node", "dist/index.js"]
Build V2 : sudo docker build -t dockerdemo:v3 -f Dockerfile.v3 .

Docker Compose
nano docker-compose.yaml
services:
web:
image: php:8.2-apache
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
db:
image: mariadb:11
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
sudo docker compose up -d

đ DĂ©ployer GLPI avec Docker Compose
Ătape 1 â Mise en place du projet
- Créez un dossier dédié pour votre projet :
mkdir glpi-docker && cd glpi-docker - Créez le fichier
docker-compose.ymlvide et préparez la structure de votre projet - Réfléchissez aux services dont vous aurez besoin avant de commencer à écrire
**Création du fichier .env** (pour stocker les variables de maniÚre sécurisée) :
nano .env
Contenu à insérer :
MYSQL_ROOT_PASSWORD=Rootpassword!
MYSQL_DATABASE=glpidb
MYSQL_USER=glpiuser
MYSQL_PASSWORD=Glpiuserpassword!
**CrĂ©ation d'un fichier .gitignore** (pour empĂȘcher l'exportation accidentelle des mots de passe sur un dĂ©pĂŽt de code) :
echo ".env" > .gitignore
Création du fichier principal vide :
touch docker-compose.yml
Ătape 2 â Service MariaDB
- Ajoutez un service
mariadbdans votredocker-compose.yml - Définissez les variables d'environnement nécessaires :
MYSQL_ROOT_PASSWORD,MYSQL_DATABASE,MYSQL_USER,MYSQL_PASSWORD - Montez un volume pour persister les données de la base
- Testez que le conteneur démarre correctement avec :
docker compose up -d db
Avec nano docker-compose.yml on édit le fichier Yaml
services:
# ĂTAPE 2 : Service MariaDB
db:
image: mariadb:10.11
container_name: glpi-db
environment:
# Appel sécurisé des variables depuis le fichier .env
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
networks:
- glpi-net
volumes:
db_data:
networks:
glpi-net:

Ătape 3 â Service GLPI
- Ajoutez le service
glpien utilisant l'imageglpi/glpi ou diouxx/glpi - Exposez le port 80 du conteneur sur un port de votre machine
- Configurez la dépendance vers le service
dbavecdepends_on - Montez les volumes nécessaires pour les fichiers GLPI (config, fichiers uploadés...)
# ĂTAPE 3 : Service GLPI
glpi:
image: glpi/glpi:latest
container_name: glpi-app
ports:
- "8080:80"
environment:
TIMEZONE: 'Europe/Paris'
# Ajout des variables exigées par l'Entrypoint de l'image GLPI
MARIADB_HOST: db
MARIADB_DATABASE: ${MYSQL_DATABASE}
MARIADB_USER: ${MYSQL_USER}
MARIADB_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- glpi_data:/var/www/html
depends_on:
db:
condition: service_healthy
networks:
- glpi-net
volumes:
db_data:
glpi_data:
networks:
glpi-net:
Ătape 4 â RĂ©seau & Communication
- Créez un réseau Docker dédié pour que vos services puissent communiquer
- Rattachez chaque service à ce réseau
- Vérifiez que GLPI peut joindre MariaDB : le nom d'hÎte à utiliser est le nom du service
db
# ĂTAPE 4 : DĂ©claration formelle des volumes et du rĂ©seau isolĂ©
volumes:
db_data:
glpi_data:
networks:
glpi-net:
driver: bridge
Ătape 5 â DĂ©marrage & Configuration initiale
- Lancez l'ensemble des services :
docker compose up -d - Ouvrez votre navigateur sur
http://10.0.0.30:8080 - Suivez l'assistant d'installation GLPI en renseignant les informations de connexion Ă la BDD
- Connectez-vous avec les identifiants par défaut (
glpi/glpi) et changez-les !
Lancement des conteneurs en arriĂšre-plan :
sudo docker compose up -d
Vérification de l'état des services (il faut s'assurer que db est en statut healthy et les autres en running) :
sudo docker compose ps

Configuration via le navigateur web :
-
Accéder à l'interface GLPI :
http://10.0.0.30:8080(ou l'IP de la machine virtuelle si le navigateur est sur l'hĂŽte physique). -
Lors de l'assistant d'installation, renseigner la base de données : - Serveur SQL :
db(Le DNS interne de Docker se charge de résoudre ce nom en adresse IP). - Utilisateur / Base / Mot de passe : Ceux inscrits dans le fichier.env. -
Sécurité stricte : Une fois connecté avec
glpi/glpi, il est impératif de modifier immédiatement les mots de passe des comptes par défaut (glpi,tech,normal,post-only) et de supprimer le fichier d'installation (ou laisser GLPI avertir de ce risque de sécurité).


đ Bonus 1 â Adminer
Ajoutez le service Adminer à votre stack. Adminer est une interface web légÚre pour administrer des bases de données. Exposez-le sur le port 8081 et connectez-vous avec les identifiants de votre base GLPI.
Il faut compose down sudo docker compose down -v puis modifier le fichier yaml

# BONUS 1 : Adminer
adminer:
image: adminer:latest
container_name: glpi-adminer
ports:
- "8081:8080"
depends_on:
- db
networks:
- glpi-net

Test de l'interface d'administration de la BDD (Bonus) :
- Accéder à Adminer :
http://10.0.0.30:8081. - Serveur :
db, Utilisateur :rootouglpiuser.

đ Bonus 2 â Fichier .env
Déplacez tous les mots de passe et variables sensibles dans un fichier .env et utilisez la syntaxe ${VARIABLE} dans votre docker-compose.yml. Ajoutez .env à un fichier .gitignore pour ne jamais le commiter.
đ Bonus 3 â Healthcheck
Ajoutez un healthcheck sur le service db pour que GLPI n'essaie de dĂ©marrer qu'une fois que MariaDB est rĂ©ellement prĂȘt Ă accepter des connexions.
Indice :
condition: service_healthydansdepends_on
# Bonus 3 : S'assurer que le service SQL est prĂȘt avant de lancer l'application
healthcheck:
test: ["CMD", "healthcheck.sh", "--su-mysql", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5