mcpField
D
docker-compose

docker-compose

github.com/bagelholeクラウド・DevOps1.2k555 回インストール23 週間前に更新
リポジトリ

docker-compose について

複数コンテナアプリを運用し、再現可能な環境を構築する開発者向けの Docker Compose スキルです。宣言的なサービス設定、スタック操作、ネットワーク、プロファイル、開発ワークフローを説明します。

主な機能

  1. 01複数サービスの宣言型 YAML 設定
  2. 02サービス依存関係とネットワーク
  3. 03ボリューム、ポート、リソース制限
  4. 04プロファイルと Compose ファイルの上書き
  5. 05コンテナのライフサイクルとビルドコマンド
  6. 06開発時の監視とホットリロード

活用シーン

  1. 01ローカルでの複数コンテナアプリ実行
  2. 02開発環境の構築
  3. 03プロファイルによる任意サービスの分離
  4. 04環境別設定の管理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/bagelhole/devops-security-agent-skills --skill docker-compose

インストール後、Claude Code で/docker-composeを入力して読み込まれたか確認します。

同梱ファイルreferences/compose-patterns.md

詳細

Docker Compose

宣言的な YAML 設定で複数コンテナーのアプリケーションをオーケストレーションします。

このスキルを使う場面

次のような場合にこのスキルを使用します。

  • 複数コンテナーのアプリケーションをローカルで実行する
  • 開発環境をセットアップする
  • サービスの依存関係とネットワークを定義する
  • 複数のサービスで構成されるアプリケーションスタックを管理する
  • 再現可能な開発環境を作成する

前提条件

  • Compose プラグイン(v2)を備えた Docker Engine
  • Docker の基本的な知識
  • YAML 構文の理解

基本的な設定

シンプルなアプリケーションスタック
# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgres://postgres:secret@db:5432/myapp
    depends_on:
      - db
      - redis

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres-data:

サービスの設定

ビルドオプション
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.dev
      args:
        NODE_VERSION: "20"
      target: development
      cache_from:
        - myapp:cache
    image: myapp:dev
環境変数
services:
  app:
    environment:
      - NODE_ENV=production
      - API_KEY=${API_KEY}  # From shell or .env file
    env_file:
      - .env
      - .env.local
ポートマッピング
services:
  web:
    ports:
      - "3000:3000"           # HOST:CONTAINER
      - "127.0.0.1:9229:9229" # Bind to localhost only
      - "8080-8090:8080-8090" # Port range
    expose:
      - "3000"                # Internal only (no host binding)
ボリュームのマウント
services:
  app:
    volumes:
      # Named volume
      - app-data:/app/data
      # Bind mount
      - ./src:/app/src
      # Read-only bind mount
      - ./config:/app/config:ro
      # Anonymous volume (for node_modules)
      - /app/node_modules

volumes:
  app-data:
    driver: local
依存関係
services:
  web:
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

  db:
    image: postgres:15
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

ネットワーク

カスタムネットワーク
services:
  frontend:
    networks:
      - frontend-net

  backend:
    networks:
      - frontend-net
      - backend-net

  db:
    networks:
      - backend-net

networks:
  frontend-net:
    driver: bridge
  backend-net:
    driver: bridge
    internal: true  # No external access
ネットワークエイリアス
services:
  db:
    networks:
      backend:
        aliases:
          - database
          - postgres

networks:
  backend:

リソース制限

services:
  app:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 1G
        reservations:
          cpus: '0.5'
          memory: 256M

複数の Compose ファイル

オーバーライドファイル
# docker-compose.yml (base)
services:
  web:
    image: myapp:latest
    ports:
      - "3000:3000"

# docker-compose.override.yml (development - auto-loaded)
services:
  web:
    build: .
    volumes:
      - ./src:/app/src
    environment:
      - DEBUG=true

# docker-compose.prod.yml (production)
services:
  web:
    deploy:
      replicas: 3
    environment:
      - DEBUG=false
複数のファイルを使用する
# Development (uses override automatically)
docker compose up

# Production
docker compose -f docker-compose.yml -f docker-compose.prod.yml up

# Merge and view final config
docker compose -f docker-compose.yml -f docker-compose.prod.yml config

プロファイル

services:
  web:
    image: myapp

  db:
    image: postgres:15

  debug:
    image: busybox
    profiles:
      - debug

  monitoring:
    image: prometheus
    profiles:
      - monitoring
# Run without profiles (web, db only)
docker compose up

# Run with debug profile
docker compose --profile debug up

# Run with multiple profiles
docker compose --profile debug --profile monitoring up

コマンド

ライフサイクル
# Start services
docker compose up -d

# Start specific service
docker compose up -d web

# Stop services
docker compose stop

# Stop and remove containers
docker compose down

# Stop and remove everything including volumes
docker compose down -v --rmi all

# Restart services
docker compose restart web
ビルド
# Build images
docker compose build

# Build without cache
docker compose build --no-cache

# Build and start
docker compose up --build

# Pull latest images
docker compose pull
監視
# View logs
docker compose logs -f

# View specific service logs
docker compose logs -f web

# View running services
docker compose ps

# View resource usage
docker compose top
実行
# Run command in new container
docker compose run --rm web npm test

# Execute in running container
docker compose exec web /bin/sh

# Scale service
docker compose up -d --scale worker=3

開発ワークフロー

ウォッチモード(Compose v2.22+)
services:
  web:
    build: .
    develop:
      watch:
        - action: sync
          path: ./src
          target: /app/src
        - action: rebuild
          path: ./package.json
docker compose watch
ホットリロードの設定
services:
  web:
    build:
      context: .
      target: development
    volumes:
      - ./src:/app/src
      - /app/node_modules
    environment:
      - CHOKIDAR_USEPOLLING=true
    command: npm run dev

よくあるパターン

データベースの初期化
services:
  db:
    image: postgres:15
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init-scripts:/docker-entrypoint-initdb.d:ro
    environment:
      POSTGRES_DB: myapp
リバースプロキシ
services:
  proxy:
    image: traefik:v3.0
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/etc/traefik/traefik.yml:ro

  web:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.web.rule=Host(`app.localhost`)"

よくある問題

問題:コンテナーがサービス名を名前解決できない

問題:サービス名を指定しても、サービスに接続できない
解決策:サービスが同じネットワーク上にあることを確認し、depends_on を確認してください

問題:ボリュームの権限

問題:コンテナーがマウントされたボリュームに書き込めない
解決策:コンテナーのユーザー UID をホストと一致させるか、名前付きボリュームを使用してください

問題:ポートがすでに使用されている

問題:ポートのバインド時にエラーが発生する
解決策:ホスト側のポートを変更するか、競合するサービスを停止してください

問題:変更が反映されない

問題:コードの変更がコンテナーに反映されない
解決策:ボリュームのマウントを確認し、Dockerfile を変更した場合は再ビルドしてください

ベストプラクティス

  • 永続データには名前付きボリュームを使用する
  • データベースの依存関係にはヘルスチェックを定義する
  • プロファイルを使ってオプションのサービスを分ける
  • シークレットは .env ファイルに保存する(コミットしない)
  • 環境ごとの設定にはオーバーライドファイルを使用する
  • 再現性を確保するため、イメージのバージョンを固定する
  • ネットワークを使ってサービスグループを分離する
  • 開発ではウォッチモードを活用する

関連スキル

コメント