Docker Compose Patterns
Multi-service apps, volumes, networks, health checks, profiles, override files.
dockerdevopsbackend
# Docker Compose Patterns
## Full-stack example
```yaml
# compose.yml
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: appdb
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
restart: unless-stopped
api:
build: ./api
restart: unless-stopped
ports: ["3000:3000"]
environment:
DATABASE_URL: postgres://app:secret@db/appdb
REDIS_URL: redis://redis:6379
depends_on:
db:
condition: service_healthy
develop:
watch:
- action: sync
path: ./api/src
target: /app/src
web:
build: ./web
ports: ["80:80"]
depends_on: [api]
volumes:
pgdata:
networks:
default:
name: appnet
```
## Override files
```yaml
# compose.override.yml (auto-merged in dev)
services:
api:
environment:
NODE_ENV: development
volumes: ["./api:/app"] # bind mount for hot reload
# compose.prod.yml
services:
api:
image: registry.example.com/api:${TAG}
deploy:
replicas: 3
resources:
limits: { cpus: '0.5', memory: 512M }
```
```bash
docker compose -f compose.yml -f compose.prod.yml up -d
```
## Profiles (optional services)
```yaml
services:
mailhog:
image: mailhog/mailhog
profiles: [dev]
prometheus:
image: prom/prometheus
profiles: [monitoring]
```
```bash
docker compose --profile dev up
```
## Useful commands
```bash
docker compose up -d --build # build & start detached
docker compose logs -f api # stream logs
docker compose exec api sh # shell into running container
docker compose ps
docker compose down -v # stop + remove volumes
docker compose restart api
docker compose scale api=3 # or use replicas in yaml
```
## Secrets (production)
```yaml
services:
api:
secrets: [db_password]
secrets:
db_password:
file: ./secrets/db_password.txt
# or: external: true (Docker Swarm / Kubernetes secret)
```API: /api/skills/docker-compose-patterns