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
Dockerfileou 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:
- "${PROD_STACK_NEXTCLOUD_DATA_PATH}:/var/www/html/data"
- Exemplo:
- 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 redeproxy.
- 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.
- Serviços: Os containers que compõem a aplicação (e.g.,
- 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-vmpelo playbook Ansiblesetup-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 naai-desktop-vm). - Stacks: Permite implantar e gerenciar aplicações definidas por arquivos
docker-compose.yml.- Você pode colar o conteúdo do
docker-compose.ymlno editor web. - Carregar variáveis de ambiente de um arquivo
.env(preparado pelo Ansible). - Definir secrets (variáveis de ambiente sensíveis) diretamente na UI do Portainer.
- Atualizar, parar, iniciar e remover stacks.
- Você pode colar o conteúdo do
- 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.
- Gerenciamento de Endpoints: Conecta-se ao Docker Engine local na
Fluxo de Deploy de um Serviço Docker com Portainer (Recapitulação)¶
- Preparação Ansible (Opcional, mas Recomendado):
- O playbook
setup-<stack>-volumes.ymlcria 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 e variáveis não sensíveis.
- O playbook
- No Portainer:
- Navegue para "Stacks" -> "+ Add stack".
- Dê um nome à stack.
- Cole o conteúdo do
docker-compose.ymlda aplicação. - Em "Environment variables" (modo avançado):
- "Load variables from .env file": Especifique o caminho para o arquivo
.envna VM (e.g.,/opt/portainer_stack_envs/minha_stack.env). - Adicione manualmente quaisquer secrets (senhas de DB, API keys) como variáveis de ambiente.
- "Load variables from .env file": Especifique o caminho para o arquivo
- Clique em "Deploy the stack".
- Verificação:
- Portainer executa os comandos
docker composepara criar as redes (se definidas no compose e nãoexternal), 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.
- Portainer executa os comandos
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.