Projeto de containerização completa com Docker Compose
Projeto: API de transações da DimDim (FastAPI) + Banco MySQL (CRUD simples).
Pontos fracos: configuração manual, dependências locais, difícil replicar ambiente.
Benefícios: reprodutibilidade, isolamento, facilidade de subir/parar, padronização, IaC. Mais economia e eficiência para a DimDim.
- Serviços do projeto:
api— FastAPI (Python 3.12) — imagem oficialpython:3.12-slim(Dockerfile)db— MySQL 8.0 — imagem oficialmysql:8.0
- Dependências:
apidepende dedb(conexão TCP 3306). No Compose,depends_oncomservice_healthygarante ordem correta. - Estratégia de containerização:
- API: Dockerfile com usuário não-root, healthcheck HTTP,
uvicorncomo entrypoint. - DB: imagem oficial MySQL +
init.sqlmontado via volume para criar schema/tabela/seed.
- API: Dockerfile com usuário não-root, healthcheck HTTP,
Arquivo: docker-compose.yml
- Serviços definidos:
api,db - Redes:
app-net(bridge) - Volumes:
mysql-data(persistência) +./initdb(scripts de init) - Variáveis de ambiente: via
.env - Política de restart:
on-failure - Portas expostas:
8000:8000(API) e3306:3306(DB — opcional; remova caso não precise acesso externo) - Health checks:
api:curl http://localhost:8000/healthdb:mysqladmin ping
- Usuário sem privilégios: definido no
Dockerfileda API (userappuser).
- Docker Desktop ou Docker Engine (Compose v2)
- Portas livres: 8000 (API) e opcional 3306 (MySQL)
cp .env.example .env
nano .env
docker compose up -d --build
docker compose ps
docker compose logs -f api
docker compose logs -f db
curl http://localhost:8000/health # {"status":"ok"}# LIST
curl -s http://localhost:8000/transactions | jq .
# CREATE
curl -s -X POST http://localhost:8000/transactions -H "Content-Type: application/json" -d '{"descricao":"Compra supermercado","valor":150.75}' | jq .
# UPDATE
curl -s -X PUT http://localhost:8000/transactions/1 -H "Content-Type: application/json" -d '{"descricao":"Compra supermercado - ALTERADO","valor":151.00}' | jq .
# DELETE
curl -s -X DELETE http://localhost:8000/transactions/1 -w "\nStatus: %{http_code}\n" -o /dev/nulldocker compose exec db mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e "USE ${MYSQL_DATABASE}; SELECT * FROM transactions;"docker compose up -d --build # subir
docker compose ps # listar
docker compose logs -f api # logs app
docker compose logs -f db # logs banco
docker compose exec db bash # entrar no container do banco
docker compose down -v # remover tudo
docker system prune -a -f --volumes # limpar laboratório por completotransactions-dimdim/
├─ app/
│ ├─ __init__.py
│ ├─ main.py
│ ├─ dependencies.py
│ ├─ common/
│ │ ├─ __init__.py
│ │ ├─ config.py
│ │ ├─ crud.py
│ │ ├─ database.py
│ │ ├─ models.py
│ │ └─ schemas.py
│ └─ routers/
│ ├─ __init__.py
│ ├─ health.py
│ └─ transactions.py
├─ initdb/
│ └─ init.sql
├─ .env.example
├─ docker-compose.yml
├─ Dockerfile
├─ requirements.txt
└─ README.md

