Arquivo de Conhecimento

Seu Blog de Tecnologia

Dicas de Tecnologia, Tutoriais, Desenvolvimento Web, Marketing, Ruby e Next JS

Table of Contents

Docker Compose para Pequenas Ideias: do Zero ao Container em Minutos — Sem Complicar

Você tem uma ideia. Um projeto pessoal, um MVP, uma automação que quer rodar localmente antes de subir pra nuvem. O problema clássico: funciona na sua máquina, quebra na do amigo, some no servidor. Docker Compose resolve isso — e custa menos complexidade do que você imagina.

O que é Docker Compose e por que ele importa pra você

Docker Compose é uma ferramenta que permite definir e rodar aplicações multi-container com um único arquivo de configuração: o docker-compose.yml. Em vez de subir containers manualmente com comandos longos e memorizar flags, você declara tudo — redes, volumes, variáveis de ambiente, dependências entre serviços — e sobe tudo com um único comando.

Para quem está construindo projetos solo ou em times pequenos, o Compose é o equilíbrio perfeito: poder de orquestração sem a curva de aprendizado do Kubernetes. É exatamente o que cabe numa “pequena ideia” que pode virar grande.

Contexto rápido

O Docker Engine cuida de criar e rodar containers individuais. O Compose orquestra múltiplos containers que precisam conversar entre si — como uma API, um banco de dados e um cache Redis rodando juntos de forma coordenada.

Quando usar (e quando não usar) Docker Compose

Use quando:

  • Seu projeto tem mais de um serviço (backend + banco + fila + cache)
  • Você quer ambiente reproduzível entre máquinas e times
  • Precisa testar integrações localmente sem depender de serviços externos
  • Quer subir ferramentas como n8n, Grafana, Portainer, Metabase com um comando

Não use quando:

  • Seu projeto é um script Python de arquivo único sem dependências externas
  • Você está em produção com alta escala (aí o Kubernetes entra em cena)
  • A complexidade de containerizar supera o benefício real do projeto

Instalação: pré-requisitos e setup

Desde o Docker Desktop v3.x, o Compose já vem embutido como plugin — o comando é docker compose (sem hífen). Em sistemas Linux, pode ser necessário instalar o plugin separadamente:

sudo apt-get update
sudo apt-get install docker-compose-plugin

docker compose version

Anatomia de um docker-compose.yml

O arquivo usa sintaxe YAML e é organizado em blocos principais. Veja a estrutura essencial:

docker-compose.yml

version: "3.9"

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      - db

  db:
    image: postgres:15-alpine
    volumes:
      - pg_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=mydb

volumes:
  pg_data:

Destrinchando o que importa:

  • services: cada bloco é um container independente
  • build: aponta para o Dockerfile da sua aplicação
  • image: usa uma imagem pronta do Docker Hub
  • ports: mapeia porta do host para a do container (host:container)
  • volumes: persiste dados fora do ciclo de vida do container
  • depends_on: garante a ordem de inicialização dos serviços
  • environment: injeta variáveis de ambiente com segurança

Projeto prático: API Node.js + PostgreSQL + Redis em 5 minutos

Nada melhor do que um caso real. Aqui está o Compose de um projeto que une uma API Express, banco relacional e cache:

docker-compose.yml — stack completa

version: "3.9"

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "4000:4000"
    env_file: .env
    depends_on:
      - postgres
      - redis
    restart: unless-stopped

  postgres:
    image: postgres:15-alpine
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASS}
      POSTGRES_DB: ${DB_NAME}

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

comandos essenciais:

# Subir todos os serviços em background
docker compose up -d

# Ver logs de um serviço específico
docker compose logs -f api

# Parar e remover containers (mantém volumes)
docker compose down

# Recriar containers após mudança no Dockerfile
docker compose up -d --build

# Entrar no shell de um container
docker compose exec api sh

# Ver status dos serviços
docker compose ps

Usando arquivo .env para segredos

Nunca coloque senhas e tokens direto no docker-compose.yml. Use um arquivo .env na raiz do projeto e adicione-o ao .gitignore:

.env

DB_USER=admin
DB_PASS=supersecret
DB_NAME=meuapp
REDIS_URL=redis://redis:6379

Padrões avançados que valem a pena conhecer

Health checks: garantindo que o serviço está realmente pronto

postgres com healthcheck

postgres:
    image: postgres:15-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"]
      interval: 5s
      timeout: 5s
      retries: 5

Múltiplos ambientes com override files

O Compose suporta arquivos de override para separar configurações de desenvolvimento e produção:

estrutura de arquivos

docker-compose.yml          # base compartilhada
docker-compose.dev.yml      # overrides para desenvolvimento
docker-compose.prod.yml     # overrides para produção

# Subir ambiente de dev
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d

n8n + Postgres com Docker Compose

Se você trabalha com automações no n8n, o Compose é a forma mais limpa de rodá-lo localmente com banco de dados persistente:

docker-compose.yml — n8n + postgres

version: "3.9"

services:
  n8n:
    image: n8nio/n8n:latest
    ports:
      - "5678:5678"
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=n8npass
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy

  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: n8npass
      POSTGRES_DB: n8n
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]
      interval: 5s
      retries: 5

volumes:
  n8n_data:
  pg_data:

Boas práticas que separam o amador do profissional

  • Use imagens Alpine (postgres:15-alpine, node:20-alpine) — são menores, mais rápidas e têm menor superfície de ataque
  • Sempre versione suas imagens — evite :latest em produção; pins como :15.3 garantem reprodutibilidade
  • Use restart policies — unless-stopped garante que o serviço suba automaticamente após reinicialização do servidor
  • Nomeie seus volumes explicitamente — facilita backup e inspeção
  • Separe redes por domínio — serviços que não precisam conversar não devem estar na mesma rede
  • Nunca exponha portas desnecessárias — se o banco só precisa falar com a API, não mapeie a porta 5432 para o host

A lógica por trás: por que isso muda a forma de desenvolver

O Compose implementa a filosofia de infraestrutura como código (IaC) na sua forma mais acessível. Seu ambiente deixa de ser “aquela coisa que funciona só na minha máquina” e passa a ser um arquivo versionável, compartilhável, auditável.

Para pequenas ideias isso significa: você pode documentar o setup inteiro no README.md, um colaborador clona o repositório, roda docker compose up -d e está com o ambiente idêntico ao seu em menos de dois minutos. Zero atrito para começar a contribuir.

E quando a ideia crescer? O mesmo docker-compose.yml serve de base para migrar para Kubernetes, ECS, Fly.io ou qualquer orquestrador de containers. Você não joga fora o que construiu — você escala.

Esse post foi útil pra você?Compartilhe com um dev que ainda sente dor de cabeça configurando ambiente.

Tem uma stack específica que você quer ver em Docker Compose — Ruby on Rails, FastAPI, Laravel? Deixa nos comentários.