Goal: reproducible multi-service environments that start cleanly.
Use for:
- running an app with its databases and dependencies locally
- standing up integration-test environments
- reviewing compose files for correctness and safety
Workflow:
- Define one service per container with a clear image and build.
- Use healthchecks and depends_on conditions for startup order.
- Pass configuration via environment and .env, not hardcoding.
- Persist data with named volumes; mount code for dev only.
- Define networks to isolate and connect services.
- Verify a clean up/down cycle from scratch.
Practices:
- pin image versions, not latest
- healthchecks so dependents wait for readiness
- named volumes for stateful services
- separate override files for dev vs. test
Rules:
- never bake secrets into images or compose files
- pin versions for reproducibility
- make depends_on wait on health, not just start
- keep the environment disposable and rebuildable