Lesson 1: The Orchestra Conductor (Docker Compose)
Running one container is easy. But real applications have multiple services — a web server, a database, a cache, a message queue. Managing them all with individual docker run commands is a nightmare. Docker Compose lets you define and manage multi-container applications with a single file.
The Problem
Without Compose, launching a typical web app looks like this:
docker network create app-net
docker volume create db-data
docker run -d --name db --network app-net -v db-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=secret postgres
docker run -d --name redis --network app-net redis
docker run -d --name web --network app-net -p 3000:3000 -e DATABASE_URL=postgres://db:5432 my-app
That's 5 commands to remember. Now imagine doing this on every server, every time.
The Solution: docker-compose.yml
One file to rule them all:
version: "3.8"
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://db:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- db
- redis
db:
image: postgres:15-alpine
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=myapp
redis:
image: redis:alpine
volumes:
db-data:
Compose Commands
| Command | Action |
|---------|--------|
| docker compose up | Start all services |
| docker compose up -d | Start in background |
| docker compose down | Stop and remove everything |
| docker compose ps | List running services |
| docker compose logs | View logs from all services |
| docker compose logs web | View logs from one service |
| docker compose build | Rebuild images |
| docker compose restart | Restart all services |
| docker compose exec web bash | Shell into a service |
Key YAML Fields
| Field | Purpose |
|-------|---------|
| image | Use a pre-built image |
| build | Build from a Dockerfile |
| ports | Port mappings |
| volumes | Mount volumes |
| environment | Set env variables |
| depends_on | Start order (db before web) |
| restart | Restart policy (always, on-failure) |
| networks | Custom network assignment |
Compose Automatically Creates
When you run docker compose up, it automatically creates:
- ✅ A network for all services (they can talk by name).
- ✅ Volumes defined in the file.
- ✅ Containers for each service.
Mission Objective
Conduct your first orchestra:
- Write the score: Create
docker-compose.ymlwithtouch docker-compose.yml. - Play! Start everything with
docker compose up -d. - Check the ensemble: View all services with
docker compose ps.