AcademyContainment Breach: The Architect's ShipZone 6: Fleet Operations (Compose)

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.
booting...

Mission Objective

Conduct your first orchestra:

  1. Write the score: Create docker-compose.yml with touch docker-compose.yml.
  2. Play! Start everything with docker compose up -d.
  3. Check the ensemble: View all services with docker compose ps.

Mission Control

Create a docker-compose.yml file

Expected Command

touch docker-compose.yml

Start all services

View running services