Docker Compose Guide

Guia Completo de Docker Compose

Aprenda tudo sobre Docker Compose, desde os conceitos básicos até práticas avançadas de produção para orquestrar aplicações multi-container.

Arquitetura Docker Compose
docker-compose.yml
Services
Networks
Volumes
Environment

Por Que Usar Docker Compose?

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.

Simples

Arquivo único YAML

Rápido

Setup em minutos

Portável

Mesmo ambiente em qualquer lugar

Escalável

Replicas com um comando

Conceitos Fundamentais do Docker Compose

Entenda os componentes essenciais da orquestração com Docker Compose

docker-compose.yml

Arquivo de configuração principal que define serviços, redes, volumes e variáveis de ambiente.

Services

Definem os containers que compõem sua aplicação, incluindo imagem, portas, volumes e dependências.

Networks

Permite que containers se comuniquem entre si e com o mundo exterior de forma isolada e segura.

Volumes

Gerenciam dados persistentes entre reinicializações de containers, essenciais para bancos de dados.

Environment Variables

Configurações externas que permitem diferentes comportamentos em diferentes ambientes.

Dependências

Controlam a ordem de inicialização dos serviços para garantir que dependências estejam prontas.

Primeiros Passos com Docker Compose

Instalação e comandos básicos para começar

Instalação do Docker Compose

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

Comandos Essenciais

  • docker-compose up - Iniciar serviços
  • docker-compose down - Parar e remover serviços
  • docker-compose build - Construir/reconstruir imagens
  • docker-compose logs - Visualizar logs
  • docker-compose ps - Listar containers em execução
  • docker-compose exec - Executar comandos em serviços

Configuração Básica do docker-compose.yml

Estrutura 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
Version

Especifica a versão do schema do Compose

Services

Definem os containers da aplicação

Volumes

Gerenciam armazenamento persistente

Arquitetura de Rede com Docker Compose

Como os serviços se comunicam entre si e com o mundo exterior

Web
Porta 3000
Database
Porta 5432
Redis
Porta 6379
# 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

Gestão de Ambientes

Configuração diferente para desenvolvimento, teste e produção

Arquivo .env

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

Múltiplos arquivos Compose

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

Recursos Avançados

Funcionalidades poderosas para cenários complexos

Escalabilidade

Escalone serviços horizontalmente com o comando scale ou defina deploy no arquivo.

Segurança

Use secrets para gerenciar credenciais sensíveis e evite hardcode de senhas.

Health Checks

Defina verificações de saúde para garantir que serviços estejam funcionando corretamente.

Extensibilidade

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

Docker Compose em Produção

Estratégias e melhores práticas para ambientes de produção

1

Imagens Oficiais

Use tags específicas em vez de latest para garantir reprodutibilidade.

# Bom
image: postgres:13.5

# Evite
image: postgres:latest
2

Limites de Recursos

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
3

Logs Estruturados

Configure drivers de log para melhor monitoramento e análise.

services:
  web:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
4

Atualizações Contínuas

Use estratégias de atualização como rolling updates para zero downtime.

services:
  web:
    deploy:
      update_config:
        parallelism: 2
        delay: 10s
        order: start-first

Segurança em Docker Compose

Práticas essenciais para manter suas aplicações seguras

Princípios de Segurança

1. Princípio do Menor Privilégio

Execute containers como usuário não-root sempre que possível.

2. Scanning de Vulnerabilidades

Verifique imagens regularmente em busca de vulnerabilidades conhecidas.

3. Segredos vs Variáveis

Use secrets para dados sensíveis e variáveis de ambiente para configurações não sensíveis.

4. Redes Internas

Isole serviços críticos em redes internas sem acesso ao mundo exterior.

5. Atualizações Regulares

Mantenha suas imagens base e dependências sempre atualizadas.

Usuário Não-Root

services:
  web:
    user: "1000:1000"

Secrets

secrets:
  db_password:
    external: true
Dica Importante

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.

Padrões Comuns de Arquitetura

Exemplos práticos para cenários comuns de aplicação

Desenvolvimento Web

Aplicação web com Node.js, PostgreSQL e Redis para cache.

E-commerce

Loja virtual com frontend, backend, banco de dados, cache e serviço de email.

Data Science

Ambiente Jupyter com bibliotecas científicas, banco de dados e armazenamento de dados.

Monitoramento

Stack de observabilidade com Prometheus, Grafana, Loki e Alertmanager.

Solução de Problemas

Comandos e técnicas para diagnosticar e resolver problemas comuns

Diagnóstico de Problemas

  • docker-compose logs -f service - Logs em tempo real
  • docker-compose config - Validação do arquivo YAML
  • docker-compose top - Processos em execução
  • docker stats - Uso de recursos

Problemas Comuns

  • Portas em conflito
  • Volumes não montando
  • Dependências não resolvidas
  • Variáveis de ambiente ausentes