Docker para Desenvolvedores: Imagens, Contêineres e Compose
Você provavelmente já ouviu falar do Docker e de como ele pode simplificar seu fluxo de trabalho de desenvolvimento. Mas quando você encontra pela primeira vez termos como imagens, contêineres e Docker Compose, pode parecer assustador. Este guia elimina o ruído e mostra exatamente como usar o Docker de forma eficaz em seus projetos.
O que é Docker e por que você deveria se importar?
Docker é uma plataforma que empacota sua aplicação e suas dependências em uma unidade padronizada chamada contêiner. Contêineres são leves, portáteis e isolados uns dos outros. Eles resolvem o clássico problema do "funciona na minha máquina" ao garantir que sua aplicação seja executada da mesma forma em qualquer lugar.
Diferente das máquinas virtuais, os contêineres compartilham o kernel do sistema operacional host, tornando-os mais rápidos para iniciar e mais eficientes. É por isso que o Docker se tornou um item essencial nos pipelines modernos de desenvolvimento e implantação.
Imagens vs. Contêineres: Os Blocos de Construção
Uma imagem é um template somente leitura que contém o código da sua aplicação, runtime, bibliotecas e configurações. Um contêiner é uma instância em execução de uma imagem. Pense em uma imagem como uma classe e em um contêiner como um objeto.
Você cria imagens usando um Dockerfile. Aqui está um exemplo simples para um app Node.js:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Cada linha no Dockerfile cria uma camada. As camadas são armazenadas em cache, então as reconstruções são mais rápidas quando apenas etapas posteriores mudam.
Comandos Docker Comuns
docker build -t my-app .— constrói uma imagem a partir do diretório atualdocker run -p 3000:3000 my-app— executa um contêiner e mapeia portasdocker ps— lista contêineres em execuçãodocker stop <container_id>— para um contêinerdocker rmi <image_id>— remove uma imagem
Docker Compose: Gerenciando Apps Multi-Contêiner
Aplicativos do mundo real frequentemente precisam de mais de um serviço: um servidor web, um banco de dados, um cache. O Docker Compose permite definir e executar aplicações multi-contêiner com um único arquivo YAML.
Aqui está um docker-compose.yml para um app Node.js com PostgreSQL e Redis:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: redis:7
volumes:
pgdata:
Execute docker compose up e todos os serviços iniciam juntos. O depends_on garante que o banco de dados e o cache iniciem antes do serviço web.
Comandos Principais do Compose
docker compose up -d— inicia todos os serviços em modo detacheddocker compose down— para e remove contêineres, redesdocker compose logs -f web— acompanha os logs de um serviço específicodocker compose exec web sh— abre um shell dentro de um contêiner em execução
Boas Práticas para Desenvolvimento
- Use .dockerignore para excluir node_modules, .git e outros arquivos desnecessários do contexto de build.
- Mantenha as imagens pequenas usando imagens baseadas em Alpine e builds multi-stage.
- Não execute como root — crie um usuário não-root no seu Dockerfile por segurança.
- Use volumes para dados persistentes e bind mounts para recarregamento de código ao vivo durante o desenvolvimento.
- Fixe versões no seu Dockerfile e arquivo Compose para evitar atualizações inesperadas.
Quando Usar Docker (e Quando Não Usar)
O Docker se destaca quando você precisa de ambientes consistentes entre equipes, gerenciamento fácil de dependências ou microsserviços. Pode ser exagero para sites estáticos simples ou scripts. Avalie com base na complexidade do seu projeto e nas necessidades de implantação.
FAQ
Qual é a diferença entre uma imagem e um contêiner?
Uma imagem é um template estático; um contêiner é uma instância em execução dessa imagem. Você pode executar vários contêineres a partir da mesma imagem.
Preciso do Docker Compose para um único contêiner?
Não, para um único contêiner você pode usar docker run. O Compose é útil quando você tem vários serviços que precisam se comunicar.
Como persisto dados no Docker?
Use volumes ou bind mounts. Volumes são gerenciados pelo Docker e são ideais para bancos de dados; bind mounts mapeiam um diretório do host para dentro do contêiner, útil para desenvolvimento.
Pronto para otimizar seus apps Dockerizados? Se você trabalha com logs do Nginx dentro de contêineres, experimente nosso Nginx Log Analyzer para analisar e processar logs rapidamente.