Docker revolucionou a forma como desenvolvemos e deployamos aplicações. Este guia ensina os fundamentos com exemplos práticos que você pode executar agora.
Conceitos Principais
Container vs VM
Container compartilha o kernel do SO, VM virtualiza hardware completo. Container inicia em segundos, VM em minutos. Container usa menos recursos.
Imagem Docker
Blueprint read-only da aplicação. Contém código, runtime, libs e dependências. Versionável via tags (app:1.0, app:latest).
Dockerfile
Receita para construir imagens. Define base image, copia código, instala dependências, expõe portas. Cada instrução cria uma layer.
Docker Hub
Registry público de imagens. Node, Postgres, Redis disponíveis prontos. Você pode hospedar imagens privadas também.
Passo a Passo
- Instale Docker: Baixe Docker Desktop (Mac/Windows) ou Docker Engine (Linux). Verifique instalação:
docker --version. Rode hello-world:docker run hello-world. - Crie Dockerfile: Na raiz do projeto Node:
FROM node:18-alpine,WORKDIR /app,COPY package*.json ./,RUN npm ci,COPY . .,EXPOSE 3000,CMD ["npm", "start"]. - Build da Imagem: Execute
docker build -t minha-app:1.0 .na pasta do Dockerfile. Flag -t define nome e tag. Ponto final indica contexto (diretório atual). - Rode Container:
docker run -p 3000:3000 minha-app:1.0. Flag -p mapeia porta host:container. Acesse localhost:3000. Use -d para rodar em background. - Gerencie Containers: Liste containers:
docker ps. Pare:docker stop. Remova:docker rm. Veja logs:docker logs. Entre no container:docker exec -it.sh
Boas Praticas
Recomendacoes
• Use imagens Alpine (menores e mais seguras)
• Crie .dockerignore para node_modules e .git
• Multi-stage builds reduzem tamanho final
• Nunca rode containers como root em produção
Erros Comuns
Evite estes erros
• Copiar node_modules para imagem (use npm install no Dockerfile)
• Usar tag latest em produção (sempre versione imagens)
• Não limitar recursos (use --memory e --cpus)
Checklist
- Docker instalado e testado
- Dockerfile criado e otimizado
- Imagem buildada com tag versionada
- Container rodando e acessível
- .dockerignore configurado