Docker

Docker Compose

Docker

複数コンテナのオーケストレーション

docker-compose.yml の基本

services、volumes、networks の定義

docker-compose.yml yaml
services:
  # Webアプリ
  app:
    build:
      context: .
      dockerfile: Dockerfile
      target: production          # マルチステージの対象
    image: myapp:latest
    container_name: myapp
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
      - REDIS_URL=redis://cache:6379
    env_file:
      - .env.local                # ファイルから環境変数を読み込む
    volumes:
      - uploads:/app/uploads      # named volume
      - ./logs:/app/logs          # bind mount
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    networks:
      - backend

  # PostgreSQL
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - backend

  # Redis
  cache:
    image: redis:7-alpine
    restart: unless-stopped
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
    volumes:
      - redisdata:/data
    networks:
      - backend

volumes:
  pgdata:
  redisdata:
  uploads:

networks:
  backend:
    driver: bridge

Compose コマンド

up、down、scale、logs、exec

compose.sh bash
# 起動
docker compose up           # フォアグラウンド
docker compose up -d        # バックグラウンド
docker compose up -d --build  # イメージを再ビルドして起動
docker compose up app db    # 特定サービスだけ起動

# 停止・削除
docker compose stop         # コンテナ停止(削除しない)
docker compose down         # 停止+コンテナ削除
docker compose down -v      # ボリュームも削除(データ消滅注意!)
docker compose down --rmi all # イメージも削除

# ステータス確認
docker compose ps
docker compose top          # 各コンテナのプロセス

# ログ
docker compose logs
docker compose logs -f app  # 特定サービスをフォロー
docker compose logs --tail=50

# コマンド実行
docker compose exec app bash
docker compose exec db psql -U user -d mydb
docker compose run --rm app npm run migrate  # 一時コンテナで実行

# スケール
docker compose up -d --scale app=3  # appを3インスタンス起動

# 設定確認
docker compose config       # 最終的な設定を表示
docker compose config --services  # サービス一覧

# イメージのプル・ビルド
docker compose pull
docker compose build --no-cache

Override と環境別設定

開発・本番を分けた Compose 構成

docker-compose.override.yml yaml
# docker-compose.override.yml は自動的に merge される
# 開発環境用の上書き設定

services:
  app:
    build:
      target: development         # 開発ステージを使用
    volumes:
      - .:/app                    # ソースコードをマウント(ホットリロード)
      - /app/node_modules         # node_modules はコンテナのものを使用
    environment:
      - NODE_ENV=development
      - DEBUG=app:*
    command: npm run dev
    ports:
      - "9229:9229"               # Node.js デバッガーポート

  db:
    ports:
      - "5432:5432"               # 開発時はホストから直接接続可能に

本番用の明示的な指定

deploy.sh bash
# 本番: override を無視して本番設定のみ使用
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

# 開発: デフォルト(override 自動適用)
docker compose up -d

# ステージング
docker compose -f docker-compose.yml -f docker-compose.staging.yml up -d