Docker: Docker Swarm
Última atualização: 2026-08-26
Uma única instância Docker está com dificuldade para lidar com o tráfego? O Swarm permite escalar de 1 para 3 instâncias e implantar novas versões com zero downtime.
1. O Que Você Vai Aprender
- Arquitetura e Inicialização do Cluster Swarm
- A Diferença Entre um Serviço e um Contêiner
- Rolling Updates e Estratégias de Rollback
- Secrets e Gerenciamento de Configuração
- Roteamento de rede multi-nó
2. Uma História de Operações de E-commerce
(1) Ponto de Dor: Um único servidor não consegue lidar com o tráfego
O tráfego do negócio de e-commerce de Charlie disparou, e uma única instância Docker não conseguia lidar — durante os horários de pico, o uso da CPU atingia 100%, as respostas da API expiravam e as reclamações dos usuários chegavam em massa. Ele precisava escalar para vários servidores, mas iniciar contêineres manualmente em três servidores separados era complicado demais.
(2) Soluções com Clusters Docker Swarm
Charlie inicializou um cluster Swarm de 3 nós, escalou a API para 5 réplicas e implantou a nova versão usando rolling updates com zero downtime.
# Inicializar cluster Swarm
docker swarm init --advertise-addr 10.0.0.1
# Implantar serviço com 5 réplicas
docker service create --replicas 5 --name api -p 8080:80 myapp:v2
# Rolling update para v3
docker service update --image myapp:v3 api
(3) Benefícios: De uma única máquina a um cluster — feito em 5 minutos
Três servidores foram combinados em um cluster, com a API automaticamente distribuída em cinco réplicas e rolling updates realizados com zero downtime. A transição de um único servidor para um cluster levou apenas cinco minutos.
3. Arquitetura do Swarm
(1) Funções dos Nós
graph TB
MGR1["Nó Manager 1<br/>Líder"] --- MGR2["Nó Manager 2<br/>Reserva"]
MGR1 --- MGR3["Nó Manager 3<br/>Reserva"]
MGR1 --> WRK1["Nó Worker 1"]
MGR2 --> WRK2["Nó Worker 2"]
MGR3 --> WRK3["Nó Worker 3"]
| Função | Responsabilidades | Quantidade | Executa Contêineres |
|---|---|---|---|
| Manager | Gerenciamento do cluster, agendamento, API | Número ímpar (3/5/7) | ✅ Opcional |
| Worker | Executa tarefas, executa contêineres | Qualquer | ✅ Obrigatório |
(1) Serviço vs Contêiner
| Dimensão | Contêiner | Serviço |
|---|---|---|
| Método de Criação | docker run |
docker service create |
| Número de Réplicas | 1 | Réplicas configuráveis |
| Auto-cura | Requer política de restart | ✅ Mantém automaticamente o número de réplicas |
| Balanceamento de Carga | Nenhum | ✅ Routing Mesh |
| Rolling Updates | Manual | ✅ Integrado |
| Casos de Uso | Desenvolvimento em máquina única | Produção em cluster |
4. Inicialização do Swarm
▶ Exemplo: Inicializando com swarm init (Dificuldade: ⭐⭐)
# No nó Manager: inicializar o swarm
docker swarm init --advertise-addr 10.0.0.1
# A saída inclui o token de ingresso para workers
# docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
# Nos nós Worker: ingressar no swarm
docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
# Listar todos os nós
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
abc123 * manager1 Ready Active Leader
def456 worker1 Ready Active
ghi789 worker2 Ready Active
5. Gerenciamento de Serviços
▶ Exemplo: Implantação com service create (Dificuldade: ⭐⭐)
# Criar um serviço com 3 réplicas
docker service create \
--name web \
--replicas 3 \
--publish 80:80 \
nginx:1.25-alpine
# Listar serviços
docker service ls
# Verificar tarefas do serviço (contêineres)
docker service ps web
▶ Exemplo: Escalonamento com Service Scale (Dificuldade: ⭐⭐)
# Escalar para 5 réplicas
docker service scale web=5
# Verificar
docker service ps web
▶ Exemplo: service update — rolling update (Dificuldade: ⭐⭐⭐)
# Rolling update: atualizar 2 contêineres por vez com atraso de 30s
docker service update \
--image nginx:1.26-alpine \
--update-parallelism 2 \
--update-delay 30s \
--update-failure-action rollback \
web
# Verificar status da atualização
docker service inspect web --format='{{.UpdateStatus.State}}'
(1) Estratégia de Rolling Update
| Parâmetro | Valor Padrão | Descrição |
|---|---|---|
--update-parallelism |
1 | Quantas masmorras são adicionadas a cada atualização? |
--update-delay |
0s | Tempo de espera entre lotes |
--update-failure-action |
pause | Ação em caso de falha (pause/rollback/continue) |
--update-monitor |
5s | Tempo de monitoramento após a atualização |
▶ Exemplo: Rollback de Serviço (Dificuldade: ⭐⭐)
# Reverter para a versão anterior
docker service rollback web
6. Secrets e Gerenciamento de Configuração
▶ Exemplo: Criando e Usando Docker Secrets (Dificuldade: ⭐⭐⭐)
# Criar um secret a partir de um arquivo
echo "my_super_secret_password" | docker secret create db_password -
# Usar o secret em um serviço
docker service create \
--name api \
--secret db_password \
-e DB_PASSWORD_FILE=/run/secrets/db_password \
myapp:1.0
/run/secrets/<name> e não são expostos em variáveis de ambiente.
7. Routing Mesh
(1) Mecanismos de Roteamento de Rede
O Routing Mesh do Swarm permite que qualquer porta em qualquer nó seja roteada para qualquer réplica de um serviço — mesmo que essa réplica não esteja no nó atual.
graph LR
A["Nó 1<br/>:80"] -->|"requisição"| B["Routing Mesh"]
C["Nó 2<br/>:80"] --> B
B -->|"round-robin"| D["Réplica 1<br/>Nó 1"]
B --> E["Réplica 2<br/>Nó 2"]
B --> F["Réplica 3<br/>Nó 3"]
| Padrão | Sintaxe | Descrição |
|---|---|---|
| VIP (Padrão) | --publish 80:80 |
IP Virtual + Balanceamento de Carga |
| DNSRR | --endpoint-mode dnsrr |
DNS round-robin, sem VIP |
8. Comparação entre Swarm e Compose
| Dimensão | Docker Compose | Docker Swarm |
|---|---|---|
| Número de Nós | Nó Único | Cluster Multi-Nó |
| Alta Disponibilidade | ❌ | ✅ Redundância de Manager |
| Auto-cura de Serviço | Política de Restart | ✅ Mantém Número de Réplicas |
| Rolling Updates | Manual | ✅ Integrado |
| Balanceamento de Carga | Nginx/DNS Round-Robin | ✅ Routing Mesh |
| Secrets | Variáveis de Ambiente | ✅ Armazenamento Criptografado |
| Método de implantação | docker compose up |
docker stack deploy |
▶ Exemplo: Implantando um arquivo Compose no Swarm usando stack deploy (Dificuldade: ⭐⭐⭐)
# Implantar um arquivo compose como uma stack
docker stack deploy -c docker-compose.yml mystack
# Listar stacks
docker stack ls
# Listar serviços em uma stack
docker stack services mystack
# Remover uma stack
docker stack rm mystack
9. Exemplo Completo: Implantando um Cluster de Três Nós
# ============================================
# Passo a passo completo: Cluster Swarm de 3 nós
# Abrange: init, join, service, scale, update
# ============================================
# --- No Manager (10.0.0.1) ---
# 1. Inicializar Swarm
docker swarm init --advertise-addr 10.0.0.1
# 2. Obter token de ingresso para worker
docker swarm join-token worker
# --- Nos Workers (10.0.0.2, 10.0.0.3) ---
# 3. Ingressar no swarm (cole o token da etapa 2)
docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
# --- No Manager ---
# 4. Verificar cluster
docker node ls
# 5. Implantar serviço web com 5 réplicas
docker service create \
--name web \
--replicas 5 \
--publish 80:80 \
--restart-condition on-failure \
nginx:1.25-alpine
# 6. Verificar distribuição entre nós
docker service ps web
# 7. Rolling update para v1.26
docker service update \
--image nginx:1.26-alpine \
--update-parallelism 2 \
--update-delay 30s \
web
# 8. Simular falha de nó
docker node update --availability drain worker1
docker service ps web # Réplicas reagendadas
# 9. Restaurar nó
docker node update --availability active worker1
# 10. Reduzir escala
docker service scale web=2
# 11. Limpar
docker service rm web
docker swarm leave --force # No manager
❓ Perguntas Frequentes
P: Qual é o número mínimo de servidores necessários para o Swarm? R: Pode ser executado em apenas um servidor (para desenvolvimento/teste). Para produção, recomendamos 3 ou mais Managers (número ímpar, pois o consenso Raft requer maioria) mais N Workers. Pelo menos um Manager é necessário, mas o cluster se torna inadministrável se um único Manager falhar.
P: Onde os dados do Swarm são armazenados? R: Nos logs Raft nos nós Manager (
/var/lib/docker/swarm/). Esses logs contêm o estado do cluster, definições de serviço, Secrets e mais. Se um nó Manager falhar, os outros nós Manager elegem um novo Líder usando o protocolo Raft. Recomenda-se fazer backup dos logs Raft regularmente.
P: Como o Routing Mesh realiza balanceamento de carga? R: Modo VIP (IP Virtual) do Swarm: Cada serviço recebe um IP virtual. Quando uma requisição chega ao VIP, o balanceador de carga IPVS do kernel a distribui entre as várias réplicas. Todos os nós escutam na porta publicada, então as requisições podem ser roteadas para uma réplica em qualquer nó.
P: Como configuro TLS para o Swarm? R: O Swarm possui mTLS (TLS mútuo) integrado, que criptografa automaticamente a comunicação entre os nós. Os certificados são gerados automaticamente durante a inicialização, sem necessidade de configuração manual. A comunicação entre Managers e entre Managers e Workers é criptografada.
P: Quais mudanças são necessárias para migrar do Compose para o Swarm? R: A maioria dos arquivos docker-compose.yml pode ser usada como está com
docker stack deploy. Notas importantes: ① Substituabuildporimage(Swarm não oferece suporte abuild); ②volumessó oferece suporte a volumes nomeados e NFS; ③depends_onsó oferece suporte astarted— não oferece suporte aservice_healthy; ④ Adicione um blocodeploypara configurar as estratégias dereplicaseupdate.
📖 Resumo
- Swarm = Orquestração de contêineres integrada do Docker: Managers lidam com o agendamento, enquanto Workers executam contêineres
- Service em vez de Container: Especifique o número de réplicas, auto-cura automática, balanceamento de carga integrado
- Atualizações ao Vivo:
--update-parallelism+--update-delayDefinem o Ritmo - Routing Mesh: Portas em qualquer nó são automaticamente roteadas para todas as réplicas de um serviço
- Armazenamento criptografado de Secrets: Não exposto em variáveis de ambiente; lido de um arquivo dentro do contêiner
docker stack deploy -c compose.ymlArquivos Compose podem ser implantados diretamente no Swarm
📝 Exercícios
- Exercício Básico (Dificuldade: ⭐): Inicialize o Swarm em uma única máquina, crie um serviço Nginx com 3 réplicas e verifique se
docker service psexibe a distribuição das réplicas. - Exercício Avançado (Dificuldade: ⭐⭐): Realize um rolling update (nginx: 1.25 → 1.26) e observe o processo de atualização em
docker service ps. - Desafio (Dificuldade: ⭐⭐⭐): Configure um cluster Swarm em três máquinas virtuais, implante um serviço API com cinco réplicas, simule a falha de um nó worker e verifique se as réplicas migram automaticamente para outros nós.