Extra Guia de Ferramentas • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 14.1 — Manifesto Compose Básico para PostgreSQL e PgAdmin

Contexto: Escrever um compose.yaml com um serviço postgres e uma interface web pgadmin conectados em uma rede comum.

Resultado Esperado

services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: devuser
      POSTGRES_PASSWORD: devpassword
      POSTGRES_DB: appdb
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  pgadmin:
    image: dpage/pgadmin4:latest
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@empresa.com
      PGADMIN_DEFAULT_PASSWORD: adminpassword
    ports:
      - "5050:80"
    depends_on:
      - postgres

volumes:
  pgdata:

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: compose_SeuNome.yaml
  2. Envie na tarefa: Atividade Cap 14 - Docker Compose
🔑 Gabarito de Código & Solução Comentada
services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: devuser
      POSTGRES_PASSWORD: devpassword
      POSTGRES_DB: appdb
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  pgadmin:
    image: dpage/pgadmin4:latest
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@empresa.com
      PGADMIN_DEFAULT_PASSWORD: adminpassword
    ports:
      - "5050:80"
    depends_on:
      - postgres

volumes:
  pgdata:

Comentário: O pgAdmin se conecta ao PostgreSQL utilizando o hostname postgres e a porta interna 5432.


🎯 Nível 2: Prática

Problema 14.2 — Controle de Dependência com Healthcheck no PostgreSQL

Escreva o trecho de configuração do serviço db com healthcheck utilizando pg_isready e configure o serviço api para aguardar a condição service_healthy.

🔑 Gabarito de Código & Solução Comentada
services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: pass
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  api:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      db:
        condition: service_healthy

🎯 Nível 3: Integração

Problema 14.3 — Stack Completa de Desenvolvimento com Hot-Reload (Bind Mounts)

Configure um compose.yaml com FastAPI (com volume bind mount .:/app e comando de reload), Redis e Worker Celery compartilhando o mesmo código.

🔑 Gabarito de Código & Solução Comentada
services:
  api:
    build: .
    command: uvicorn src.main:app --host 0.0.0.0 --port 8000 --reload
    volumes:
      - ./src:/app/src
    ports:
      - "8000:8000"
    environment:
      - REDIS_URL=redis://redis:6379/0
    depends_on:
      - redis

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

  worker:
    build: .
    command: celery -A src.tasks worker --loglevel=info
    volumes:
      - ./src:/app/src
    environment:
      - REDIS_URL=redis://redis:6379/0
    depends_on:
      - redis

🎯 Nível 4: Desafio

Problema 14.4 — Arquitetura Multi-Ambiente com Compose Overrides

Crie a estrutura com arquivo base compose.yaml e arquivos de override compose.override.yaml (para desenvolvimento local com portas abertas e debug) e compose.prod.yaml (para produção com recursos limitados de CPU/RAM).

🔑 Gabarito de Código & Solução Comentada
# compose.prod.yaml
services:
  api:
    restart: always
    deploy:
      resources:
        limits:
          cpus: '1.5'
          memory: 1024M
    environment:
      - ENV=production
      - LOG_LEVEL=warning

# Execução no ambiente de produção:
# docker compose -f compose.yaml -f compose.prod.yaml up -d