Docker: 12 Projetos Práticos para Aprender Do Zero e Dominar a Containerização

Docker: 12 Projetos Práticos para Aprender Do Zero e Dominar a Containerização





Projetos Práticos para Aprender Docker | Yurideveloper


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-slim ou python: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 .dockerignore para 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 db utiliza 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 .dockerignore para 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.

Ver mais posts