🧩 Exercícios: Docker Compose e Orquestração Multi-Serviço
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)
- Salve o arquivo como:
compose_SeuNome.yaml - 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