mcpField
D
docker-compose

docker-compose

github.com/claude-dev-suiteクラウド・DevOps4644 回インストール3 日前に更新
リポジトリ

docker-compose について

Docker Compose で複数サービスのアプリケーションを定義、運用するためのクイックリファレンスです。開発者向けに設定例、コマンド、問題解決、プロダクション準備の指針をまとめています。

主な機能

  1. 01複数サービスの Compose 例
  2. 02起動・停止コマンド
  3. 03開発用オーバーライド
  4. 04環境ファイルの設定
  5. 05本番環境のセキュリティとヘルスチェック
  6. 06ネットワークと問題解決

活用シーン

  1. 01アプリケーションと依存サービスの起動
  2. 02開発用と本番用の設定分離
  3. 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 ファイルをテスト
  • 本番用オーバーライドファイル

参考ドキュメント

コメント