Aprenda / Infraestrutura — Docker

FundamentosAula 4 de 1618 min0% da trilha

docker-compose: orquestrando múltiplos serviços

Uma app real não é 1 container — é API + banco + cache, tudo precisando subir junto.

Uma aplicação de verdade quase nunca é um container sozinho — é a API, o banco de dados, talvez um Redis pra cache. Rodar cada um com docker run separado, na mão, configurando rede entre eles um por um, não escala. docker-compose descreve todos os serviços num único arquivo YAML e sobe tudo com um comando.

docker-compose.yml
services:
  api:
    build: .
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://postgres:postgres@db:5432/app_development
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

O que cada chave faz

anotado
services       cada serviço vira um container próprio
build: .       constrói a partir do Dockerfile na pasta atual (em vez de baixar imagem pronta)
image: ...     usa uma imagem pronta do Docker Hub, sem Dockerfile próprio (caso do postgres aqui)
ports          mapeia porta do host:porta do container ("3000:3000")
environment    variáveis de ambiente injetadas no container
depends_on     garante que "db" suba antes de "api" tentar se conectar
volumes        dado do postgres sobrevive a docker compose down (sem isso, reiniciar apaga tudo)

Repare em DATABASE_URL: o host não é localhost, é db — o próprio nome do serviço no compose. Containers na mesma rede do compose se enxergam pelo nome do serviço, não por IP fixo nem localhost (próxima lição detalha isso).

terminal
docker compose up -d

Exercício

Adicione um terceiro serviço redis (imagem redis:7-alpine) ao compose acima, e faça api depender dele também.

Quiz rápido

No compose, por que DATABASE_URL usa 'db' como host em vez de 'localhost'?
Pra que serve a chave volumes no compose?