Docker Compose
Docker
複数コンテナのオーケストレーション
docker-compose.yml の基本
services、volumes、networks の定義
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: bridgeCompose コマンド
up、down、scale、logs、exec
# 起動
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-cacheOverride と環境別設定
開発・本番を分けた Compose 構成
# 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" # 開発時はホストから直接接続可能に本番用の明示的な指定
# 本番: 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