Ambientes de Desenvolvimento Reproduzíveis com Docker

"Funciona na minha máquina." Quatro palavras que atrapalharam mais deploys do que qualquer bug. O Docker resolve isso empacotando todo o seu ambiente, sistema operacional, dependências, configuração, em uma única unidade reproduzível.

Por Que Docker?

Antes dos contêineres, configurar um ambiente de desenvolvimento significava instalar versões específicas de Python, Node.js, PostgreSQL e uma dúzia de outras ferramentas diretamente na sua máquina. Cada projeto tinha requisitos diferentes. Conflitos eram inevitáveis.

O Docker muda a equação:

  1. Consistência: O mesmo ambiente roda em qualquer lugar, seu laptop, CI/CD, produção.
  2. Isolamento: Projetos não interferem uns nos outros.
  3. Reprodutibilidade: Novos membros da equipe ficam produtivos em minutos, não horas.

Primeiros Passos

O núcleo do Docker é o Dockerfile, uma receita para construir seu ambiente:

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py"]

Cada linha cria uma camada. O Docker armazena essas camadas em cache, então a reconstrução é rápida quando apenas seu código muda.

Docker Compose para Projetos Multi-Serviço

A maioria dos projetos reais envolve múltiplos serviços. Uma aplicação web precisa de um banco de dados, talvez um cache, possivelmente uma fila de mensagens.

O docker-compose.yml os orquestra:

services:
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: devpass
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:

Um comando, docker compose up, e toda a sua stack está rodando.

Dicas Práticas

  • Use .dockerignore: Exclua node_modules, .git e outros arquivos desnecessários para acelerar os builds.
  • Fixe versões: python:3.12-slim, não python:latest. Reprodutibilidade significa que nada muda inesperadamente.
  • Builds multi-estágio: Construa em um estágio, copie apenas os artefatos para uma imagem de runtime enxuta.

Onde Uso Docker

Meu fluxo de desenvolvimento depende do Docker para:

  • Projetos de automação Python com versões específicas de bibliotecas
  • Aplicações com banco de dados (PostgreSQL, Redis)
  • Ambientes isolados de experimentação para agentes de IA
  • Pipelines de CI/CD que espelham minha configuração local

O Docker transformou "funciona na minha máquina" em "funciona em qualquer lugar." Esse é o tipo de engenharia que quero praticar.