Aprenda tudo sobre Docker Compose, desde os conceitos básicos até práticas avançadas de produção para orquestrar aplicações multi-container.
Docker Compose é uma ferramenta para definir e executar aplicações multi-container usando um único arquivo YAML. Ele simplifica a orquestração de serviços complexos e é essencial para desenvolvimento local e ambientes de teste.
Arquivo único YAML
Setup em minutos
Mesmo ambiente em qualquer lugar
Replicas com um comando
Entenda os componentes essenciais da orquestração com Docker Compose
Arquivo de configuração principal que define serviços, redes, volumes e variáveis de ambiente.
Definem os containers que compõem sua aplicação, incluindo imagem, portas, volumes e dependências.
Permite que containers se comuniquem entre si e com o mundo exterior de forma isolada e segura.
Gerenciam dados persistentes entre reinicializações de containers, essenciais para bancos de dados.
Configurações externas que permitem diferentes comportamentos em diferentes ambientes.
Controlam a ordem de inicialização dos serviços para garantir que dependências estejam prontas.
Instalação e comandos básicos para começar
Docker Compose geralmente vem incluído com Docker Desktop, mas pode ser instalado separadamente.
# Linux
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Verificar instalação
docker-compose --version
docker-compose up - Iniciar serviçosdocker-compose down - Parar e remover serviçosdocker-compose build - Construir/reconstruir imagensdocker-compose logs - Visualizar logsdocker-compose ps - Listar containers em execuçãodocker-compose exec - Executar comandos em serviçosEstrutura e sintaxe do arquivo de configuração principal
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
- redis
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:password@db:5432/myapp
volumes:
- ./app:/app
- node_modules:/app/node_modules
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
redis:
image: redis:6-alpine
volumes:
db_data:
node_modules:
networks:
default:
driver: bridge
Especifica a versão do schema do Compose
Definem os containers da aplicação
Gerenciam armazenamento persistente
Como os serviços se comunicam entre si e com o mundo exterior
# Configuração avançada de rede
version: '3.8'
services:
web:
image: nginx
ports:
- "80:80"
- "443:443"
networks:
- frontend
- backend
api:
build: ./api
networks:
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # Isolada do mundo exterior
Configuração diferente para desenvolvimento, teste e produção
Variáveis de ambiente compartilhadas entre todos os serviços.
# .env
DATABASE_HOST=db
DATABASE_PORT=5432
REDIS_HOST=redis
REDIS_PORT=6379
NODE_ENV=development
Sobrescreva configurações para diferentes ambientes.
# docker-compose.prod.yml
version: '3.8'
services:
web:
build:
context: .
args:
- NODE_ENV=production
ports:
- "80:3000"
environment:
- NODE_ENV=production
# Comando para usar múltiplos arquivos
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Funcionalidades poderosas para cenários complexos
Escalone serviços horizontalmente com o comando scale ou defina deploy no arquivo.
Use secrets para gerenciar credenciais sensíveis e evite hardcode de senhas.
Defina verificações de saúde para garantir que serviços estejam funcionando corretamente.
Use extends para reutilizar configurações entre diferentes arquivos Compose.
# Exemplo de health check e secrets
version: '3.8'
services:
web:
image: myapp:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
Estratégias e melhores práticas para ambientes de produção
Use tags específicas em vez de latest para garantir reprodutibilidade.
# Bom
image: postgres:13.5
# Evite
image: postgres:latest
Defina limites de CPU e memória para evitar consumo excessivo de recursos.
services:
web:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
Configure drivers de log para melhor monitoramento e análise.
services:
web:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Use estratégias de atualização como rolling updates para zero downtime.
services:
web:
deploy:
update_config:
parallelism: 2
delay: 10s
order: start-first
Práticas essenciais para manter suas aplicações seguras
Execute containers como usuário não-root sempre que possível.
Verifique imagens regularmente em busca de vulnerabilidades conhecidas.
Use secrets para dados sensíveis e variáveis de ambiente para configurações não sensíveis.
Isole serviços críticos em redes internas sem acesso ao mundo exterior.
Mantenha suas imagens base e dependências sempre atualizadas.
services:
web:
user: "1000:1000"
secrets:
db_password:
external: true
Nunca armazene senhas, tokens ou chaves de API diretamente no arquivo docker-compose.yml. Use sempre secrets ou variáveis de ambiente carregadas de arquivos externos.
Exemplos práticos para cenários comuns de aplicação
Aplicação web com Node.js, PostgreSQL e Redis para cache.
Loja virtual com frontend, backend, banco de dados, cache e serviço de email.
Ambiente Jupyter com bibliotecas científicas, banco de dados e armazenamento de dados.
Stack de observabilidade com Prometheus, Grafana, Loki e Alertmanager.
Comandos e técnicas para diagnosticar e resolver problemas comuns
docker-compose logs -f service - Logs em tempo realdocker-compose config - Validação do arquivo YAMLdocker-compose top - Processos em execuçãodocker stats - Uso de recursos