Docker Compose

Docker Composeとは

Docker Composeは、複数のコンテナを定義・実行するためのツールです。 YAMLファイルでサービスを定義し、一つのコマンドで全てのサービスを起動・停止できます。

Webアプリケーションとデータベースなど、複数のコンテナを連携させる場合に便利です。

docker-compose.ymlの基本構造

version: '3.8'

services:
  # サービス1
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db

  # サービス2
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

サービスの起動・停止

# サービスを起動(フォアグラウンド)
docker compose up

# サービスをバックグラウンドで起動
docker compose up -d

# 特定のサービスのみ起動
docker compose up web

# ビルドしてから起動
docker compose up --build

# サービスを停止(コンテナは削除されない)
docker compose stop

# サービスを停止してコンテナを削除
docker compose down

# サービス停止 + ボリュームも削除
docker compose down -v

up -dでバックグラウンド起動が推奨です

down -vはデータベースのデータも削除されるので注意

サービスの状態確認

# 実行中のサービス一覧
docker compose ps

# 全てのサービス(停止中も含む)
docker compose ps -a

# サービスのログを表示
docker compose logs

# 特定サービスのログ
docker compose logs web

# リアルタイムでログを表示
docker compose logs -f

# 最新100行のログ
docker compose logs --tail=100

サービス内でコマンド実行

# 実行中のサービスでコマンド実行
docker compose exec web bash
docker compose exec db mysql -u root -p

# 新しいコンテナでコマンドを実行
docker compose run web npm install

# 一度だけ実行して終了時に削除
docker compose run --rm web node script.js

イメージのビルド

# Dockerfileからイメージをビルド
docker compose build

# 特定サービスのみビルド
docker compose build web

# キャッシュを使わずにビルド
docker compose build --no-cache

# ビルドしてから起動
docker compose up --build

サービスの再起動・更新

# サービスを再起動
docker compose restart

# 特定サービスのみ再起動
docker compose restart web

# 設定を再読み込みして再起動
docker compose up -d --force-recreate

# 変更されたサービスのみ再作成
docker compose up -d

スケーリング

# サービスのインスタンス数を指定
docker compose up -d --scale web=3

# 複数サービスをスケール
docker compose up -d --scale web=3 --scale worker=2

※ ポートマッピングを使用する場合は、ポート番号の競合に注意が必要です。

その他の便利なコマンド

# 別のComposeファイルを指定
docker compose -f docker-compose.prod.yml up -d

# プロジェクト名を指定
docker compose -p myproject up -d

# サービスの設定を表示
docker compose config

# サービスで実行中のプロセスを表示
docker compose top

# サービスを一時停止/再開
docker compose pause
docker compose unpause

実用例: Web + DB構成

version: '3.8'

services:
  web:
    build: ./web
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - DB_HOST=db
      - DB_USER=root
      - DB_PASSWORD=secret
    volumes:
      - ./web:/app
      - /app/node_modules
    depends_on:
      - db
    command: npm run dev

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: root
      POSTGRES_PASSWORD: secret
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres-data:

起動方法:

# 初回起動(ビルド含む)
docker compose up -d --build

# ログ確認
docker compose logs -f web

# データベースに接続
docker compose exec db psql -U root -d myapp

# 停止と削除
docker compose down

開発時のワークフロー

# 1. サービスを起動
docker compose up -d

# 2. ログを監視
docker compose logs -f

# 3. コードを編集(ボリュームマウントで自動反映)

# 4. 必要に応じてサービスを再起動
docker compose restart web

# 5. コンテナ内でコマンド実行
docker compose exec web npm install new-package

# 6. 作業終了時に停止
docker compose down

トラブルシューティング

# 全てを削除して再構築
docker compose down -v
docker compose up -d --build

# 特定サービスのみ再ビルド
docker compose build --no-cache web
docker compose up -d web

# ネットワークの問題を解決
docker compose down
docker network prune
docker compose up -d