# MANUAL TÉCNICO - DOCKER SWARM: INICIALIZAÇÃO E GERENCIAMENTO

**Código:** ITGENG 0014/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}

## 1. HISTÓRICO DE REVISÃO

> ⚠️ **REGRA DE OURO:**
> 1. **Autor:** João Pedro Toledo Gonçalves.
> 2. **Descrição:** Criação do documento.

| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |

## 2. OBJETIVO
Habilitar o o modo Swarm (Orquestração Nativa) para garantir alta disponibilidade, balanceamento de carga e escalabilidade horizontal de containers.

## 3. PRÉ-REQUISITOS
- [ ] Mínimo de 3 máquinas com Docker instalado (Recomendado para HA).
- [ ] Portas liberadas entre os nós: 
    *   **TCP/2377** (Cluster Management)
    *   **TCP/UDP 7946** (Communication)
    *   **UDP 4789** (Overlay Network)

## 4. PASSO A PASSO (EXECUÇÃO)

**Etapa 1: Inicializando o Manager (Nó Principal)**
1.  No servidor escolhido como líder, execute:

```bash
docker swarm init --advertise-addr {{IP_DO_MANAGER}}
```

2.  O comando retornará um token. Copie-o. Exemplo:
    `docker swarm join --token SWMTKN-1-xx... {{IP_DO_MANAGER}}:2377`

**Etapa 2: Adicionando Workers**
1.  Nos outros servidores, cole o comando copiado na etapa anterior.
2.  Confirme a entrada no cluster:
    ```bash
    docker node ls
    ```
    > O status deve ser **Ready** e **Active**.

**Etapa 3: Deploy de Serviços (Services vs Containers)**
> ℹ️ **NOTA:** No Swarm, não damos deploy em "Containers", mas sim em "Services". O Swarm decide onde o container vai rodar.

1.  Crie um serviço replicado (3 réplicas do Nginx).

```bash
docker service create --name meu-site-ha --replicas 3 -p 80:80 nginx
```

2.  Liste os serviços e verifique a distribuição.

```bash
docker service ls
docker service ps meu-site-ha
```

**Etapa 4: Escala e Atualização (Rolling Update)**
1.  Aumente a capacidade para 5 containers.
    ```bash
    docker service scale meu-site-ha=5
    ```

2.  Atualize a imagem sem downtime (Rolling Update).
    ```bash
    docker service update --image nginx:alpine meu-site-ha
    ```

## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)

**Problema 1: Nós não conseguem se comunicar (Status Down)**
*   **Causa:** Firewall bloqueando porta 7946 ou 4789.
*   **Solução:** Verifique `telnet IP 2377` e libere as portas no Security Group/Firewall.

**Problema 2: Split Brain (Líderes perdidos)**
*   **Causa:** Mais de 50% dos Managers caíram.
*   **Solução:**
    1.  No manager sobrevivente: `docker swarm init --force-new-cluster`.

## 6. DADOS TÉCNICOS

| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Driver Rede** | `overlay` | Rede criptografada multi-host |
| **Routing Mesh** | `Ingress` | Balanceador de carga interno (L4) |

## 7. VALIDAÇÃO FINAL
- [ ] `docker node ls` mostra todos os nós online?
- [ ] Ao desligar um nó worker, os containers migram para outro?
- [ ] Acessar o IP de QUALQUER nó na porta 80 carrega o site (Routing Mesh)?
