Docker é uma plataforma de containerização que virtualiza sistemas operacionais, permitindo empacotar aplicações com suas dependências em contêineres isolados e portáveis.
Para instalação do WSL2, consulte: codeedu/wsl2-docker-quickstart
O acesso às unidades de armazenamento no WSL é feito através do diretório /mnt/:
# Navegar para unidades de armazenamento
cd /mnt/
# Copiar arquivos entre Linux e Windows
cp /home/lucas/documento.docx /mnt/c/Users/lucas/DocumentsPara acesso via interface gráfica, digite \\wsl$ no Windows Explorer.
# Listar contêineres
docker ps # Em execução
docker ps -a # Todos os contêineres
# Executar contêineres
docker run nginx # Modo padrão
docker run -d nginx # Modo detached (background)
docker run -d -p 8080:80 nginx # Com porta exposta
docker run -d --name meu-nginx nginx # Com nome customizado
docker run --rm nginx # Remove após execução
# Controle de contêineres
docker start <container-name> # Iniciar contêiner parado
docker stop <container-name> # Parar contêiner
docker restart <container-name> # Reiniciar contêiner
docker rm <container-name> # Remover contêiner
docker rm <container-name> -f # Remover forçado
# Acesso ao contêiner
docker exec -it <container-name> bash # Executar comando interativo
docker attach <container-name> # Conectar ao processo principaldocker images # Listar imagens locais
docker pull <image-name> # Baixar imagem do registry
docker rmi <image-name> # Remover imagem
docker build -t <tag> . # Construir imagem a partir do Dockerfile# Remover todos contêineres parados
docker rm $(docker ps -a -q) -f
# Remover imagens não utilizadas
docker image prune
# Limpeza completa do sistema
docker system prune -aContêineres são unidades de software que empacotam código e dependências, garantindo execução consistente entre ambientes. Baseiam-se em três pilares fundamentais:
Namespaces: Isolam processos para evitar conflitos com outros componentes do sistema operacional.
CGroups: Controlam e limitam o uso de recursos do sistema (CPU, memória, I/O) para evitar sobrecarga.
Overlay File System (OFS): Permite reutilização de camadas entre contêineres, otimizando armazenamento e reduzindo duplicação.
Imagens são templates imutáveis que servem como base para criar contêineres. Características importantes:
- Compostas por camadas reutilizáveis
- Versionadas através de tags
- Armazenadas em registries (Docker Hub, AWS ECR, etc.)
- Imutáveis durante execução do contêiner
Contêineres são efêmeros por design. Dados gravados no sistema de arquivos do contêiner são perdidos quando ele é removido. Para persistência, utilize volumes ou bind mounts.
Arquivo de configuração que define como construir uma imagem Docker:
# Imagem base
FROM ubuntu:latest
# Instalar dependências
RUN apt-get update && apt-get install -y nginx
# Copiar arquivos
COPY ./app /var/www/html
# Expor porta
EXPOSE 80
# Comando de inicialização
CMD ["nginx", "-g", "daemon off;"]# Construir imagem
docker build -t minha-imagem:latest .
# Especificar Dockerfile customizado
docker build -f custom.dockerfile -t minha-imagem:latest .
# Build com argumentos
docker build --build-arg ARG_NAME=value -t minha-imagem .- CMD: Comando padrão que pode ser sobrescrito
- ENTRYPOINT: Comando fixo sempre executado
Vinculam diretórios do host ao contêiner:
# Sintaxe antiga (ainda funcional)
docker run -d -v ~/local:/container nginx
# Sintaxe recomendada
docker run -d --mount type=bind,source="$(pwd)",target=/app nginxGerenciados pelo Docker, independentes do ciclo de vida dos contêineres:
# Gerenciar volumes
docker volume create meu-volume # Criar
docker volume ls # Listar
docker volume inspect meu-volume # Inspecionar
docker volume rm meu-volume # Remover
docker volume prune # Limpar não utilizados
# Usar volume em contêiner
docker run -d --mount type=volume,source=meu-volume,target=/data nginxBridge (padrão): Comunicação entre contêineres no mesmo host
Host: Compartilha rede com o host (não funciona no macOS)
Overlay: Comunicação entre contêineres em hosts diferentes
Macvlan: Permite definir endereço MAC personalizado
None: Isola completamente o contêiner
# Gerenciar redes
docker network ls # Listar redes
docker network create <network-name> # Criar rede bridge
docker network create --driver overlay <network-name> # Criar rede overlay
docker network inspect <network-name> # Inspecionar rede
docker network rm <network-name> # Remover rede
# Conectar contêineres
docker run -d --network <network-name> nginx # Conectar na criação
docker network connect <network-name> <container> # Conectar contêiner existente
docker network disconnect <network-name> <container> # Desconectar
# Acesso a serviços do host
# Use host.docker.internal:porta para acessar serviços do host# Executar contêiner interativo
docker run -it ubuntu:latest bash
# Parâmetros:
# -i: Modo interativo (mantém stdin ativo)
# -t: TTY (permite digitação de comandos)Ferramenta para definir e executar aplicações multi-contêiner usando arquivos YAML.
# Gerenciar serviços
docker compose up # Iniciar serviços
docker compose up -d # Iniciar em background
docker compose up --build # Rebuild das imagens
docker compose down # Parar e remover serviços
docker compose restart # Reiniciar serviços
docker compose logs # Ver logs dos serviços
docker compose ps # Listar serviços em execuçãoversion: '3.8'
services:
web:
build: .
ports:
- "8080:80"
volumes:
- .:/app
networks:
- app-network
depends_on:
- database
environment:
- NODE_ENV=production
database:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: app_db
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
volumes:
db-data:
networks:
app-network:
driver: bridge- Use imagens oficiais como base sempre que possível
- Minimize camadas combinando comandos RUN
- Use .dockerignore para excluir arquivos desnecessários
- Não execute como root dentro do contêiner
- Use multi-stage builds para reduzir tamanho da imagem
- Especifique versões das imagens base (evite 'latest')
- Defina limites de recursos (CPU, memória)
- Use health checks para monitoramento
- Implemente logs estruturados
- Configure restart policies adequadas
- Escaneie imagens em busca de vulnerabilidades
- Use usuários não-privilegiados
- Minimize superfície de ataque (imagens distroless)
- Gerencie secrets adequadamente (não em variáveis de ambiente)
# Estágio de build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# Estágio final
FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]