promovaweb-devops-docker-swarm
Skill de Docker Swarm
Domine o Docker Swarm para orquestração de containers, gerenciamento de cluster e implantações (deployments) em produção.
Propósito
Configurar e gerenciar clusters Docker Swarm para alta disponibilidade, escalonamento de serviços e orquestração em produção.
Parâmetros
| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
| managers | number | Não | 3 | Número de nós (nodes) managers |
| workers | number | Não | - | Número de nós (nodes) workers |
| encrypted | boolean | No | true | Criptografar redes overlay |
Configuração do Cluster
Inicializar Swarm
# Inicializar no primeiro manager
docker swarm init --advertise-addr <MANAGER_IP>
# Obter tokens de adesão
docker swarm join-token worker
docker swarm join-token manager
# Entrar como worker
docker swarm join --token <WORKER_TOKEN> <MANAGER_IP>:2377
# Entrar como manager
docker swarm join --token <MANAGER_TOKEN> <MANAGER_IP>:2377
Alta Disponibilidade (3 ou 5 managers)
# Quorum do Manager: N/2 + 1
# 3 managers = tolera 1 falha
# 5 managers = tolera 2 falhas
Implantação de Serviço (Service Deployment)
Serviço Básico
# Criar serviço
docker service create \
--name webapp \
--replicas 3 \
--publish 80:80 \
nginx:alpine
# Escalar
docker service scale webapp=5
# Atualizar imagem
docker service update --image nginx:1.25-alpine webapp
# Rollback
docker service rollback webapp
Configuração Completa de Serviço
docker service create \
--name api \
--replicas 3 \
--network backend \
--publish 8080:3000 \
--mount type=volume,source=data,target=/data \
--secret db_password \
--env NODE_ENV=production \
--limit-cpu 0.5 \
--limit-memory 512M \
--update-delay 10s \
--update-parallelism 1 \
--update-failure-action rollback \
--health-cmd "curl -f http://localhost:3000/health" \
--health-interval 30s \
myapp:latest
Implantação de Stack (Stack Deployment)
Stack de Produção
# stack.yaml
services:
frontend:
image: frontend:${VERSION:-latest}
deploy:
replicas: 3
placement:
constraints:
- node.role == worker
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
resources:
limits:
cpus: '0.5'
memory: 256M
ports:
- "80:80"
networks:
- frontend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
backend:
image: backend:${VERSION:-latest}
deploy:
replicas: 3
secrets:
- db_password
networks:
- frontend
- backend
networks:
frontend:
driver: overlay
backend:
driver: overlay
internal: true
secrets:
db_password:
external: true
# Implantar stack
docker stack deploy -c stack.yaml myapp
# Listar serviços
docker stack services myapp
# Remover stack
docker stack rm myapp
Secrets & Configs
Secrets
# Criar secret
echo "password" | docker secret create db_password -
# Usar no serviço
docker service update --secret-add db_password myservice
# Rotacionar secret
echo "newpassword" | docker secret create db_password_v2 -
docker service update \
--secret-rm db_password \
--secret-add source=db_password_v2,target=db_password \
myservice
Configs
# Criar config
docker config create nginx_config ./nginx.conf
# Usar no serviço
docker service create \
--config source=nginx_config,target=/etc/nginx/nginx.conf \
nginx
Gerenciamento de Nós (Node Management)
# Listar nós
docker node ls
# Drenar nó (manutenção)
docker node update --availability drain <node>
# Ativar nó
docker node update --availability active <node>
# Adicionar label
docker node update --label-add role=database <node>
# Promover a manager
docker node promote <node>
# Rebaixar de manager
docker node demote <node>
Tratamento de Erros
Erros Comuns
| Erro | Causa | Solução |
|---|---|---|
no suitable node |
Restrições não atendidas | Relaxe ou adicione nós |
not converging |
Falha no health check | Verifique os logs do serviço |
Raft: no leader |
Quorum perdido | Restaure os managers |
Recuperação de Manager
# Se o quorum for perdido, force um novo cluster
docker swarm init --force-new-cluster --advertise-addr <IP>
Solução de Problemas (Troubleshooting)
Checklist de Depuração
- Swarm ativo?
docker info | grep Swarm - Nós saudáveis?
docker node ls - Serviço rodando?
docker service ls - Tasks alocadas?
docker service ps <svc>
Diagnósticos
# Status do serviço
docker service ls
# Status da task
docker service ps <service> --no-trunc
# Logs do serviço
docker service logs -f <service>
# Problemas no nó
docker node inspect <node> --pretty
More from promovaweb/skills-devops
promovaweb-devops-docker
Verifica o ambiente Docker do servidor — versão do Docker Engine, status do Swarm, nós do cluster, rede network_swarm_public, volumes externos e conformidade geral com as recomendações da Promovaweb.
10promovaweb-devops-review-evolution-go-stack
Verifica a Stack do Evolution Go. Além disso analisa parâmetros, rotas Traefik, volumes, recursos e conformidade do stack Evolution Go de Acordo com as Recomendações da Promovaweb.
9promovaweb-devops-docker-volumes
Implemente armazenamento persistente com Docker volumes, bind mounts e estratégias de backup
9promovaweb-devops-dockerfile-basics
Aprenda os fundamentos do Dockerfile e as melhores práticas para criar imagens de container prontas para produção
9promovaweb-devops-review-chatwoot-stack
Verifica a Stack do Chatwoot. Além disso analisa parâmetros, rotas Traefik, volumes, recursos e conformidade do stack Chatwoot de Acordo com as Recomendações da Promovaweb.
9promovaweb-devops-docker-networking
Configure a rede (networking) do Docker para containers, incluindo bridge, overlay e service discovery
9