docker-compose について
Docker Compose で複数サービスのアプリケーションを定義、運用するためのクイックリファレンスです。開発者向けに設定例、コマンド、問題解決、プロダクション準備の指針をまとめています。
主な機能
- 01複数サービスの Compose 例
- 02起動・停止コマンド
- 03開発用オーバーライド
- 04環境ファイルの設定
- 05本番環境のセキュリティとヘルスチェック
- 06ネットワークと問題解決
活用シーン
- 01アプリケーションと依存サービスの起動
- 02開発用と本番用の設定分離
- 03サービス、ネットワーク、ボリュームの問題調査
MCP 対応
包括的な Docker Compose ドキュメントの取得に `mcp__documentation__fetch_docs` を参照します。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill docker-composeインストール後、Claude Code で/docker-composeを入力して読み込まれたか確認します。
同梱ファイルquick-ref/commands.mdquick-ref/services.md
詳細
Docker Compose のコア知識
深い知識:包括的なドキュメントについては、テクノロジーに
docker-composeを指定してmcp__documentation__fetch_docsを使用してください。
フルスタックの例
# docker-compose.yml
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
volumes:
- ./src:/app/src # Dev hot reload
networks:
- app-network
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
interval: 5s
timeout: 5s
retries: 5
networks:
- app-network
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
networks:
- app-network
volumes:
postgres_data:
redis_data:
networks:
app-network:
driver: bridge
よく使うコマンド
# Start services
docker-compose up -d
docker-compose up --build # Rebuild images
# Stop
docker-compose down
docker-compose down -v # Remove volumes too
# Logs
docker-compose logs -f app
docker-compose logs --tail=100 app
# Execute
docker-compose exec app sh
docker-compose exec db psql -U user mydb
# Scale
docker-compose up -d --scale app=3
開発用のオーバーライド
# docker-compose.override.yml (auto-loaded)
services:
app:
build:
target: development
volumes:
- .:/app
- /app/node_modules
command: npm run dev
環境ファイル
services:
app:
env_file:
- .env
- .env.local
このスキルを使用しない場合
次の場合は、このスキルを使用しないでください:
- 単一コンテナーの Dockerfile を作成する場合 —
dockerスキルを使用してください - Kubernetes の本番クラスターにデプロイする場合 —
kubernetesスキルを使用してください - CI/CD ワークフローを設定する場合 —
github-actionsスキルを使用してください - Docker Swarm(非推奨)を使用する場合 —
kubernetesスキルを使用してください - Docker イメージのビルドのみを行う場合(オーケストレーションが不要な場合)—
dockerスキルを使用してください
アンチパターン
| アンチパターン | 問題 | 解決策 |
|---|---|---|
| compose ファイルでポートをハードコードする | ポートの競合、柔軟性の欠如 | 環境変数を使って ${PORT:-3000}:3000 を使用する |
| ヘルスチェックがない | サービスの準備ができる前に起動する | healthcheck と depends_on.condition を追加する |
| すべてのポートをパブリックに公開する | セキュリティリスク | ローカルのみの場合は 127.0.0.1:port にバインドする |
latest タグを使用する | 動作が予測できない | postgres:16-alpine のように特定のバージョンを固定する |
| compose ファイルにシークレットを保存する | シークレットが漏えいする | Docker secrets または環境ファイル(gitignore 対象)を使用する |
| リソース制限がない | リソースの枯渇 | deploy.resources.limits を設定する |
| 開発用と本番用の設定を混在させる | 設定の乖離 | docker-compose.override.yml と .prod.yml を使用する |
| 名前付きボリュームを使用しない | 再作成時にデータが失われる | 永続化には名前付きボリュームを使用する |
| サービスがデフォルトネットワーク上にある | 分離されていない | 階層ごとにカスタムネットワークを作成する |
| root として実行する | セキュリティ上の脆弱性 | user: "1000:1000" を設定するか、Dockerfile の USER を使用する |
トラブルシューティング早見表
| 問題 | 原因の特定 | 修正方法 |
|---|---|---|
| サービスが起動しない | 依存先の準備ができていない | condition: service_healthy を指定して depends_on を追加する |
| ポートがすでに使用されている | 別のサービスがそのポートを使用している | ポートマッピングを変更するか、競合するサービスを停止する |
| データベースへの接続が拒否される | サービス名が誤っている、ネットワークの問題 | ホストには localhost ではなく、db:5432 のようにサービス名を使用する |
| 変更が反映されない | 古いコンテナーが実行中 | docker-compose down && docker-compose up --build を実行する |
| ボリュームのデータが永続化されない | 匿名ボリュームを使用している | トップレベルの volumes: に名前付きボリュームを指定する |
| 「network not found」 | ネットワークが削除された、または名前が誤っている | docker-compose up を実行してネットワークを再作成する |
| サービス間で接続できない | ネットワークが異なる | サービスを同じネットワークに配置する |
| 環境変数が機能しない | 構文が誤っている、読み込まれていない | ${VAR:-default} を使用し、.env ファイルを確認する |
| 「service unhealthy」 | ヘルスチェックが失敗している | docker-compose logs を確認し、ヘルスエンドポイントを修正する |
| Mac/Windows で起動が遅い | ボリュームマウントのオーバーヘッド | 依存関係にはバインドマウントではなく、名前付きボリュームを使用する |
本番環境への準備
セキュリティ設定
# docker-compose.prod.yml
services:
app:
image: myapp:${VERSION:-latest}
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
user: "1000:1000"
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '0.5'
memory: 512M
db:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
volumes:
- postgres_data:/var/lib/postgresql/data:Z
secrets:
db_password:
file: ./secrets/db_password.txt
ヘルスチェック
services:
app:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
db:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $POSTGRES_USER -d $POSTGRES_DB"]
interval: 10s
timeout: 5s
retries: 5
redis:
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
ネットワーキング
services:
app:
networks:
- frontend
- backend
ports:
- "127.0.0.1:3000:3000" # Only localhost
db:
networks:
- backend
# No ports exposed externally
nginx:
networks:
- frontend
ports:
- "80:80"
- "443:443"
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # No internet access
ロギング
services:
app:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
labels: "service,environment"
labels:
- "service=app"
- "environment=production"
# Or use external logging
app:
logging:
driver: fluentd
options:
fluentd-address: localhost:24224
tag: "docker.{{.Name}}"
再起動ポリシー
services:
app:
restart: unless-stopped
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
db:
restart: always
バックアップ戦略
services:
backup:
image: postgres:16-alpine
entrypoint: /bin/sh
command: -c "pg_dump -h db -U $$POSTGRES_USER $$POSTGRES_DB | gzip > /backups/backup_$$(date +%Y%m%d_%H%M%S).sql.gz"
environment:
PGPASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
volumes:
- ./backups:/backups
depends_on:
db:
condition: service_healthy
profiles:
- backup
テスト
# docker-compose.test.yml
services:
test:
build:
context: .
target: test
environment:
- DATABASE_URL=postgresql://test:test@db-test:5432/testdb
depends_on:
db-test:
condition: service_healthy
command: npm test
db-test:
image: postgres:16-alpine
environment:
POSTGRES_USER: test
POSTGRES_PASSWORD: test
POSTGRES_DB: testdb
tmpfs:
- /var/lib/postgresql/data # In-memory for speed
# Run tests
docker-compose -f docker-compose.test.yml up --abort-on-container-exit --exit-code-from test
監視メトリクス
| メトリクス | 目標 |
|---|---|
| コンテナーの稼働時間 | > 99.9% |
| ヘルスチェックの成功率 | 100% |
| 再起動回数 | < 1/日 |
| メモリ使用量 | < 上限の 80% |
チェックリスト
- セキュリティオプション(no-new-privileges、read_only)
- リソース制限(CPU、メモリ)
- すべてのサービスにヘルスチェックを設定
- データベース用の内部ネットワーク
- シークレット管理(環境変数を使わない)
- ローテーション付きロギング
- 再起動ポリシーを設定
- バックアップ戦略を定義
- compose ファイルをテスト
- 本番用オーバーライドファイル
参考ドキュメント
コメント
Markdown 対応