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にコミットしない)