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 -dExercício
Adicione um terceiro serviço redis (imagem redis:7-alpine) ao compose acima, e faça api depender dele também.