Docker para Desenvolvedores: Imagens, Contêineres e Compose
Como desenvolvedor, você provavelmente já enfrentou a frustração das inconsistências de ambiente: "Funciona na minha máquina!" O Docker resolve isso empacotando aplicações em contêineres. Este guia explica imagens Docker, contêineres e Compose para ajudá-lo a construir, entregar e executar aplicações de forma consistente.
O que é Docker?
Docker é uma plataforma para desenvolver, entregar e executar aplicações em contêineres. Contêineres são pacotes leves, independentes e executáveis que incluem tudo o que é necessário para rodar um software: código, runtime, ferramentas de sistema, bibliotecas e configurações.
Imagens vs. Contêineres
Uma imagem é um modelo somente leitura com instruções para criar um contêiner. Um contêiner é uma instância executável de uma imagem. Você pode criar vários contêineres a partir da mesma imagem, cada um isolado dos demais.
Trabalhando com Imagens
As imagens são construídas a partir de um Dockerfile, um arquivo de texto com instruções. Aqui está um exemplo simples em Node.js:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Construa a imagem com:
docker build -t my-app .
Liste as imagens: docker images
Executando Contêineres
Inicie um contêiner a partir de uma imagem:
docker run -d -p 3000:3000 --name my-container my-app
Isso executa o contêiner em modo detached (-d), mapeia a porta 3000 e o nomeia como my-container.
Liste os contêineres em execução: docker ps
Pare um contêiner: docker stop my-container
Remova um contêiner: docker rm my-container
Por que Usar Docker Compose?
Quando sua aplicação depende de vários serviços (banco de dados, cache, etc.), gerenciar contêineres individuais se torna tedioso. O Docker Compose permite definir e executar aplicações multi-contêiner usando um arquivo YAML.
Exemplo de Arquivo Compose
Crie o docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Inicie todos os serviços: docker compose up -d
Pare e remova: docker compose down
Boas Práticas para Desenvolvedores
- Use .dockerignore: Exclua arquivos desnecessários (node_modules, .git) para acelerar os builds.
- Builds multi-stage: Mantenha as imagens de produção pequenas separando os estágios de build e runtime.
- Aproveite o cache: Ordene as instruções do Dockerfile da menos para a mais frequentemente alterada.
- Marque as imagens corretamente: Evite usar
latestem produção; use versionamento semântico. - Verifique vulnerabilidades: Use
docker scanpara checar as imagens em busca de problemas conhecidos.
Guia Rápido de Comandos Comuns
| Comando | Descrição |
|---|---|
docker build -t name . | Constrói uma imagem a partir do Dockerfile |
docker run -p host:container image | Executa um contêiner e mapeia portas |
docker ps -a | Lista todos os contêineres |
docker exec -it container bash | Abre um shell dentro de um contêiner em execução |
docker compose up | Inicia os serviços definidos no arquivo Compose |
docker compose logs -f | Acompanha os logs de todos os serviços |
FAQ
Qual é a diferença entre uma imagem e um contêiner?
Uma imagem é um modelo estático; um contêiner é uma instância em execução dessa imagem. Você pode criar vários contêineres a partir de uma única imagem.
Quando devo usar o Docker Compose?
Use o Compose quando sua aplicação exigir vários serviços (por exemplo, servidor web, banco de dados, cache) que precisam rodar juntos. Ele simplifica a orquestração para desenvolvimento e testes.
Como persistir dados no Docker?
Use volumes ou bind mounts. Volumes são gerenciados pelo Docker e armazenados em uma área dedicada; bind mounts apontam para um diretório do host. Ambos sobrevivem a reinicializações do contêiner.
Pronto para otimizar seu fluxo de trabalho com Docker? Experimente nosso Analisador de Logs Nginx para depurar logs de contêineres rapidamente.