Ideia central
Docker Compose é uma ferramenta para definir e executar aplicações multi-container usando um arquivo compose.yaml (ou docker-compose.yml). Com um único comando (docker compose up), você sobe toda a stack (banco de dados, API, cache, proxy reverso) com as configurações corretas de rede, volumes e dependências.
Estrutura do compose.yaml
# Versão não é mais necessária no Compose V2+
services:
# Nome do serviço (funciona como hostname na rede interna)
api:
build: . # build do Dockerfile no dir atual
image: minha-api:latest # ou usar imagem pronta
container_name: api # nome explícito (opcional)
ports:
- "3000:3000" # host:container
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://db:5432/app
env_file:
- .env # carregar de arquivo
depends_on:
db:
condition: service_healthy # aguarda db estar saudável
restart: unless-stopped
networks:
- backend
db:
image: postgres:16-alpine
volumes:
- postgres_data:/var/lib/postgresql/data # volume nomeado
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # bind mount
environment:
POSTGRES_DB: app
POSTGRES_USER: user
POSTGRES_PASSWORD: secret
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d app"]
interval: 10s
timeout: 5s
retries: 5
networks:
- backend
redis:
image: redis:7-alpine
networks:
- backend
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- api
networks:
- frontend
- backend
networks:
frontend:
backend:
volumes:
postgres_data: # volume gerenciado pelo Docker (persiste entre restarts)Comandos essenciais
# Subir toda a stack (em background)
docker compose up -d
# Subir e forçar rebuild das imagens
docker compose up -d --build
# Parar e remover containers (mantém volumes e imagens)
docker compose down
# Parar, remover containers E volumes
docker compose down -v
# Ver status dos serviços
docker compose ps
# Ver logs de todos os serviços
docker compose logs -f
# Ver logs de um serviço específico
docker compose logs -f api
# Executar comando em um serviço
docker compose exec api sh
# Escalar um serviço (múltiplas réplicas)
docker compose up -d --scale api=3
# Recriar apenas um serviço específico
docker compose up -d --no-deps apiMúltiplos arquivos (override)
Útil para ter configurações base + ambiente específico:
# Padrão: lê compose.yaml + compose.override.yaml automaticamente
docker compose up
# Especificar arquivos manualmente
docker compose -f compose.yaml -f compose.prod.yaml up -dExemplo de compose.override.yaml para desenvolvimento:
services:
api:
build:
target: dev # stage de dev no multi-stage build
volumes:
- .:/app # hot reload
environment:
- NODE_ENV=development
command: npm run devHealthcheck e depends_on
O depends_on simples apenas espera o container iniciar, não estar pronto. Para aguardar o serviço estar de fato funcional, use condition: service_healthy com um healthcheck definido:
depends_on:
db:
condition: service_healthy # aguarda healthcheck passar
redis:
condition: service_started # apenas aguarda iniciar (padrão)Boas práticas
- Use volumes nomeados para dados persistentes (banco, uploads), evitando depender do filesystem do container
- Prefira redes customizadas: o Compose cria uma por projeto automaticamente
- Use
.envpara secrets e variáveis de ambiente sensíveis (não commite no git) - Defina
healthchecknos serviços críticos paradepends_onfuncionar corretamente - Use
profilespara serviços opcionais (ex: ferramentas de debug que só sobem quando necessário)
Conexões
- docker-conceitos-fundamentais - Fundamentos do Docker
- docker-redes - Como redes funcionam no Compose
- docker-volumes - Persistência de dados no Compose
- docker-imagens - Build de imagens no Compose
- Kubernetes - Próximo passo para orquestração em produção