“Funciona na minha máquina” é uma das frases mais temidas no desenvolvimento de software. O Docker foi criado exatamente para acabar com esse problema: se roda no container, roda em qualquer lugar — no seu notebook, no servidor do colega ou na nuvem em produção.
Em 2026, saber Docker deixou de ser um diferencial e virou pré-requisito. Seja para desenvolvimento local, pipelines de CI/CD ou deploy em produção, containers estão em todo lugar.
O que é Docker, de verdade
Docker é uma plataforma de containerização. Um container é um pacote isolado que inclui tudo que a aplicação precisa para rodar: o código, as dependências, variáveis de ambiente e o runtime. Funciona de forma idêntica em qualquer máquina com Docker instalado. Diferente de uma máquina virtual, containers compartilham o kernel do sistema operacional host — são muito mais leves (megabytes vs. gigabytes) e muito mais rápidos para iniciar (segundos vs. minutos).
Os três conceitos fundamentais
Imagem (Image): o blueprint imutável do container. Define o sistema base, dependências e comandos de inicialização. Você constrói uma vez e roda em qualquer lugar. Container: uma instância em execução de uma imagem. Múltiplos containers podem rodar simultaneamente a partir da mesma imagem, cada um isolado. Dockerfile: o arquivo de instruções para construir a imagem. Cada linha é uma camada — o Docker faz cache das camadas não modificadas, acelerando builds repetidos.
Estrutura de um Dockerfile
Para uma API Python, o Dockerfile começa com a imagem base (FROM python:3.12-slim), define o diretório de trabalho (WORKDIR /app), copia e instala as dependências (COPY requirements.txt . seguido de RUN pip install), copia o restante do código e define o comando de inicialização (CMD). Um detalhe crítico: copie o requirements.txt e instale as dependências antes de copiar o código. Assim o Docker reutiliza o cache dessa camada nas builds seguintes — economiza tempo toda vez que você muda o código mas não as dependências.
Docker Compose para projetos reais
Aplicações reais têm múltiplos serviços: API, banco de dados, cache, fila. O Docker Compose orquestra tudo com um único arquivo YAML. Você define cada serviço com sua imagem ou Dockerfile, portas expostas, variáveis de ambiente e dependências entre serviços com depends_on. Com docker compose up, toda a stack sobe de uma vez. Com docker compose down, desce — os dados do banco ficam preservados nos volumes definidos.
Boas práticas que fazem diferença
Use imagens slim ou alpine como base — são menores e têm menor superfície de ataque. A python:3.12-slim tem cerca de 130MB contra mais de 900MB da imagem completa. Nunca coloque senhas ou chaves de API diretamente no Dockerfile: use variáveis de ambiente ou Docker Secrets em produção. Use o arquivo .dockerignore para excluir da imagem o diretório .git, arquivos de cache Python, ambientes virtuais e arquivos de teste.
Integrando Docker ao CI/CD
Se você já usa GitHub Actions para CI/CD, integrar Docker ao pipeline é natural: build da imagem, testes dentro do container, push para um registry (Docker Hub ou GitHub Container Registry). Para verificar o tamanho das suas imagens: docker images. Para inspecionar as camadas: docker history nome-da-imagem. Assim como o Firebase padroniza o backend para apps Flutter, o Docker padroniza o ambiente de execução para qualquer tipo de aplicação.
Docker tem curva de aprendizado inicial, mas depois que você pega o ritmo, não consegue imaginar desenvolver sem ele. A consistência de ambiente e a facilidade de onboarding de novos membros no time valem cada minuto investido no aprendizado.



