kb.erickguedes.com
Docker: Containers do Dev ao Deploy

Docker Compose

Aula 3 de 7

O que é Docker Compose?

Compose define aplicações multi-container em YAML. Um único comando sobe toda a stack.

# compose.yaml
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    depends_on:
      - api

  api:
    build: ./api
    environment:
      - DB_HOST=db
      - DB_NAME=appdb
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: appdb
      POSTGRES_PASSWORD: secret
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 5s

volumes:
  pgdata:

Comandos Essenciais

docker compose up -d                         # sobe tudo
docker compose up -d --build                 # reconstrói e sobe
docker compose down                          # para e remove
docker compose down -v                       # remove volumes também
docker compose ps                            # status
docker compose logs -f                       # logs de todos
docker compose logs -f api                   # logs do serviço api
docker compose exec api bash                 # executa comando
docker compose restart web
docker compose pull                          # baixa imagens atualizadas
docker compose build                         # só build sem subir
docker compose config                        # valida compose

Variáveis de Ambiente

# compose.yaml
services:
  app:
    image: app:${TAG:-latest}
    environment:
      - NODE_ENV=${NODE_ENV:-production}
      - DATABASE_URL=postgres://user:${DB_PASS}@db:5432/app
    env_file:
      - .env
      - .env.${NODE_ENV}  # .env.production
# .env (lido automaticamente pelo compose)
TAG=v1.2.0
NODE_ENV=production
DB_PASS=supersecret

Profiles — Serviços Opcionais

services:
  web:
    image: nginx:alpine

  adminer:
    image: adminer
    profiles:
      - tools
    ports:
      - "8081:8080"

  mailhog:
    image: mailhog/mailhog
    profiles:
      - tools
      - dev
    ports:
      - "8025:8025"
docker compose up -d                        # só web
docker compose --profile tools up -d        # web + adminer
docker compose --profile dev up -d          # web + mailhog

Redes no Compose

services:
  api:
    networks:
      - frontend
      - backend
    depends_on:
      - db

  db:
    networks:
      - backend
    # Sem exposição externa

  web:
    networks:
      - frontend
    ports:
      - "80:80"

networks:
  frontend:
    driver: bridge
  backend:
    internal: true  # sem acesso externo

Lab: Stack Completa

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - REDIS_URL=redis://cache:6379
      - DB_URL=postgres://postgres:secret@db:5432/app
    depends_on:
      cache:
        condition: service_started
      db:
        condition: service_healthy
    develop:
      watch:
        - path: ./src
          action: sync
        - path: package.json
          action: rebuild

  cache:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

  db:
    image: postgres:16-alpine
    volumes:
      - pg-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret
    healthcheck:
      test: pg_isready
      interval: 10s

volumes:
  redis-data:
  pg-data:
docker compose up -d --watch   # hot reload ao alterar ./src

Compose é a ferramenta ideal para desenvolvimento local e ambientes de teste. profiles permitem controlar serviços extras (adminer, mailhog). develop.watch = hot reload nativo.