🐳 Docker — Fundamentos

Containers, imagens, volumes, redes e docker-compose

📦 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.

💡 Analogia: Pense em um container como uma caixa padronizada de navio — não importa o que está dentro, ela se encaixa em qualquer navio (servidor).

🚀 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
💡 Dica: Use 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