Ir para o conteúdo

Gerenciamento de Containers com Docker e Portainer

Containers Docker são a tecnologia fundamental para empacotar, distribuir e executar as diversas aplicações e serviços do nosso servidor doméstico. Portainer fornece uma interface gráfica amigável para gerenciar esses containers.

Docker e Docker Compose: A Base da Containerização

O que são Containers Docker?

  • Isolamento Leve: Containers fornecem isolamento em nível de processo e sistema de arquivos, permitindo que múltiplas aplicações rodem em um mesmo sistema operacional (na VM, neste caso) sem interferir umas com as outras. Eles compartilham o kernel do SO da VM host.
  • Portabilidade: Uma imagem Docker contém a aplicação e todas as suas dependências. Isso garante que a aplicação rodará da mesma forma em qualquer ambiente que suporte Docker.
  • Eficiência de Recursos: Comparados a VMs completas, containers são muito mais leves, consomem menos recursos (CPU, RAM, disco) e iniciam mais rapidamente.
  • Imagens Docker: São templates read-only que definem o container. São construídas a partir de um Dockerfile ou baixadas de registros como o Docker Hub (e.g., plexinc/pms-docker, nextcloud:latest).
  • Containers Docker: São instâncias executáveis de imagens Docker.

Docker Compose para Aplicações Multi-Container (Stacks)

Muitas aplicações modernas são compostas por múltiplos serviços interdependentes (e.g., Nextcloud app + banco de dados + Redis). Docker Compose simplifica a definição e o gerenciamento dessas aplicações.

  • Arquivo docker-compose.yml: Um arquivo YAML que define:
    • Serviços: Os containers que compõem a aplicação (e.g., nextcloud_app, nextcloud_db).
    • Imagem: A imagem Docker a ser usada para cada serviço.
    • Volumes: Como os dados persistentes são mapeados do host (neste caso, dos montados NFS na VM) para dentro do container. Isso garante que os dados sobrevivam a reinícios ou recriações do container.
      • Exemplo: - "${CLOUD_STACK_NEXTCLOUD_DATA_PATH}:/data"
    • Redes: As redes Docker às quais os containers se conectarão. Permite comunicação isolada ou controlada entre serviços.
      • proxy: Para serviços que precisam ser expostos externamente via Traefik.
      • internal_services: Para comunicação backend entre containers que não precisam de acesso direto da rede proxy.
    • Portas (Opcional): Mapeamento de portas do host (VM) para o container, se não for usar um proxy reverso como Traefik para todo o acesso.
    • Variáveis de Ambiente: Para passar configurações para os containers.
    • Labels: Metadados, crucialmente usados pelo Traefik para descoberta de serviços e configuração de roteamento.
  • Comandos: docker compose up -d (para iniciar uma stack em background), docker compose down (para parar e remover containers da stack), docker compose logs (para ver logs). O Portainer abstrai esses comandos.

Portainer: Interface Gráfica para Gerenciamento Docker

Embora o Docker Compose seja poderoso na linha de comando, o Portainer oferece uma interface web intuitiva para gerenciar seus ambientes Docker.

  • Instalação: Portainer foi instalado como um container Docker na core-services-vm pelo playbook Ansible setup-base-ubuntu.yml.
  • Funcionalidades Principais Usadas Neste Guia:
    • Gerenciamento de Endpoints: Conecta-se ao Docker Engine local na core-services-vm. Opcionalmente, pode gerenciar outros Docker Engines remotos via Portainer Agent (como na ai-desktop-vm).
    • Stacks: Permite implantar e gerenciar aplicações definidas por arquivos docker-compose.yml.
      • Você pode colar o conteúdo do docker-compose.yml no editor web.
      • Carregar variáveis de ambiente de um arquivo .env preparado pelo Ansible, que já traz os segredos do vault (nada é digitado na UI).
      • Atualizar, parar, iniciar e remover stacks.
    • Containers: Listar, inspecionar, ver logs, abrir console, parar, iniciar, remover containers individuais.
    • Volumes: Listar e gerenciar volumes Docker (embora neste guia, os volumes principais sejam mapeamentos de caminhos NFS, não volumes Docker gerenciados pelo Portainer).
    • Redes: Listar e gerenciar redes Docker.
    • Imagens: Listar, puxar e remover imagens Docker.

Fluxo de Deploy de um Serviço Docker com Portainer (Recapitulação)

  1. Preparação Ansible:
    • O playbook setup-<stack>-volumes.yml cria os diretórios necessários nos volumes NFS na VM de destino.
    • Gera um arquivo .env (e.g., /opt/portainer_stack_envs/minha_stack.env) na VM com caminhos de volume, variáveis e segredos do vault (modo 0600).
  2. No Portainer:
    • Navegue para "Stacks" -> "+ Add stack".
    • Dê um nome à stack.
    • Cole o conteúdo do docker-compose.yml da aplicação.
    • Em "Environment variables" (modo avançado):
      • Cole o conteúdo do .env que o playbook gerou na VM (/opt/portainer_stack_envs/<stack>.env). O botão "Load variables from .env file" lê um arquivo do seu computador, não da VM (como).
    • Clique em "Deploy the stack".
  3. Verificação:
    • Portainer executa os comandos docker compose para criar as redes (se definidas no compose e não external), puxar imagens e iniciar os containers.
    • Verifique os logs dos containers no Portainer para garantir que tudo iniciou corretamente.
    • Se o serviço usa Traefik para exposição, Traefik (se configurado com labels corretas no compose) deve detectar o novo serviço e configurar o roteamento e SSL.

Esta combinação de Docker, Docker Compose e Portainer oferece uma maneira poderosa e flexível de executar uma ampla gama de aplicações no seu servidor doméstico, mantendo a organização e facilitando o gerenciamento. Os volumes NFS garantem que os dados importantes das suas aplicações sejam armazenados de forma segura e persistente no seu pool ZFS.