第2部:Docker入門 Step 7 / 24

Docker Compose

Docker Composeは、複数のコンテナをまとめて管理するツール。YAMLファイル1つで、フロント・バックエンド・DBを一括起動できます。

なぜDocker Composeが必要か

docker runだけの場合

# 毎回これを打つ必要がある...
docker run -d --name mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -p 3306:3306 mysql:8.0

docker run -d --name backend \
  -p 8000:8000 \
  --link mysql my-backend

docker run -d --name frontend \
  -p 3000:3000 \
  --link backend my-frontend

コマンドが長い、順番を覚える必要がある

Docker Composeの場合

# これだけで全部起動!
docker compose up -d

# 停止も簡単
docker compose down

設定はYAMLファイルに書くだけ

compose.yaml の基本構造

# compose.yaml(旧: docker-compose.yml)
services:
  # サービス名(自由につけられる)
  サービス名:
    image: イメージ名        # 使用するイメージ
    build: ./path           # または Dockerfile のパス
    ports:
      - "ホスト:コンテナ"    # ポート転送
    volumes:
      - ./host:/container   # ボリュームマウント
    environment:
      - 環境変数=値          # 環境変数
    depends_on:
      - 依存サービス         # 起動順序の制御

ブログアプリの compose.yaml

完全な設定例

services:
  # MySQL データベース
  db:
    image: mysql:8.0
    container_name: blog-db
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: blog
      MYSQL_USER: bloguser
      MYSQL_PASSWORD: blogpassword
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  # FastAPI バックエンド
  backend:
    build: ./backend
    container_name: blog-backend
    ports:
      - "8000:8000"
    volumes:
      - ./backend:/app
    environment:
      DATABASE_URL: mysql+pymysql://bloguser:blogpassword@db:3306/blog
      SECRET_KEY: your-secret-key
    depends_on:
      db:
        condition: service_healthy
    command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload

  # Next.js フロントエンド
  frontend:
    build: ./frontend
    container_name: blog-frontend
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      NEXT_PUBLIC_API_URL: http://localhost:8000
    depends_on:
      - backend
    command: npm run dev

# 名前付きボリューム
volumes:
  mysql-data:

ポイント:depends_onで起動順序を制御。healthcheckでDBの準備完了を待ってからバックエンドを起動します。

Dockerfile の例

backend/Dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

frontend/Dockerfile

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "run", "dev"]

Docker Compose コマンド

コマンド 説明
docker compose up すべてのサービスを起動
docker compose up -d バックグラウンドで起動
docker compose up --build イメージを再ビルドして起動
docker compose down すべてのサービスを停止・削除
docker compose down -v ボリュームも含めて削除
docker compose ps サービスの状態を確認
docker compose logs すべてのログを表示
docker compose logs -f backend 特定サービスのログを追跡
docker compose exec backend bash コンテナ内でシェル起動
docker compose restart backend 特定サービスを再起動

開発時の使い方

# 1. 初回起動
docker compose up -d

# 2. ログを確認しながら開発
docker compose logs -f

# 3. コードを変更(ホットリロードで反映)
#    volumes でマウントしているので自動反映

# 4. パッケージを追加した場合は再ビルド
docker compose up -d --build backend

# 5. DBに入りたい時
docker compose exec db mysql -ubloguser -pblogpassword blog

# 6. 開発終了
docker compose down

# 7. DBデータも消してリセット
docker compose down -v

環境変数ファイル(.env)

機密情報は.envファイルに分離しましょう。

.env

MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=blog
MYSQL_USER=bloguser
MYSQL_PASSWORD=blogpassword
SECRET_KEY=your-secret-key

compose.yaml

services:
  db:
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}

重要:.envは必ず.gitignoreに追加!Gitにパスワードをコミットしないように。

まとめ

  • Docker Composeで複数コンテナを一括管理
  • compose.yamlに設定を記述
  • docker compose up -dで起動、downで停止
  • 機密情報は.envに分離(Gitにコミットしない)
Docker基本操作 次へ:MySQL入門