📦 O que são Containers?
Containers são unidades de software que empacotam código e todas as suas dependências, garantindo que a aplicação rode de forma consistente em qualquer ambiente — do laptop ao servidor em produção.
Diferente de VMs, containers compartilham o kernel do sistema operacional host, sendo muito mais leves e rápidos para iniciar.
🚀 Primeiros Comandos
Comandos essenciais para começar a trabalhar com Docker:
# Verificar instalação
docker --version
# Baixar e rodar um container
docker run hello-world
# Rodar nginx em background na porta 8080
docker run -d -p 8080:80 --name meu-nginx nginx
# Listar containers em execução
docker ps
# Listar todos os containers (incluindo parados)
docker ps -a
# Parar e remover um container
docker stop meu-nginx
docker rm meu-nginx
# Listar imagens locais
docker images
📄 Dockerfile
O Dockerfile é o "receita" para construir uma imagem Docker. Exemplo para uma aplicação Node.js:
# Imagem base
FROM node:18-alpine
# Diretório de trabalho dentro do container
WORKDIR /app
# Copiar dependências e instalar
COPY package*.json ./
RUN npm install --production
# Copiar código da aplicação
COPY . .
# Expor porta
EXPOSE 3000
# Comando de inicialização
CMD ["node", "server.js"]
# Build da imagem
docker build -t minha-app:1.0 .
# Rodar a imagem criada
docker run -d -p 3000:3000 minha-app:1.0
💾 Volumes
Volumes persistem dados além do ciclo de vida do container — essencial para bancos de dados e arquivos de configuração.
# Criar volume nomeado
docker volume create meus-dados
# Usar volume em um container
docker run -d \
-v meus-dados:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=senha123 \
mysql:8
# Montar pasta local (bind mount)
docker run -d \
-v $(pwd)/config:/app/config \
minha-app:1.0
# Listar volumes
docker volume ls
🌐 Redes
Containers se comunicam através de redes Docker. Por padrão, containers na mesma rede se encontram pelo nome.
# Criar rede
docker network create minha-rede
# Rodar containers na mesma rede
docker run -d --name db --network minha-rede postgres:15
docker run -d --name app --network minha-rede -p 3000:3000 minha-app:1.0
# O container "app" acessa o banco pelo hostname "db"
# Ex: postgresql://db:5432/meubanco
🐙 Docker Compose
O Docker Compose orquestra múltiplos containers com um único arquivo docker-compose.yml:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DB_HOST=db
- DB_PORT=5432
depends_on:
- db
db:
image: postgres:15
volumes:
- dados-db:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=senha123
- POSTGRES_DB=meubanco
volumes:
dados-db:
# Subir todos os serviços
docker compose up -d
# Ver logs
docker compose logs -f
# Parar tudo
docker compose down
docker compose down -v para remover também os volumes ao derrubar o ambiente.☁️ Docker Hub e Registries
Publique e compartilhe imagens no Docker Hub ou em registries privados como o Amazon ECR.
# Login no Docker Hub
docker login
# Tag da imagem para o registry
docker tag minha-app:1.0 meuusuario/minha-app:1.0
# Push para o Docker Hub
docker push meuusuario/minha-app:1.0
# Push para o Amazon ECR
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin \
123456789.dkr.ecr.us-east-1.amazonaws.com
docker tag minha-app:1.0 \
123456789.dkr.ecr.us-east-1.amazonaws.com/minha-app:1.0
docker push \
123456789.dkr.ecr.us-east-1.amazonaws.com/minha-app:1.0
