Docker¶
Instala e configura o Docker CLI e Engine para gerenciamento de containers.
O que é Docker?¶
Docker é a plataforma líder mundial em containers, permitindo que desenvolvedores empacotem aplicações e suas dependências em containers portáteis que podem ser executados em qualquer ambiente que suporte Docker. Esta instalação inclui apenas o Docker CLI e Engine, sem o Docker Desktop.
Características Principais¶
- Portabilidade: Containers funcionam consistentemente em qualquer ambiente
- Isolamento: Aplicações rodam isoladas umas das outras
- Eficiência: Containers compartilham o kernel do sistema operacional
- Velocidade: Inicialização rápida comparada a máquinas virtuais
- Ecosistema Rico: Docker Hub com milhões de imagens prontas
Docker vs Podman¶
| Característica | Docker | Podman |
|---|---|---|
| Arquitetura | Cliente-servidor (daemon) | Daemon-less |
| Permissões | Requer grupo docker | Rootless nativo |
| Compatibilidade | Padrão da indústria | Compatível com Docker |
| Compose | docker-compose | podman-compose |
| Desktop | Docker Desktop disponível | Sem interface gráfica oficial |
Uso¶
Opções¶
| Opção | Descrição |
|---|---|
-h, --help |
Mostra mensagem de ajuda |
--uninstall |
Desinstala o Docker |
-u, --upgrade |
Atualiza para a versão mais recente |
-v, --verbose |
Modo detalhado com logs de debug |
-q, --quiet |
Modo silencioso |
Guia Rápido¶
Instalação¶
Pós-Instalação¶
Após a instalação, faça logout e login novamente para que as permissões do grupo docker sejam aplicadas, ou execute:
Verificar Instalação¶
# Verificar versão
docker --version
# Testar com hello-world
docker run hello-world
# Verificar informações do sistema
docker info
Atualização¶
# Atualizar Docker
susa setup docker --upgrade
# Atualizar com logs detalhados
susa setup docker --upgrade -v
Desinstalação¶
# Desinstalar Docker
susa setup docker --uninstall
# A desinstalação irá perguntar se deseja:
# 1. Confirmar remoção do Docker
# 2. Remover imagens, containers e volumes
Primeiros Passos com Docker¶
Executar Primeiro Container¶
# Hello World
docker run hello-world
# Container interativo Ubuntu
docker run -it ubuntu bash
# Servidor web Nginx
docker run -d -p 8080:80 nginx
Gerenciar Imagens¶
# Listar imagens
docker images
# Baixar imagem
docker pull ubuntu:22.04
# Remover imagem
docker rmi ubuntu:22.04
# Limpar imagens não utilizadas
docker image prune -a
Gerenciar Containers¶
# Listar containers em execução
docker ps
# Listar todos os containers
docker ps -a
# Parar container
docker stop <container-id>
# Remover container
docker rm <container-id>
# Limpar containers parados
docker container prune
Docker Compose¶
O Docker Compose é instalado automaticamente como plugin:
# Verificar instalação
docker compose version
# Iniciar serviços
docker compose up -d
# Parar serviços
docker compose down
# Ver logs
docker compose logs -f
Recursos Avançados¶
Construir Imagens¶
Criar um Dockerfile:
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
curl \
git \
vim
WORKDIR /app
COPY . .
CMD ["bash"]
Construir e executar:
Volumes e Persistência¶
# Criar volume
docker volume create meu-volume
# Usar volume em container
docker run -v meu-volume:/data ubuntu
# Bind mount (mapear diretório local)
docker run -v $(pwd):/app ubuntu
# Listar volumes
docker volume ls
# Remover volumes não utilizados
docker volume prune
Redes¶
# Listar redes
docker network ls
# Criar rede
docker network create minha-rede
# Conectar container à rede
docker run --network minha-rede ubuntu
# Inspecionar rede
docker network inspect minha-rede
Multi-stage Builds¶
Otimizar tamanho de imagens:
# Stage de build
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage de produção
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]
Health Checks¶
FROM nginx:alpine
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
COPY index.html /usr/share/nginx/html/
Exemplo: Aplicação Full-Stack¶
docker-compose.yml¶
version: '3.8'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
environment:
- REACT_APP_API_URL=http://localhost:5000
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
environment:
- DATABASE_URL=postgresql://user:pass@database:5432/mydb
database:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
db-data:
Executar:
# Iniciar todos os serviços
docker compose up -d
# Ver logs
docker compose logs -f
# Parar todos os serviços
docker compose down
# Remover volumes também
docker compose down -v
Configurações no macOS¶
No macOS, o Docker requer uma máquina virtual para executar containers Linux. Recomendamos usar colima:
# Instalar colima
brew install colima
# Iniciar colima
colima start
# Verificar status
colima status
# Parar colima
colima stop
# Configurar recursos
colima start --cpu 4 --memory 8
Integração com IDEs¶
Visual Studio Code¶
Instale a extensão oficial:
Recursos:
- Visualizar containers e imagens
- Build e run com um clique
- Logs em tempo real
- Attach ao container para debug
JetBrains IDEs¶
Suporte nativo ao Docker em:
- IntelliJ IDEA
- PyCharm
- WebStorm
- GoLand
Configurar em: Settings → Build, Execution, Deployment → Docker
Melhores Práticas¶
Segurança¶
# Não executar containers como root quando possível
docker run --user 1000:1000 ubuntu
# Limitar recursos
docker run --memory="512m" --cpus="1.0" ubuntu
# Modo read-only
docker run --read-only ubuntu
# Usar imagens oficiais e verificadas
docker pull ubuntu:22.04
Performance¶
# Usar .dockerignore
echo "node_modules" > .dockerignore
echo ".git" >> .dockerignore
echo "*.log" >> .dockerignore
# Multi-stage builds para reduzir tamanho
# Cache de layers - comandos que mudam pouco no início
# Combinar comandos RUN para reduzir layers
Limpeza¶
# Limpar tudo não utilizado
docker system prune -a
# Limpar apenas containers parados
docker container prune
# Limpar apenas imagens não utilizadas
docker image prune
# Limpar apenas volumes não utilizados
docker volume prune
# Ver espaço utilizado
docker system df
Troubleshooting¶
Permissões Negadas¶
Se receber erro de permissão:
# Verificar se está no grupo docker
groups
# Adicionar ao grupo (feito automaticamente na instalação)
sudo usermod -aG docker $USER
# Aplicar mudanças
newgrp docker
# Ou fazer logout/login
Container não Inicia¶
# Ver logs do container
docker logs <container-id>
# Modo interativo para debug
docker run -it <imagem> bash
# Inspecionar container
docker inspect <container-id>
Problemas de Rede¶
# Verificar redes
docker network ls
# Inspecionar rede
docker network inspect bridge
# Recriar rede padrão
docker network rm bridge
docker network create bridge
Espaço em Disco¶
# Ver uso de espaço
docker system df
# Limpar tudo não utilizado (cuidado!)
docker system prune -a --volumes
# Limpar apenas imagens antigas
docker image prune -a --filter "until=720h"
Serviço Docker não Inicia¶
# Verificar status
sudo systemctl status docker
# Ver logs do serviço
sudo journalctl -u docker -n 50
# Reiniciar serviço
sudo systemctl restart docker
# Verificar configuração
docker info
Comparação com Outras Ferramentas¶
Docker vs Kubernetes¶
| Aspecto | Docker | Kubernetes |
|---|---|---|
| Propósito | Containerização | Orquestração |
| Escala | Single host | Multi-host cluster |
| Complexidade | Simples | Complexo |
| Uso | Desenvolvimento/Produção | Produção em larga escala |
Docker vs Podman¶
Veja a seção "Docker vs Podman" no início deste documento.
Quando Usar Docker¶
- Desenvolvimento local
- CI/CD pipelines
- Aplicações em produção (single host)
- Microserviços
- Ambientes de teste isolados
Quando Considerar Alternativas¶
- Podman: Se precisa de execução rootless ou daemon-less
- Kubernetes: Para orquestração em larga escala
- Docker Swarm: Para cluster simples (menos features que K8s)
- LXC/LXD: Para containers de sistema completo
Recursos Adicionais¶
Documentação Oficial¶
Aprendizado¶
Ferramentas Úteis¶
- Portainer: Interface web para gerenciar Docker
- Lazydocker: TUI para gerenciar Docker
- dive: Analisar layers de imagens
- hadolint: Linter para Dockerfiles