Docker en la práctica: los comandos y buenas prácticas con que ejecutamos GLPI

Cómo NexTool ejecuta y da soporte a GLPI en Docker para clientes: arquitectura con volúmenes separados, un docker-compose de producción, los comandos que realmente usamos en el soporte y las buenas prácticas (tag fijo, no-root, secrets y backup de volumen).

Docker dejó de ser una moda y se convirtió en la forma estándar en que entregamos y damos soporte a GLPI para clientes. En lugar de instalar PHP, MariaDB y el servidor web directamente en el sistema operativo, empaquetamos GLPI y sus dependencias en contenedores versionados - lo que hace que la instalación sea reproducible, el rollback trivial y el mantenimiento predecible. Esta guía reúne los comandos que realmente usamos en el día a día del soporte y las prácticas que aplicamos para ejecutar el service desk en producción con seguridad.

Cómo ejecutamos GLPI en Docker

La arquitectura que estandarizamos es deliberadamente austera: un contenedor para la aplicación GLPI (PHP-FPM y servidor web), uno para la base de datos MariaDB y, cuando el volumen de tickets lo justifica, un Redis para sesión y caché. Todo orquestado por un único docker-compose.yml, detrás de un reverse proxy con TLS. Los datos que deben sobrevivir a cualquier recreación del contenedor - base de datos, archivos subidos y configuración - viven en volúmenes con nombre, nunca dentro del contenedor. Esa separación entre código (la imagen, descartable) y estado (el volumen, valioso) es lo que convierte una actualización de versión de GLPI en una operación de minutos, y no en una noche entera.

Artefacto: el stack de GLPI que aprovisionamos

Este es el esqueleto del compose que levantamos en cada despliegue, ya con volúmenes separados y sin credencial en texto plano dentro del archivo:

# docker-compose.yml - stack de GLPI en produccion
services:
  glpi:
    image: glpi/glpi:11.0        # tag fijo, nunca 'latest'
    restart: unless-stopped
    depends_on:
      - glpidb
    volumes:
      - glpi_files:/var/glpi     # archivos subidos y configuracion 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   # contrasena via secret, nunca en texto plano
    volumes:
      - glpi_db:/var/lib/mysql   # la base de datos vive aqui, fuera del contenedor
    networks: [ internal ]
    secrets: [ db_password ]

volumes:
  glpi_files:
  glpi_db:

networks:
  edge:      # expuesta al reverse proxy
  internal:  # base de datos privada, sin ruta externa
    internal: true

secrets:
  db_password:
    file: ./secrets/db_password.txt   # archivo 600, fuera de git

Los comandos que realmente usamos en el soporte

En el día a día, unos pocos comandos resuelven la mayoría de las intervenciones. Estos son los que el equipo escribe casi sin pensar:

ComandoCuándo lo usamos dando soporte a GLPI
docker compose up -dLevanta o actualiza el stack tras un cambio en el compose o en el tag de la imagen
docker compose logs -f glpiSigue el error de un ticket en tiempo real cuando el cliente reporta un fallo
docker compose exec glpi bashEntra al contenedor para ejecutar php bin/console (cron, caché, migración)
docker compose psVerifica que aplicación y base de datos estén arriba antes de abrir un incidente
docker statsDiagnostica picos de CPU y memoria cuando la queja es lentitud
docker compose down (sin -v)Recrea el stack conservando los volúmenes; el -v borraría la base de datos

El error común - y caro - que hemos visto en operadores descuidados es ejecutar docker compose down -v creyendo que solo reinicia los contenedores. La bandera -v elimina los volúmenes, y con ellos toda la base de datos de GLPI. En el soporte tratamos -v como un comando destructivo: no aparece en ningún procedimiento operativo, y todo backup de volumen se valida antes de cualquier mantenimiento que se acerque a él.

Buenas prácticas que aplicamos en producción

  • Tag fijo, nunca latest - fijamos la versión de la imagen (p. ej. glpi/glpi:11.0, mariadb:11.4) para que un pull no traiga una versión inesperada en mitad de un mantenimiento.
  • No-root y privilegio mínimo - la aplicación no se ejecuta como root, y la base de datos queda en la red internal, sin ruta externa, accesible solo por el contenedor de GLPI.
  • Secrets fuera del compose - la contraseña de la base de datos entra vía Docker secret o un archivo montado en solo lectura, nunca en environment: como texto plano commiteado en git.
  • El volumen es sagrado - base de datos, archivos y configuración en volúmenes con nombre, con un dump lógico diario de la base probado con una restauración real (un backup que nunca se restauró no es un backup).
  • Imágenes ligeras y escaneadas - base slim y escaneo con Trivy o Docker Scout para no llevar una CVE conocida a producción.

Un detalle que solo conoce quien da soporte a GLPI en contenedor: actualizar la versión de GLPI no es solo cambiar el tag de la imagen. Tras el docker compose up -d con la imagen nueva, hay que ejecutar la migración de la base de datos desde la consola dentro del contenedor, de lo contrario la aplicación arranca apuntando a un esquema antiguo y devuelve un error 500 en la primera pantalla. Por eso nuestro procedimiento de actualización siempre encadena el mismo orden: backup del volumen de la base, cambio del tag, up -d, migración y solo entonces la liberación del acceso al usuario. Cuando el cliente usa el plugin NexTool, ese mismo arranque recarga los módulos del ecosistema - así que también validamos la salud de las integraciones (colas de webhook, sincronización) antes de dar el entorno por estable.

Si tu operación de GLPI todavía corre instalada directamente en el servidor, sin volúmenes separados ni backup probado, NexTool implanta y da soporte a ese entorno en Docker de la forma correcta - con un stack versionado, actualizaciones predecibles y observabilidad junto al service desk. Habla con nosotros sobre soporte de GLPI en contenedores.


Este contenido fue producido con ayuda de inteligencia artificial y revisado por el equipo de Nextool Solutions.

Preguntas Frecuentes

Porque el stack en contenedor es reproducible y el estado (base de datos, archivos, configuración) queda aislado en volúmenes. Eso hace las actualizaciones de versión predecibles, el rollback trivial y el mantenimiento una operación de minutos, en lugar de una instalación manual difícil de reproducir en otro entorno.

En el día a día usamos docker compose up -d (levantar/actualizar), docker compose logs -f glpi (seguir errores en tiempo real), docker compose exec glpi bash (ejecutar la consola de GLPI), docker compose ps (verificar que app y base estén arriba) y docker stats (diagnosticar picos de CPU y memoria).

docker compose down por sí solo detiene y elimina los contenedores, pero conserva los volúmenes con nombre - la base de datos queda intacta. Lo que borra los datos es la bandera -v (docker compose down -v), que también elimina los volúmenes. Tratamos -v como un comando destructivo y nunca entra en procedimiento de rutina.

Lo que necesita backup es el estado, no la imagen. Hacemos un dump lógico diario de la base (desde el contenedor MariaDB) y una copia del volumen de archivos subidos y configuración. Sobre todo, probamos la restauración: un backup que nunca se restauró no cuenta como backup.

El orden importa: primero backup del volumen de la base, luego cambio del tag de la imagen, docker compose up -d, migración de la base desde la consola dentro del contenedor y solo entonces liberar el acceso. Saltarse la migración hace que la aplicación arranque con un esquema antiguo y devuelva un error 500.

?Necesitas ayuda?