Projetos práticos para aprender Docker
Guia técnico e objetivo para criar, orquestrar e observar containers em cenários reais de desenvolvimento.
1. Construção de imagens enxutas com Dockerfile
O ponto de partida é criar imagens estáveis e rápidas, evitando carregar dependências desnecessárias. Adotar uma abordagem de multi-stage builds ajuda a separar o build do runtime, reduzindo o tamanho final da imagem e aumentando a segurança.
- Escolha uma imagem base leve e adequada ao runtime (por exemplo,
node:18-slimoupython:3.11-slim). - Copie apenas o que é necessário para cada etapa (por exemplo, pacotes de dependência antes de copiar o código-fonte).
- Utilize multi-stage build para manter apenas o que é necessário no runtime e não expor artefatos de build.
- Use um usuário não-root no container para melhorar a segurança.
- Adicione um arquivo
.dockerignorepara excluir node_modules, testes e arquivos de build desnecessários.
Exemplo conceitual de loop de construção com stages (texto resumido):
Stage 1: build com as dependências e compilação. Stage 2: runtime com apenas o que o aplicativo precisa para executar.
2. Orquestração simples com Docker Compose
Para gerenciar uma stack de serviços locais, Docker Compose facilita a definição de dependências, volumes e redes em um único arquivo. A seguir, um exemplo típico de uma aplicação web com banco de dados.
version: "3.9"
services:
web:
build: .
ports:
- "8080:3000"
depends_on:
- db
environment:
- NODE_ENV=development
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: appdb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Notas rápidas sobre o arquivo acima:
- O serviço
webé construído a partir do Dockerfile presente no contexto atual e expõe a porta 3000 para a máquina host via mapeamento 8080:3000. - O serviço
dbutiliza uma imagem pronta do PostgreSQL e persiste os dados em um volume nomeado. - As dependências são gerenciadas pelo
depends_on, garantindo uma ordem de inicialização adequada.
3. Práticas de cache, camadas e build eficiente
O desempenho de build depende de como as camadas são criadas. Algumas práticas importantes para manter builds previsíveis e rápidos:
- Combine instruções RUN relacionadas em um único comando para minimizar o número de camadas (reduz o tamanho da imagem).
- Ordene as instruções de forma que as dependências que mudam menos sejam executadas antes (por exemplo, copiar package.json antes de instalar dependências).
- Use
.dockerignorepara excluir arquivos desnecessários da construção do contêiner (node_modules, logs, testes, etc.). - Considere multi-stage builds para manter apenas o artefato final no runtime.
Exemplo de prática comum em Dockerfile (descrição):
Na etapa de build, instale dependências; na etapa de runtime, copie apenas o que é necessário para executar o aplicativo e remova artefatos de build.
4. Desenvolvimento local com volumes, redes e diagnóstico
Para um ciclo de desenvolvimento eficiente, utilize volumes para persistência de dados e bind mounts para refletir mudanças no código em tempo real. Redes isoladas ajudam a simular ambientes de produção sem interferir na máquina host.
- Volumes mantêm dados entre reinicializações (por exemplo, banco de dados).
- Bind mounts permitem hot-reload ao editar o código-fonte (quando suportado pelo runtime).
- Fazer checagens de saúde (healthchecks) ajuda a detectar falhas de disponibilidade de serviços.
Exemplos de padrões úteis:
- Executar a aplicação localmente com bind mount para atualizações rápidas:
- Separar redes para isolar serviços e facilitar comunicação entre eles.
Para observação básica de disponibilidade, você pode incluir em um Dockerfile um healthcheck, por exemplo:
HEALTHCHECK –interval=30s –timeout=5s –start-period=5s –retries=3 CMD curl -f http://localhost:3000/health || exit 1
Gostou do conteúdo?
Fique por dentro de mais tutoriais práticos e cases técnicos. Siga lendo outros posts no Yurideveloper para ampliar seu repertório em containers, pipelines simples e devops moderno.
Sou Apaixonado pela programação e estou trilhando o caminho de ter cada diz mais conhecimento e trazer toda minha experiência vinda do Design para a programação resultando em layouts incríveis e idéias inovadoras! Conecte-se Comigo!