Docker en pratique : les commandes et bonnes pratiques avec lesquelles nous exploitons GLPI

Comment NexTool exploite et maintient GLPI sur Docker pour ses clients : architecture avec volumes séparés, un docker-compose de production, les commandes que nous utilisons vraiment en support et les bonnes pratiques (tag figé, non-root, secrets et sauvegarde de volume).

Docker a cessé d'être une mode pour devenir la façon standard dont nous livrons et maintenons GLPI pour nos clients. Au lieu d'installer PHP, MariaDB et le serveur web directement sur le système d'exploitation, nous empaquetons GLPI et ses dépendances dans des conteneurs versionnés - ce qui rend l'installation reproductible, le rollback trivial et la maintenance prévisible. Ce guide rassemble les commandes que nous utilisons vraiment au quotidien en support et les pratiques que nous appliquons pour faire tourner le service desk en production en toute sécurité.

Comment nous faisons tourner GLPI sur Docker

L'architecture que nous standardisons est délibérément sobre : un conteneur pour l'application GLPI (PHP-FPM et serveur web), un pour la base de données MariaDB et, quand le volume de tickets le justifie, un Redis pour la session et le cache. Le tout orchestré par un unique docker-compose.yml, derrière un reverse proxy avec TLS. Les données qui doivent survivre à toute recréation de conteneur - base de données, fichiers téléversés et configuration - vivent dans des volumes nommés, jamais à l'intérieur du conteneur. Cette séparation entre le code (l'image, jetable) et l'état (le volume, précieux) est ce qui transforme une montée de version de GLPI en une opération de quelques minutes, et non en une nuit entière.

Artefact : le stack GLPI que nous provisionnons

Voici le squelette du compose que nous montons à chaque déploiement, déjà avec des volumes séparés et sans identifiant en clair dans le fichier :

# docker-compose.yml - stack GLPI de production
services:
  glpi:
    image: glpi/glpi:11.0        # tag fige, jamais 'latest'
    restart: unless-stopped
    depends_on:
      - glpidb
    volumes:
      - glpi_files:/var/glpi     # fichiers televerses et configuration de GLPI
    networks: [ edge, internal ]

  glpidb:
    image: mariadb:11.4
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: glpi
      MARIADB_USER: glpi
      MARIADB_PASSWORD_FILE: /run/secrets/db_password   # mot de passe via secret, jamais en clair
    volumes:
      - glpi_db:/var/lib/mysql   # la base de donnees vit ici, hors du conteneur
    networks: [ internal ]
    secrets: [ db_password ]

volumes:
  glpi_files:
  glpi_db:

networks:
  edge:      # exposee au reverse proxy
  internal:  # base de donnees privee, sans route externe
    internal: true

secrets:
  db_password:
    file: ./secrets/db_password.txt   # fichier 600, hors git

Les commandes que nous utilisons vraiment en support

Au quotidien, une poignée de commandes résout la plupart des interventions. Voici celles que l'équipe tape presque sans réfléchir :

CommandeQuand nous l'utilisons pour maintenir GLPI
docker compose up -dMonte ou met à jour le stack après un changement dans le compose ou le tag de l'image
docker compose logs -f glpiSuit l'erreur d'un ticket en temps réel quand le client signale une panne
docker compose exec glpi bashEntre dans le conteneur pour lancer php bin/console (cron, cache, migration)
docker compose psVérifie que l'application et la base sont en marche avant d'ouvrir un incident
docker statsDiagnostique les pics de CPU et de mémoire quand la plainte est la lenteur
docker compose down (sans -v)Recrée le stack en conservant les volumes ; le -v effacerait la base

L'erreur courante - et coûteuse - que nous avons vue chez des opérateurs négligents est de lancer docker compose down -v en croyant que cela ne fait que redémarrer les conteneurs. Le drapeau -v supprime les volumes, et avec eux toute la base de données de GLPI. En support, nous traitons -v comme une commande destructrice : elle n'apparaît dans aucune procédure d'exploitation, et toute sauvegarde de volume est validée avant toute maintenance qui s'en approche.

Bonnes pratiques que nous appliquons en production

  • Tag figé, jamais latest - nous figeons la version de l'image (p. ex. glpi/glpi:11.0, mariadb:11.4) pour qu'un pull n'apporte pas une version inattendue au milieu d'une maintenance.
  • Non-root et moindre privilège - l'application ne tourne pas en root, et la base reste sur le réseau internal, sans route externe, accessible seulement par le conteneur GLPI.
  • Secrets hors du compose - le mot de passe de la base arrive via un Docker secret ou un fichier monté en lecture seule, jamais dans environment: en clair commité dans git.
  • Le volume est sacré - base, fichiers et configuration dans des volumes nommés, avec un dump logique quotidien de la base testé par une restauration réelle (une sauvegarde jamais restaurée n'est pas une sauvegarde).
  • Images légères et scannées - une base slim et un scan avec Trivy ou Docker Scout pour ne pas emporter une CVE connue en production.

Un détail que seul celui qui maintient GLPI en conteneur connaît : monter la version de GLPI ne se limite pas à changer le tag de l'image. Après le docker compose up -d avec la nouvelle image, il faut lancer la migration de la base depuis la console à l'intérieur du conteneur, sinon l'application démarre en pointant vers un ancien schéma et renvoie une erreur 500 au premier écran. C'est pourquoi notre procédure de mise à jour enchaîne toujours le même ordre : sauvegarde du volume de la base, changement du tag, up -d, migration et seulement ensuite l'ouverture de l'accès aux utilisateurs. Quand le client utilise le plugin NexTool, ce même démarrage recharge les modules de l'écosystème - nous validons donc aussi la santé des intégrations (files de webhooks, synchronisation) avant de déclarer l'environnement stable.

Si votre exploitation de GLPI tourne encore installée directement sur le serveur, sans volumes séparés ni sauvegarde testée, NexTool déploie et maintient cet environnement sur Docker de la bonne manière - avec un stack versionné, des montées de version prévisibles et de l'observabilité à côté du service desk. Parlez-nous du support de GLPI sur conteneurs.


Ce contenu a été produit avec l'aide de l'intelligence artificielle et révisé par l'équipe Nextool Solutions.

Questions fréquentes

Parce que le stack en conteneur est reproductible et que l'état (base, fichiers, configuration) est isolé dans des volumes. Cela rend les montées de version prévisibles, le rollback trivial et la maintenance une affaire de minutes, plutôt qu'une installation manuelle difficile à reproduire sur un autre environnement.

Au quotidien nous utilisons docker compose up -d (monter/mettre à jour), docker compose logs -f glpi (suivre les erreurs en temps réel), docker compose exec glpi bash (lancer la console GLPI), docker compose ps (vérifier que app et base tournent) et docker stats (diagnostiquer les pics de CPU et de mémoire).

docker compose down seul arrête et supprime les conteneurs mais préserve les volumes nommés - la base reste intacte. Ce qui efface les données, c'est le drapeau -v (docker compose down -v), qui supprime aussi les volumes. Nous traitons -v comme une commande destructrice et il n'entre jamais dans une procédure de routine.

Ce qui doit être sauvegardé, c'est l'état, pas l'image. Nous faisons un dump logique quotidien de la base (depuis le conteneur MariaDB) et une copie du volume des fichiers téléversés et de la configuration. Surtout, nous testons la restauration : une sauvegarde jamais restaurée ne compte pas comme une sauvegarde.

L'ordre compte : d'abord la sauvegarde du volume de la base, puis le changement du tag de l'image, docker compose up -d, la migration de la base depuis la console dans le conteneur et seulement ensuite l'ouverture de l'accès. Sauter la migration fait démarrer l'application avec un ancien schéma et renvoie une erreur 500.

Besoin d'aide ?