Docker na Prática: Do Zero ao Deploy de Aplicações Containerizadas

O que é Docker e Por Que Você Deve Usar?
Docker é uma plataforma open-source que automatiza a implantação de aplicações dentro de containers — ambientes leves e isolados que empacotam código e todas as suas dependências. Diferente de máquinas virtuais tradicionais, containers compartilham o kernel do sistema operacional hospedeiro, o que os torna extremamente rápidos e eficientes.
Com Docker, o clássico "funciona na minha máquina" deixa de existir. Seu aplicativo roda exatamente igual no laptop do desenvolvedor, no servidor de staging e na nuvem em produção. Grandes empresas como Netflix, Spotify e Airbnb usam Docker em escala para gerenciar milhões de containers.
Instalação e Primeiros Passos
A instalação do Docker varia conforme o sistema operacional:
- Linux (Ubuntu/Debian):
sudo apt install docker.io - macOS e Windows: Baixe o Docker Desktop em
docker.com - Verifique a instalação:
docker --version
Após instalar, execute seu primeiro container:
docker run hello-world
Esse comando baixa a imagem hello-world do Docker Hub e executa um container que exibe uma mensagem de confirmação. Se você viu a mensagem, o Docker está funcionando!
Imagens vs Containers: Entendendo a Diferença
Essa é a dúvida mais comum entre iniciantes. A analogia mais útil é pensar em programação orientada a objetos:
- Imagem (Image) é a classe — um template read-only com instruções para criar um container
- Container é a instância — a execução em tempo real da imagem, com estado próprio
Você pode ter múltiplos containers rodando a partir da mesma imagem, cada um isolado do outro. Imagens são construídas em camadas (layers) e armazenadas em registries como o Docker Hub.
Comandos essenciais para gerenciamento:
# Listar imagens baixadas
docker images
# Listar containers rodando
docker ps
# Listar todos os containers (incluindo parados)
docker ps -a
# Parar um container
docker stop <container_id>
# Remover um container
docker rm <container_id>
# Remover uma imagem
docker rmi <image_id>
Criando um Dockerfile do Zero
O Dockerfile é o coração da containerização — um arquivo de texto com instruções para construir sua imagem. Vamos criar um para uma aplicação Node.js:
# Use uma imagem base oficial
FROM node:18-alpine
# Defina o diretório de trabalho
WORKDIR /app
# Copie os arquivos de dependências
COPY package*.json ./
# Instale as dependências
RUN npm install
# Copie o código fonte
COPY . .
# Exponha a porta da aplicação
EXPOSE 3000
# Comando de inicialização
CMD ["node", "index.js"]
Dica profissional: copiamos package*.json antes do código fonte para aproveitar o cache de camadas do Docker. Enquanto o package.json não mudar, a camada RUN npm install é reutilizada, acelerando builds subsequentes.
Para construir a imagem e rodar o container:
docker build -t minha-app .
docker run -d -p 3000:3000 --name app-container minha-app
Docker Compose: Múltiplos Containers com um Comando
Aplicações reais raramente têm um único serviço. Um backend precisa de banco de dados, cache, fila de mensagens... O Docker Compose resolve isso com um arquivo YAML declarativo:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DB_HOST=db
db:
image: postgres:15-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
volumes:
pgdata:
Com esse arquivo, um único comando sobe tudo:
docker compose up -d
O Compose gerencia redes internas entre os serviços, volumes para persistência de dados e variáveis de ambiente automaticamente.
Volumes e Persistência de Dados
Containers são efêmeros — quando você os remove, todos os dados internos são perdidos. Volumes resolvem isso armazenando dados no sistema de arquivos do host:
# Criar um volume nomeado
docker volume create meus-dados
# Montar o volume no container
docker run -v meus-dados:/app/data minha-imagem
Tipos de montagem no Docker:
- Volumes nomeados: gerenciados pelo Docker, localizados em
/var/lib/docker/volumes/ - Bind mounts: mapeiam uma pasta do host diretamente, útil para desenvolvimento
- tmpfs mounts: armazenam dados em memória RAM, voláteis e rápidos
Deploy em Produção: Estratégias e Boas Práticas
Levar containers para produção requer mais que um docker run. Aqui estão as principais estratégias:
- Docker Swarm: orquestrador nativo do Docker, simples de configurar
- Kubernetes (K8s): orquestrador mais robusto, padrão da indústria para clusters grandes
- Serviços gerenciados: AWS ECS, Google Cloud Run, Azure Container Apps — sem gerenciar nós
Boas práticas essenciais para produção:
- Use imagens oficiais e leves (alpine, slim) para reduzir superfície de ataque
- Nunca rode containers como root — use o指令
USERno Dockerfile - Implemente health checks com
HEALTHCHECKno Dockerfile - Use .dockerignore para excluir arquivos desnecessários do build
- Configure logs centralizados — containers escrevem no stdout/stderr
- Utilize segredos com Docker Secrets ou variáveis de ambiente seguras
Monitoramento e Debug
Ferramentas essenciais para o dia a dia com Docker:
# Ver logs de um container
docker logs -f app-container
# Executar comando dentro de container rodando
docker exec -it app-container sh
# Inspecionar detalhes do container
docker inspect app-container
# Monitorar uso de recursos
docker stats
# Limpar recursos não utilizados
docker system prune -a
Para debugging avançado, ferramentas como Portainer (interface web), LazyDocker (terminal TUI) e Dozzle (logs ao vivo) tornam o gerenciamento muito mais produtivo.
Conclusão
Docker transformou a forma como desenvolvemos, testamos e implantamos software. Com containers, ganhamos consistência entre ambientes, isolamento seguro e eficiência de recursos. Do Dockerfile mais simples ao orquestrador mais complexo, o ecossistema Docker oferece ferramentas para projetos de qualquer escala.
Comece pequeno: containerize uma aplicação existente, adicione Docker Compose com um banco de dados, e explore orquestradores quando precisar escalar. O caminho da containerização é um investimento que paga dividends em produtividade e confiabilidade.







