Docker Compose
A tool for defining and running multi-container Docker applications.
Detailed Explanation
With Docker Compose, you use a YAML file to configure your application's services (e.g., a web app, a database, and a cache). You can then start all services with a single command (`docker-compose up`). This is perfect for setting up local development environments that mirror production stacks without manual configuration.
Quick Summary
Docker Compose orchestrates a small set of containers on a single host from one YAML file, `docker compose up` brings up web, db, cache, and friends together. It's the standard for local dev environments and simple production deployments.
Key Takeaways
- One `compose.yaml` describes services, networks, volumes, and dependencies; one command boots the whole stack.
- `docker compose` (with a space) is the modern v2 plugin built into Docker; `docker-compose` (hyphen) is the legacy Python v1 tool.
- Compose creates an isolated network per project so services can reach each other by service name (e.g., http://db:5432).
- Override files (`compose.override.yaml`, `compose.prod.yaml`) layer environment-specific config on a shared base.
- Compose is single-host; for multi-host orchestration, graduate to Kubernetes, ECS, or Nomad.
When to use it
- Local dev environments: app + database + Redis + worker, all reproducible with one command.
- End-to-end tests in CI: spin up the full stack, run the suite, tear down.
- Simple production deployments on a single VPS where Kubernetes is overkill.
- Demoing or onboarding new contributors, `git clone && docker compose up` is hard to beat.
Common Mistakes
- Using Compose for multi-host production deployments; it has no scheduler and no failover.
- Mounting code into containers for prod the way you do in dev, slow, surprising, and not how immutable images should work.
- Storing secrets in committed compose files; use `.env` files (gitignored) or external secret managers.
- Letting `compose.yaml` drift from the Dockerfile so production-like behavior is impossible to reproduce.
Docker Compose, Frequently Asked
Docker Compose vs. Kubernetes?
Compose is for one host and a small stack, fast to set up, no scheduler. Kubernetes is for clusters with scaling, healing, and rolling updates across many nodes. For dev environments use Compose; for production at any scale use Kubernetes or a managed equivalent.
Can I use Docker Compose in production?
Yes, for small single-host deployments, many indie products run happily this way. You give up multi-host orchestration, automated rollouts, and self-healing, so the trade-off only works when the workload fits one machine.
What's the difference between `docker-compose` and `docker compose`?
`docker-compose` (hyphen) is the original Python v1 tool, now in maintenance mode. `docker compose` (space) is the rewritten v2 plugin built into modern Docker; it's faster and the long-term direction. Switch when convenient.