Docker: guia melhores práticas e comandos mais usados

Como a NexTool roda e sustenta o GLPI em Docker para clientes: arquitetura com volumes separados, um docker-compose de produção, os comandos que realmente usamos no suporte e as boas práticas (tag fixa, não-root, secrets e backup de volume).

Docker deixou de ser moda e virou a forma padrão como entregamos e sustentamos GLPI para clientes. Em vez de instalar PHP, MariaDB e servidor web direto no sistema operacional, empacotamos o GLPI e suas dependências em contêineres versionados - o que torna a instalação reproduzível, o rollback trivial e a manutenção previsível. Este guia reúne os comandos que realmente usamos no dia a dia da sustentação e as práticas que aplicamos para rodar o service desk em produção com segurança.

Como rodamos o GLPI em Docker

A arquitetura que padronizamos é deliberadamente enxuta: um contêiner para a aplicação GLPI (PHP-FPM e servidor web), um para o banco MariaDB e, quando o volume de chamados justifica, um Redis para sessão e cache. Tudo orquestrado por um único docker-compose.yml, atrás de um reverse proxy com TLS. Os dados que precisam sobreviver a qualquer recriação de contêiner - banco, arquivos enviados e configuração - vivem em volumes nomeados, nunca dentro do contêiner. Essa separação entre código (a imagem, descartável) e estado (o volume, precioso) é o que transforma uma atualização de versão do GLPI numa operação de minutos, e não numa madrugada inteira.

Artefato: a stack GLPI que provisionamos

Este é o esqueleto do compose que sobe em toda implantação, já com volumes separados e sem credencial em texto plano dentro do arquivo:

# docker-compose.yml - stack GLPI de producao
services:
  glpi:
    image: glpi/glpi:11.0        # tag fixa, nunca 'latest'
    restart: unless-stopped
    depends_on:
      - glpidb
    volumes:
      - glpi_files:/var/glpi     # arquivos enviados e configuracao do 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   # senha via secret, nunca em texto plano
    volumes:
      - glpi_db:/var/lib/mysql   # o banco vive aqui, fora do container
    networks: [ internal ]
    secrets: [ db_password ]

volumes:
  glpi_files:
  glpi_db:

networks:
  edge:      # exposta ao reverse proxy
  internal:  # banco privado, sem rota externa
    internal: true

secrets:
  db_password:
    file: ./secrets/db_password.txt   # arquivo 600, fora do git

Os comandos que realmente usamos na sustentação

No dia a dia de suporte, poucos comandos resolvem a maioria das intervenções. Estes são os que a equipe digita quase sem pensar:

ComandoQuando usamos na sustentação do GLPI
docker compose up -dSobe ou atualiza a stack após uma mudança no compose ou na tag da imagem
docker compose logs -f glpiAcompanha o erro de um chamado em tempo real quando o cliente relata falha
docker compose exec glpi bashEntra no contêiner para rodar php bin/console (cron, cache, migração)
docker compose psConfere se aplicação e banco estão de pé antes de abrir um incidente
docker statsDiagnostica pico de CPU e memória quando a queixa é lentidão
docker compose down (sem -v)Recria a stack preservando os volumes; o -v apagaria o banco

O erro comum - e caro - que já vimos em quem opera sem cuidado é rodar docker compose down -v achando que só vai reiniciar os contêineres. A flag -v remove os volumes, e com eles o banco inteiro do GLPI. Na sustentação, tratamos -v como comando destrutivo: ele não aparece em nenhum procedimento operacional, e todo backup de volume é validado antes de qualquer manutenção que chegue perto dele.

Boas práticas que aplicamos em produção

  • Tag fixa, nunca latest - fixamos a versão da imagem (ex.: glpi/glpi:11.0, mariadb:11.4) para que um pull não traga uma versão inesperada no meio de uma manutenção.
  • Não-root e privilégio mínimo - a aplicação não roda como root, e o banco fica na rede internal, sem rota externa, acessível apenas pelo contêiner do GLPI.
  • Secrets fora do compose - a senha do banco entra via Docker secret ou arquivo montado somente-leitura, nunca em environment: em texto plano commitado no git.
  • O volume é sagrado - banco, arquivos e configuração em volumes nomeados, com dump lógico diário do banco testado com restauração real (backup que nunca foi restaurado não é backup).
  • Imagens enxutas e escaneadas - base slim e varredura com Trivy ou Docker Scout para não levar CVE conhecida para produção.

Um detalhe que só quem sustenta GLPI em contêiner conhece: atualizar a versão do GLPI não é apenas trocar a tag da imagem. Depois do docker compose up -d com a imagem nova, é preciso rodar a migração de banco pelo console dentro do contêiner, senão a aplicação sobe apontando para um schema antigo e responde erro 500 na primeira tela. Por isso nosso procedimento de atualização sempre encadeia a mesma ordem: backup do volume do banco, troca da tag, up -d, migração e só então liberação do acesso ao usuário. Quando o cliente usa o plugin NexTool, essa mesma subida recarrega os módulos do ecossistema - então validamos também a saúde das integrações (filas de webhook, sincronização) antes de dar o ambiente por estável.

Se a sua operação de GLPI ainda roda instalada direto no servidor, sem volumes separados nem backup testado, a NexTool implanta e sustenta esse ambiente em Docker do jeito certo - com stack versionada, atualização previsível e observabilidade ao lado do service desk. Fale com a gente sobre sustentação de GLPI em contêiner.


Este conteúdo foi produzido com auxílio de inteligência artificial e revisado pela equipe Nextool Solutions.

Perguntas Frequentes

Porque a stack em contêiner é reproduzível e o estado (banco, arquivos, configuração) fica isolado em volumes. Isso torna a atualização de versão previsível, o rollback trivial e a manutenção uma operação de minutos, em vez de uma instalação manual difícil de repetir em outro ambiente.

No dia a dia usamos docker compose up -d (subir/atualizar), docker compose logs -f glpi (acompanhar erro em tempo real), docker compose exec glpi bash (rodar o console do GLPI), docker compose ps (conferir se app e banco estão de pé) e docker stats (diagnosticar pico de CPU e memória).

docker compose down sozinho para e remove os contêineres, mas preserva os volumes nomeados - o banco continua intacto. O que apaga os dados é a flag -v (docker compose down -v), que remove também os volumes. Tratamos o -v como comando destrutivo e ele nunca entra em procedimento de rotina.

O que precisa de backup é o estado, não a imagem. Fazemos dump lógico diário do banco (a partir do contêiner MariaDB) e cópia do volume de arquivos enviados e configuração. E, principalmente, testamos a restauração: backup que nunca foi restaurado não conta como backup.

A ordem importa: primeiro backup do volume do banco, depois troca da tag da imagem, docker compose up -d, migração de banco pelo console dentro do contêiner e só então liberação do acesso. Pular a migração faz a aplicação subir com schema antigo e responder erro 500.

Precisa de ajuda?