Docker Swarm: Como Implementar Alta Disponibilidade Simples

11 min de leitura Containers
Docker Swarm: Como Implementar Alta Disponibilidade Simples

Docker Swarm é uma ferramenta de orquestração de containers nativa do Docker Engine. Ele transforma um grupo de máquinas Docker em um único cluster virtual, oferecendo alta disponibilidade e escalabilidade sem a complexidade excessiva de outras soluções como Kubernetes. Este tutorial guia você pelo processo de configurar um cluster Docker, definir serviços replicados e garantir que sua aplicação permaneça online mesmo durante falhas de nós ou atualizações.

A orquestração de containers é essencial para ambientes de produção modernos. Ao utilizar o Swarm, você delega a gestão do ciclo de vida dos contêineres para o motor do Docker, permitindo deploy automatizado, balanceamento de carga integrado e recuperação automática de falhas. Este guia foca em uma implementação prática, ideal para pequenas e médias equipes DevOps que buscam infraestrutura como código simples e eficiente.

Pré-requisitos e Arquitetura do Cluster

Antes de iniciar a configuração, é fundamental entender a arquitetura básica. Um cluster Docker Swarm consiste em dois tipos de nós: Managers (Gerenciadores) e Workers (Trabalhadores). Os Managers coordenam o estado do cluster, agendam tarefas e gerenciam serviços. Os Workers executam os contêineres reais. Para alta disponibilidade, recomenda-se ter um número ímpar de nós Manager (idealmente 3 ou 5) para evitar divisões de cérebro em caso de falhas de rede.

Para este tutorial, simularemos uma infraestrutura com três servidores Linux Ubuntu 22.04 LTS. Você precisará de acesso root ou um usuário com privilégios sudo em todas as máquinas. As tarefas serão divididas nas seguintes etapas:

  • Inicialização do nó Manager principal.
  • Junção dos nós Workers ao cluster.
  • Criação de uma rede overlay para comunicação segura entre serviços.
  • Deploy de um serviço replicado com regras de alta disponibilidade.
  • Simulação de falha e verificação da recuperação automática.

Passo 1: Inicialização do Nó Manager

A primeira etapa é transformar um dos servidores no líder do cluster. Conecte-se ao primeiro servidor via SSH e execute o comando docker swarm init. Este comando inicializa o modo Swarm no Docker Engine local e gera um token de join que será utilizado pelos outros nós para ingressar no cluster.

Ao executar o comando, o Docker exibirá duas mensagens importantes: uma instrução para conectar outros gerenciadores e outra para conectar trabalhadores. Copie os comandos exibidos, pois eles serão necessários nos passos seguintes. Se você estiver em um ambiente de teste local ou virtualizado, pode usar a flag --advertise-addr para especificar o IP público do nó, caso o Docker não detecte o endereço corretamente.

docker swarm init --advertise-addr <IP_DO_SERVIDOR_1>

O output será semelhante a este:

Swarm initialized: current node (dxn1zf5l6oafv3gbycl29q6ym) is now a manager.

To add a worker to this cluster, run the following command:

    docker swarm join --token <TOKEN> <IP_DO_SERVIDOR_1>:2377

To add a manager to this cluster, run 'docker swarm join-token manager' and follow the instructions.

Agora, conecte-se aos outros dois servidores e execute o comando de join exibido acima. Isso os adicionará como nós Managers também, criando um conjunto de gerenciamento tolerante a falhas.

docker swarm join --token <TOKEN> <IP_DO_SERVIDOR_1>:2377

Após adicionar todos os nós Managers, verifique o status do cluster executando docker node ls no nó principal. Você deverá ver três nós com o status "Ready" e a disponibilidade "Active".

Passo 2: Adicionando Nós Workers

Para separar responsabilidades e melhorar a segurança, adicione servidores dedicados apenas para executar cargas de trabalho. Crie novos servidores Linux e conecte-se a eles via SSH. Execute o comando de join para workers, que pode ser obtido no nó Manager principal executando docker swarm join-token worker.

docker swarm join --token <TOKEN_WORKER> <IP_DO_SERVIDOR_1>:2377

Retorne ao nó Manager e execute novamente docker node ls. Agora, você deve ver três nós Managers e os novos nós Workers listados. A distribuição de carga será gerenciada pelo scheduler do Swarm automaticamente.

Passo 3: Criando uma Rede Overlay

Uma das grandes vantagens da orquestração de containers é o roteamento de malha (ingress routing mesh). No Docker Swarm, as redes overlay permitem que os contêineres em nós diferentes se comuniquem entre si usando nomes DNS internos. Para garantir alta disponibilidade e isolamento, crie uma rede overlay dedicada para sua aplicação.

No nó Manager, execute o comando abaixo para criar a rede. Utilize a flag --driver overlay para garantir que a rede seja distribuída em todos os nós do cluster.

docker network create --driver overlay app-network

Você pode verificar as redes disponíveis com docker network ls. A rede app-network estará disponível globalmente para todos os serviços que a solicitarem durante o deploy.

Passo 4: Deploy do Serviço com Alta Disponibilidade

Agora vem o coração da configuração de alta disponibilidade. Vamos criar um serviço simples, como uma imagem Nginx, mas configurado para rodar múltiplas réplicas distribuídas entre os nós Workers. Isso garante que, se um nó falhar, as outras réplicas continuarão atendendo às requisições.

Utilize o comando docker service create. As flags principais são:

  • --name: Nome do serviço.
  • --replicas: Número de instâncias desejadas.
  • --network: Rede overlay a ser utilizada.
  • --mode global ou replicated: Modo de implantação.

Para este exemplo, vamos criar 3 réplicas do Nginx na nossa rede criada anteriormente:

docker service create \
  --name web-frontend \
  --replicas 3 \
  --network app-network \
  --publish published=8080,target=80 \
  nginx:latest

A flag --publish mapeia a porta 8080 do host para a porta 80 do contêiner. No Docker Swarm, isso cria uma regra de roteamento de malha, permitindo que você acesse o serviço através da porta 8080 em qualquer um dos nós do cluster, não apenas no nó onde o contêiner está rodando.

Verifique se o serviço está rodando corretamente com:

docker service ps web-frontend

O output mostrará cada réplica e em qual nó ela está alocada. Você deve ver três tarefas, distribuídas entre os nós disponíveis.

Passo 5: Simulação de Falha e Recuperação Automática

A verdadeira prova de conceito de alta disponibilidade é a resiliência. Vamos simular uma falha crítica em um dos nós Workers para observar como o Swarm reage.

Conecte-se ao servidor que está hospedando uma das réplicas do serviço (identificado no passo anterior). Pare o Docker Engine nesse nó ou reinicie a máquina:

sudo systemctl stop docker

Volte ao seu nó Manager e execute docker service ps web-frontend. Você notará que uma das tarefas mudou de status para "Failed" ou "Shutdown". O scheduler do Docker Swarm detectou imediatamente a indisponibilidade do nó.

Em questão de segundos, o Swarm agendará automaticamente uma nova réplica em um dos outros nós disponíveis. Verifique novamente o output do comando docker service ps. Você verá que uma nova tarefa está sendo provisionada ("Starting") e logo após será concluída ("Running").

Enquanto isso, se você acessar a porta 8080 de qualquer nó restante via navegador ou curl, o serviço continuará respondendo. Isso demonstra que a interrupção foi transparente para o usuário final.

curl http://<IP_DE_QUALQUER_NO>:8080

Passo 6: Escalando e Atualizando Serviços (Rolling Updates)

Além da tolerância a falhas, o Swarm facilita atualizações sem downtime. Suponha que você precise atualizar a imagem do Nginx para uma versão mais recente ou alterar a configuração.

O Docker Swarm suporta rolling updates, que atualizam as réplicas uma por vez, garantindo que parte da aplicação continue online durante o processo.

Para atualizar a imagem:

docker service update --image nginx:alpine web-frontend

O Swarm irá parar uma réplica antiga, puxar a nova imagem e iniciar a nova réplica. Só então ele prosseguirá com a próxima réplica, até que todas estejam na versão nginx:alpine.

Você pode monitorar o progresso da atualização com:

docker service ps web-frontend --no-trunc

Se algo der errado durante a atualização, você pode reverter para a versão anterior usando a flag --rollback:

docker service update --rollback web-frontend

Passo 7: Monitoramento e Logs Centralizados

Em um ambiente de orquestração, gerenciar logs em múltiplos servidores é inviável. O Docker Swarm coleta automaticamente os logs stdout/stderr de todos os contêineres e os disponibiliza centralizadamente.

Para visualizar os logs do serviço web-frontend, use:

docker service logs web-frontend

O comando agregará logs de todas as réplicas em um único fluxo, facilitando a depuração. Você pode usar flags como -f para seguir os logs em tempo real ou --tail 100 para ver apenas as últimas linhas.

Boas Práticas para Produção

Embora o Docker Swarm seja simples, alguns ajustes são recomendados para ambientes de produção reais:

  • Restrições de Locação (Constraints): Use --constraint no deploy do serviço para garantir que certos serviços rodem apenas em nós com hardware específico ou em zonas de disponibilidade distintas.
  • Volumes Persistente: Para dados que não podem ser perdidos, utilize volumes Docker ou conecte-se a sistemas de armazenamento externo (como NFS ou block storage). O Swarm gerencia a montagem desses volumes, mas a integridade dos dados depende do sistema de arquivo subjacente.
  • Segurança de Segredos: Nunca coloque senhas ou chaves de API diretamente no Dockerfile ou nas variáveis de ambiente. Utilize docker secret para injetar credenciais de forma segura nos contêineres apenas quando necessário.
  • Healthchecks: Defina comandos de verificação de saúde (--health-cmd) ao criar serviços. O Swarm reiniciará automaticamente contêineres que falharem nessas verificações, aumentando a confiabilidade.

Conclusão

A configuração de um cluster Docker Swarm oferece uma abordagem equilibrada entre funcionalidade e simplicidade. Ao contrário de soluções mais pesadas, o Swarm aproveita a familiaridade do Docker CLI, permitindo que equipes DevOps implementem infraestrutura como código e automação com curva de aprendizado reduzida.

Neste tutorial, você aprendeu a inicializar um cluster, distribuir cargas de trabalho, garantir resiliência através de réplicas e realizar atualizações sem interrupção. Esses conceitos são fundamentais para qualquer profissional que busque dominar a containerização moderna e a orquestração de containers em ambientes Linux.

A alta disponibilidade não é apenas sobre ter redundância; é sobre garantir que o serviço continue operando diante de falhas imprevisíveis. Com o Docker Swarm, essa capacidade está integrada nativamente, permitindo que você foque no desenvolvimento da aplicação enquanto a infraestrutura cuida da sua própria estabilidade.

Para próximos passos, explore a integração com ferramentas de CI/CD para automatizar o deploy de novas versões do seu código diretamente para o cluster Swarm, fechando o ciclo completo de entrega contínua e infraestrutura resiliente.

Compartilhar: Link copiado!
Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000