# MANUAL TÉCNICO - INSTALAÇÃO E CONFIGURAÇÃO DO DOCKER E COMPOSE (LINUX)

**Código:** ITGSUP 0007/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
Padronizar a instalação do Docker Engine e Docker Compose em servidores Linux (Ubuntu/Debian), garantindo suporte oficial e atualizações seguras.

## 3. PRÉ-REQUISITOS
> Liste o que é necessário ANTES de começar.
*   [ ] Acesso ao servidor via SSH.
*   [ ] Usuário com privilégios de `sudo` ou `root`.
*   [ ] Conexão com a internet liberada (Portas 80/443).
*   [ ] Sistema Operacional compatível (Ubuntu 20.04+, Debian 11+).

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

**Etapa 1: Preparação do Ambiente e Repositórios**
1.  Atualize o índice de pacotes e instale as dependências essenciais para HTTPS.

```bash
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
```

2.  Adicione a chave GPG oficial do Docker para garantir a autenticidade dos pacotes.

```bash
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
```

3.  Configure o repositório estável.
    > ℹ️ **NOTA:** O comando abaixo detecta automaticamente a versão do OS (`lsb_release`).

```bash
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

**Etapa 2: Instalação dos Pacotes**
1.  Atualize novamente o índice (agora com o repo do Docker) e instale o Engine, CLI e plugins.

```bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

**Etapa 3: Pós-Instalação (Permissões)**
> ⚠️ **IMPORTANTE:** Execute isso para **não** precisar usar `sudo` em todo comando docker.

1.  Adicione seu usuário atual ao grupo `docker`.
2.  Aplique a mudança de grupo na sessão atual.

```bash
sudo usermod -aG docker $USER
newgrp docker
```

**Etapa 4: Validação (Hello World)**
1.  Execute o container de teste para validar a instalação completa.

```bash
docker run hello-world
```

2.  O resultado esperado deve ser idêntico ao bloco abaixo:

> [!NOTE]
> Sucesso na execução do Docker.

```text
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
```

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

**Problema 1: "permission denied while trying to connect to the Docker daemon socket"**
*   **Causa:** O usuário não está no grupo `docker` ou a sessão não foi atualizada.
*   **Solução:**
    1.  Execute `sudo usermod -aG docker $USER`.
    2.  Faça **logoff** e login novamente ou use `newgrp docker`.

**Problema 2: Erro de GPG ou Repositório não encontrado**
*   **Causa:** Chave expirada ou OS não suportado.
*   **Solução:**
    1.  Verifique se o codename do OS em `/etc/os-release` é compatível (focal, jammy, bullseye, bookworm).
    2.  Remova o arquivo `/etc/apt/sources.list.d/docker.list` e refaça a **Etapa 1**.

## 6. DADOS TÉCNICOS

| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Serviço** | `docker.service` | Nome do serviço no Systemd |
| **Config** | `/etc/docker/daemon.json` | Arquivo principal de configuração |
| **Dados** | `/var/lib/docker` | Local padrão de imagens e volumes |
| **Socket** | `/var/run/docker.sock` | Socket de comunicação da API |

## 7. VALIDAÇÃO FINAL (Definição de Pronto)
- [ ] O comando `docker run hello-world` funciona sem sudo?
- [ ] O comando `docker compose version` retorna a versão (ex: v2.x.x)?
- [ ] O serviço está ativo? (`sudo systemctl status docker` mostra **active (running)**)
