7. Docker Compose

๐Ÿงฉ Docker Compose – Run Multiple Containers Easily

Running one container is fine.
But real apps usually need many containers:

Starting each one with long docker run commands is painful ๐Ÿ˜–.

๐Ÿ‘‰ Docker Compose solves this.


โšก What is Docker Compose?

Docker Compose lets you define and run multiple containers using one file called docker-compose.yml.

In simple words:

๐Ÿ“Œ Mostly used in development and testing, but also useful in small production setups.


๐Ÿฑ Easy Analogy

Imagine ordering food ๐Ÿ”๐ŸŸ๐Ÿฅค:

Instead of ordering one by one, you order a combo.

๐Ÿ‘‰ Docker Compose = Combo order for containers.


๐Ÿ“„ docker-compose.yml (The Heart of Compose)

This file describes:

Everything in YAML format.


๐Ÿ› ๏ธ Basic Docker Compose Example

Web + Database App

version: "3.9"

services:
  web:
    image: nginx
    ports:
      - "80:80"

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: root
version: "3.9"

services:
  web:
    image: nginx
    ports:
      - "80:80"

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: root

What happens:


โ–ถ๏ธ Running Docker Compose

Start everything:

docker compose up
docker compose up

Run in background:

docker compose up -d
docker compose up -d

Stop containers:

docker compose down
docker compose down

๐Ÿ‘‰ One command replaces many docker run commands.


๐Ÿ“ฆ Services in Docker Compose

Each container is called a service.

Example:

services:
  frontend:
  backend:
  database:
services:
  frontend:
  backend:
  database:

Compose automatically:


๐ŸŒ Networking in Docker Compose

By default:

๐Ÿ‘‰ Example:

backend:
  depends_on:
    - db
backend:
  depends_on:
    - db

Backend can reach DB using:

mysql -h db
mysql -h db

No IP needed ๐Ÿ‘.


๐Ÿ’พ Volumes in Docker Compose

Used to persist data.

services:
  db:
    image: mysql
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:
services:
  db:
    image: mysql
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Now:


๐Ÿ” Environment Variables

You can define env variables directly:

environment:
  APP_ENV: production
environment:
  APP_ENV: production

Or use .env file (cleaner way):

MYSQL_ROOT_PASSWORD=root
MYSQL_ROOT_PASSWORD=root

Compose automatically loads it.


๐Ÿงฑ Build Image Using Compose

Instead of using prebuilt images:

web:
  build: .
  ports:
    - "3000:3000"
web:
  build: .
  ports:
    - "3000:3000"

Then run:

docker compose up --build
docker compose up --build

๐Ÿ‘‰ Great for local development.


โฑ๏ธ depends_on (Startup Order)

web:
  depends_on:
    - db
web:
  depends_on:
    - db

This ensures:

๐Ÿ“Œ Note: It doesn’t wait for DB to be ready, only started.


๐Ÿงน Cleaning Up

Stop and remove containers:

docker compose down
docker compose down

Remove volumes also:

docker compose down -v
docker compose down -v

๐Ÿ†š Docker Compose vs Docker Swarm

Feature Docker Compose Docker Swarm
Purpose Local / simple setups Production clustering
Scaling Manual Automatic
Nodes Single host Multiple hosts
Complexity Simple ๐Ÿ˜Š Medium

๐Ÿ‘‰ Compose = local orchestration
๐Ÿ‘‰ Swarm = cluster orchestration


โœ… When to Use Docker Compose?

Use Docker Compose when: