promovaweb-devops-docker-swarm

Original🇺🇸 English
Translated

Orquestração Docker Swarm, gerenciamento de cluster e implantações em produção

2installs
Added on

NPX Install

npx skill4agent add promovaweb/skills-devops 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âmetroTipoObrigatórioPadrãoDescrição
managersnumberNão3Número de nós (nodes) managers
workersnumberNão-Número de nós (nodes) workers
encryptedbooleanNotrueCriptografar redes overlay

Configuração do Cluster

Inicializar Swarm

bash
# 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)

bash
# 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

bash
# 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

bash
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

yaml
# 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
bash
# 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

bash
# 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

bash
# 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)

bash
# 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

ErroCausaSolução
no suitable node
Restrições não atendidasRelaxe ou adicione nós
not converging
Falha no health checkVerifique os logs do serviço
Raft: no leader
Quorum perdidoRestaure os managers

Recuperação de Manager

bash
# 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

bash
# 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