C402

Challenge C402 10/03/2026

UbuntuDockerDocker ComposeApacheGLPIBashGitDNS
Retour au cours

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

Cours C402.

🗂 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.yml fonctionnel 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.yml tout fait depuis Internet
✗ Ne pas utiliser d'image GLPI non-officielle ou prĂ©configurĂ©e
✓ Partir des images officielles : mariadb et diouxx/glpi ou glpi/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 !

RessourceURL / Commande
Doc Docker Composedocs.docker.com/compose/
Image MariaDB (Docker Hub)hub.docker.com/_/mariadb
Image GLPIhub.docker.com/r/diouxx/glpi ou hub.docker.com/r/glpi/glpi
Image Adminerhub.docker.com/_/adminer
Variables MariaDBVoir section Environment dans la doc de l'image
Logs d'un servicedocker compose logs -f glpi
Entrer dans un conteneurdocker compose exec db bash
Lister les conteneursdocker compose ps

📚 Ressources :


⏬ 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 .

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 .

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}}"

images

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 .

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

compose




🐋 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.yml vide 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 mariadb dans votre docker-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:

db

Étape 3 — Service GLPI

  • Ajoutez le service glpi en utilisant l'image glpi/glpi ou diouxx/glpi
  • Exposez le port 80 du conteneur sur un port de votre machine
  • Configurez la dĂ©pendance vers le service db avec depends_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

ok

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Ă©).

glpi

slpiok

🏆 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

down

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

admirer

Test de l'interface d'administration de la BDD (Bonus) :

  • AccĂ©der Ă  Adminer : http://10.0.0.30:8081.
  • Serveur : db, Utilisateur : root ou glpiuser.

admirer

🏆 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.

Voir Etape 1

🏆 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_healthy dans depends_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