Docker: Treinamento Prático Abrangente

Última atualização: 2026-08-26

Este é o projeto final deste curso — ele reúne o conhecimento de todas as 23 aulas para implantar um microsserviço full-stack do zero ao ambiente de produção.

1. O Que Você Vai Aprender



2. Uma História de uma Entrega em 3 Dias

(1) Desafio: Migrar do ambiente local para produção em 3 dias

Charlie recebeu uma tarefa: implantar uma plataforma de e-commerce do desenvolvimento local para o ambiente de produção em três dias. A arquitetura consistia em um frontend React, uma API Go, PostgreSQL, Redis e RabbitMQ — cinco serviços e zero processos automatizados.

(2) Uma Solução para o Toolchain Full-Stack Docker

Charlie usou o toolchain full-stack Docker para concluir o projeto em dois dias: escrevendo o Dockerfile → orquestrando com Compose → implantação CI/CD automatizada → monitoramento e alertas.

(3) Benefício: Concluído e entregue em 2 dias

Da implantação manual à automação completa, concluímos o design de arquitetura, conteinerização, orquestração, CI/CD e monitoramento em apenas dois dias — esse é o valor de dominar habilidades Docker full-stack.



3. Design de Arquitetura Full-Stack

(1) Visão Geral da Arquitetura

100%
graph TB
    USER["Navegador"] --> ING["Nginx<br/>:80<br/>React SPA + Proxy de API"]
    ING -->|"api/"| API1["Go API #1<br/>:8080"]
    ING -->|"api/"| API2["Go API #2<br/>:8080"]
    ING -->|"api/"| API3["Go API #3<br/>:8080"]
    API1 --> PG["PostgreSQL<br/>:5432<br/>Banco Primário"]
    API2 --> PG
    API3 --> PG
    API1 --> REDIS["Redis<br/>:6379<br/>Cache"]
    API2 --> REDIS
    API3 --> MQ["RabbitMQ<br/>:5672<br/>Fila de Mensagens"]
    MQ --> WRK["Worker<br/>Tarefas em Background"]
    PROM["Prometheus<br/>:9090<br/>Métricas"] --> GRAF["Grafana<br/>:3000<br/>Dashboards"]
    PROM --> API1
    PROM --> PG
    PROM --> REDIS

(2) Lista de Serviços

Serviço Stack Tecnológica Imagens Portas
Nginx Proxy reverso + arquivos estáticos Self-hosted (multi-estágio) 80
Go API REST API Self-hosted (multi-estágio) 8080
PostgreSQL Banco Relacional postgres:15-alpine 5432
Redis Cache + Sessão redis:7-alpine 6379
RabbitMQ Fila de Mensagens rabbitmq:3-management 5672/15672
Worker Processamento de tarefas em background Self-hosted (mesma imagem da API) -
Prometheus Coleta de métricas prom/prometheus 9090
Grafana Dashboard de Visualização grafana/grafana 3000


4. Dockerfile do Frontend (React + Nginx)

▶ Exemplo: Build Multi-estágio para Dockerfile do Frontend (Dificuldade: ⭐⭐⭐)

DOCKERFILE
# ============================================
# Estágio 1: Construir aplicação React
# ============================================
FROM node:20-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# ============================================
# Estágio 2: Servir com Nginx
# ============================================
FROM nginx:1.25-alpine

# Copiar assets construídos
COPY --from=builder /app/dist /usr/share/nginx/html

# Copiar configuração Nginx para roteamento SPA
COPY nginx.conf /etc/nginx/conf.d/default.conf

# Segurança: usuário não-root
RUN chown -R nginx:nginx /usr/share/nginx/html && \
    chown -R nginx:nginx /var/cache/nginx && \
    chown -R nginx:nginx /var/log/nginx

EXPOSE 80
HEALTHCHECK --interval=30s --timeout=5s \
  CMD wget -qO- http://localhost/ || exit 1

CMD ["nginx", "-g", "daemon off;"]


5. Dockerfile do Backend (Go multi-estágio)

▶ Exemplo: Build Multi-estágio no Dockerfile do Backend (Dificuldade: ⭐⭐⭐)

DOCKERFILE
# ============================================
# Estágio 1: Compilar binário Go
# ============================================
FROM golang:1.22-alpine AS builder

RUN apk add --no-cache git

WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o /app/server

# ============================================
# Estágio 2: Runtime mínimo
# ============================================
FROM alpine:3.19

RUN apk --no-cache add ca-certificates tzdata curl && \
    adduser -D -u 1000 appuser

WORKDIR /app
COPY --from=builder /app/server .

RUN chown -R appuser:appuser /app
USER appuser

EXPOSE 8080

HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1

CMD ["/app/server"]


6. Orquestração com Docker Compose

▶ Exemplo: docker-compose.prod.yml Completo (Dificuldade: ⭐⭐⭐)

YAML
# ============================================
# docker-compose.prod.yml - Full stack
# ============================================
services:
  nginx:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    ports:
      - "80:80"
    depends_on:
      api:
        condition: service_healthy
    restart: unless-stopped
    networks:
      - frontend
      - backend
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "5"

  api:
    build:
      context: ./api
      dockerfile: Dockerfile
    environment:
      DATABASE_URL: postgresql://appuser:${DB_PASSWORD}@postgres:5432/${DB_NAME}
      REDIS_URL: redis://redis:6379
      RABBITMQ_URL: amqp://guest:${MQ_PASSWORD}@rabbitmq:5672
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: "1.0"
          memory: 512M
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    restart: unless-stopped
    networks:
      - backend
      - db-net
      - cache-net
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 15s
      timeout: 5s
      retries: 3
      start_period: 10s
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "5"

  worker:
    build:
      context: ./api
      dockerfile: Dockerfile
    command: ["/app/server", "worker"]
    environment:
      DATABASE_URL: postgresql://appuser:${DB_PASSWORD}@postgres:5432/${DB_NAME}
      RABBITMQ_URL: amqp://guest:${MQ_PASSWORD}@rabbitmq:5672
    depends_on:
      postgres:
        condition: service_healthy
      rabbitmq:
        condition: service_healthy
    restart: unless-stopped
    networks:
      - backend
      - db-net

  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: appuser
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_NAME}
    volumes:
      - pg-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U appuser"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped
    networks:
      - db-net

  redis:
    image: redis:7-alpine
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 10s
      timeout: 5s
    restart: unless-stopped
    networks:
      - cache-net

  rabbitmq:
    image: rabbitmq:3-management-alpine
    environment:
      RABBITMQ_DEFAULT_PASS: ${MQ_PASSWORD}
    ports:
      - "15672:15672"
    volumes:
      - mq-data:/var/lib/rabbitmq
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
      interval: 15s
      timeout: 10s
    restart: unless-stopped
    networks:
      - backend

  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus-data:/prometheus
    ports:
      - "9090:9090"
    restart: unless-stopped
    networks:
      - backend
      - db-net
      - cache-net

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}
    volumes:
      - grafana-data:/var/lib/grafana
    depends_on:
      - prometheus
    restart: unless-stopped
    networks:
      - backend

volumes:
  pg-data:
  redis-data:
  mq-data:
  prometheus-data:
  grafana-data:

networks:
  frontend:
  backend:
  db-net:
    internal: true
  cache-net:
    internal: true


7. Configuração CI/CD

(1) Pipeline Completo do GitHub Actions

YAML
# .github/workflows/deploy.yml
name: Build and Deploy

on:
  push:
    branches: [main]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: docker/setup-buildx-action@v3

      - uses: docker/login-action@v3
        with:
          registry: ${{ secrets.REGISTRY }}
          username: ${{ secrets.REGISTRY_USER }}
          password: ${{ secrets.REGISTRY_PASS }}

      - name: Build and push API
        uses: docker/build-push-action@v5
        with:
          context: ./api
          push: true
          tags: ${{ secrets.REGISTRY }}/api:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

      - name: Build and push Frontend
        uses: docker/build-push-action@v5
        with:
          context: ./frontend
          push: true
          tags: ${{ secrets.REGISTRY }}/frontend:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

      - name: Deploy to production
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /opt/ecommerce
            export API_TAG=${{ github.sha }}
            export FRONTEND_TAG=${{ github.sha }}
            docker compose -f docker-compose.prod.yml pull
            docker compose -f docker-compose.prod.yml up -d --remove-orphans
            docker image prune -f


8. Configuração de Monitoramento

(1) Configuração do Prometheus

YAML
# monitoring/prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'api'
    static_configs:
      - targets: ['api:8080']
    metrics_path: /metrics

  - job_name: 'postgres'
    static_configs:
      - targets: ['postgres-exporter:9187']

  - job_name: 'redis'
    static_configs:
      - targets: ['redis-exporter:9121']

  - job_name: 'rabbitmq'
    static_configs:
      - targets: ['rabbitmq:15692']


9. Implantação e Validação

(1) Checklist de Implantação

Etapa Ação Verificação
1 docker compose -f docker-compose.prod.yml up -d --build docker compose ps Todos Up
2 Visitar http://localhost Página React exibe corretamente
3 curl http://localhost/api/health {"status":"ok"}
4 Visitar http://localhost:3000 Página de Login Grafana
5 Visitar http://localhost:15672 Página de Gestão RabbitMQ
6 docker compose logs api Sem erros nos logs da API

(2) Tabela Comparativa: Bare Metal vs. Docker vs. K8s

Dimensão Implantação Bare-metal Docker Compose Kubernetes
Tempo de Implantação 1–2 dias 30 minutos 1–2 dias (configuração inicial)
Repetibilidade
Escalonamento Automático ✅ HPA
Auto-cura política restart ✅ Reconstrução automática
Atualizações zero-downtime Difícil Compose restart ✅ Rolling updates
Monitoramento Manual Prometheus+Grafana Integrado + Prometheus
Complexidade Baixa Média Alta


10. Exemplo Completo: Implantação Full-Stack com Um Clique

BASH
# ============================================
# Passo a passo completo: Implantação full-stack
# ============================================

# 1. Criar arquivo .env (NUNCA faça commit disso)
cat > .env << 'EOF'
DB_PASSWORD=secure_db_pass_2024
DB_NAME=ecommerce
REDIS_PASSWORD=secure_redis_pass
MQ_PASSWORD=secure_mq_pass
GRAFANA_PASSWORD=admin123
EOF

# 2. Construir e iniciar todos os serviços
docker compose -f docker-compose.prod.yml up -d --build

# 3. Aguardar inicialização dos serviços
sleep 30

# 4. Verificar todos os serviços
docker compose -f docker-compose.prod.yml ps
echo "=== Health Checks ==="
docker compose -f docker-compose.prod.yml ps --format "table {{.Name}}\t{{.Status}}"

# 5. Testar a API
curl -s http://localhost/api/health

# 6. Verificar conectividade do banco de dados
docker compose -f docker-compose.prod.yml exec postgres pg_isready -U appuser

# 7. Acessar monitoramento
echo "Grafana: http://localhost:3000 (admin/${GRAFANA_PASSWORD})"
echo "RabbitMQ: http://localhost:15672 (guest/${MQ_PASSWORD})"
echo "Prometheus: http://localhost:9090"

# 8. Visualizar logs agregados
docker compose -f docker-compose.prod.yml logs --tail 50 api

# 9. Escalar API se necessário
docker compose -f docker-compose.prod.yml up -d --scale api=5

# 10. Limpar
docker compose -f docker-compose.prod.yml down

❓ Perguntas Frequentes

P: Quão mais complexos são os microsserviços comparados a uma arquitetura monolítica? R: A complexidade operacional aumenta significativamente — configuração de rede, descoberta de serviços, agregação de logs e tracing distribuído apresentam novos desafios. No entanto, os benefícios incluem implantação independente, escalonamento independente e isolamento de falhas. Recomendação: Equipes pequenas (<5 pessoas) devem usar uma arquitetura monolítica modular, enquanto equipes maiores devem usar microsserviços. Não adote microsserviços apenas por adotar.

P: Como realizar migrações de banco de dados no CI/CD? R: Adicione etapas de migração antes das etapas de implantação: ① Construir a imagem de migração; ② docker run --rm migrate:latest alembic upgrade head; ③ Implantar a nova versão. Ponto-chave: As migrações devem ser compatíveis com versões anteriores — o novo código deve suportar tanto as estruturas de tabela antigas quanto as novas.

P: Como consolidar logs de múltiplos serviços? R: Existem três abordagens: ① ELK Stack (Elasticsearch + Logstash + Kibana) — o padrão da indústria; ② Loki + Grafana (leve, recomendado para ambientes cloud-native); ③ Serviços de logging de provedores de nuvem (AWS CloudWatch / Alibaba Cloud SLS). Todos seguem: stdout do contêiner → coletor → armazenamento centralizado → dashboard de busca.

P: Como configurar HTTPS em um ambiente de produção? R: Configure TLS no contêiner Nginx: ① Certificado gratuito Let's Encrypt + renovação automática via Certbot; ② Modo proxy reverso: Nginx gerencia TLS, enquanto a comunicação interna usa HTTP; ③ O load balancer do provedor de nuvem gerencia TLS (ALB/SLB), então o contêiner não precisa de certificado.

P: Como monitorar a saúde de toda a stack de microsserviços? R: A combinação de ouro do Prometheus e Grafana: ① Prometheus coleta dados dos endpoints /metrics de cada serviço; ② Grafana exibe dashboards e regras de alerta; ③ Métricas-chave: latência da API (P50/P95/P99), taxa de erro, uso de CPU/memória e número de conexões de banco de dados. Monitore primeiro, depois otimize.


📖 Resumo


📝 Exercícios

  1. Exercício Básico (Dificuldade: ⭐): Projete um diagrama de arquitetura de microsserviços para um sistema de blog (Nginx + API + BD + Cache) e liste a imagem e porta de cada serviço.
  2. Exercício Avançado (Dificuldade: ⭐⭐): Implante esta arquitetura usando tecnologia Docker full-stack, escreva o arquivo docker-compose.prod.yml e inicie a aplicação com sucesso.
  3. Desafio (Dificuldade: ⭐⭐⭐): Configure um dashboard de monitoramento Prometheus + Grafana, adicione dashboards para latência de API e taxa de erros, e configure regras de alerta por email.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%