Docker Compose

DevOpsコンテナDockerマルチコンテナオーケストレーション開発環境YAML

DevOpsツール

Docker Compose

概要

Docker Composeは、マルチコンテナDockerアプリケーションの定義と実行を簡素化するツールです。YAML形式の設定ファイルで複数のサービスを定義し、単一コマンドで起動・管理が可能です。

詳細

Docker Compose(ドッカーコンポーズ)は、複数のDockerコンテナで構成されるアプリケーションを宣言的に定義・管理するオーケストレーションツールです。2014年にFig社が開発したFigプロジェクトをDockerが買収して現在の形に発展。docker-compose.ymlファイルにサービス定義、ネットワーク、ボリューム等を記述し、docker-compose upコマンド一つで複雑なマルチコンテナ環境を構築できます。開発環境やローカルテストでの必須ツールとして広く利用され、Webアプリケーション、データベース、キューシステム、キャッシュ等の連携システムを効率的に管理。v2での大幅改良により、パフォーマンス向上、プロファイル機能による環境別管理、GPU対応、Watch機能等が追加されました。Kubernetesとは異なり、単一ホスト上でのコンテナ管理に特化しており、Docker Swarmとの統合も可能。現在では開発チームの標準ツールとして、ローカル開発環境の構築、CI/CDパイプライン、小規模プロダクション環境での利用が拡大しています。

メリット・デメリット

メリット

  • 簡単な設定: YAML形式の直感的な設定ファイル
  • 単一コマンド実行: 複雑な環境を一つのコマンドで起動
  • 開発環境最適化: ローカル開発での高い生産性
  • 環境再現性: チーム間での一貫した開発環境
  • サービス間連携: 自動ネットワーク設定とサービスディスカバリ
  • プロファイル機能: 環境別設定の管理が容易
  • ホットリロード: Watch機能による開発効率向上
  • リソース管理: CPU・メモリ制限とヘルスチェック対応

デメリット

  • 単一ホスト制限: 複数サーバーでのスケーリング不可
  • 本番環境制約: 高可用性や自動復旧機能なし
  • 限定的オーケストレーション: Kubernetesほどの高度な機能なし
  • 永続化データ: ボリューム管理に注意が必要
  • パフォーマンス: 大規模環境でのスケーラビリティ限界
  • ネットワーク複雑性: 高度なネットワーク設定が困難
  • モニタリング: 本格的な監視・ログ集約には別ツールが必要
  • バージョン管理: サービス間の依存関係とアップデート調整

主要リンク

書き方の例

基本的なWebアプリケーション

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgresql://user:password@db:5432/myapp
    depends_on:
      - db
      - redis
    volumes:
      - .:/app
      - node_modules:/app/node_modules

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

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:
  node_modules:

WordPress + MySQL 環境

# wordpress-compose.yml
version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress_password
      WORDPRESS_DB_NAME: wordpress_db
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      mysql:
        condition: service_healthy

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: wordpress_db
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress_password
      MYSQL_ROOT_PASSWORD: root_password
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  wordpress_data:
  mysql_data:

マイクロサービス構成

# microservices-compose.yml
version: '3.8'

services:
  api-gateway:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - user-service
      - order-service
      - product-service

  user-service:
    build: ./services/user
    environment:
      - DATABASE_URL=postgresql://user:pass@user-db:5432/users
    depends_on:
      - user-db

  order-service:
    build: ./services/order
    environment:
      - DATABASE_URL=postgresql://order:pass@order-db:5432/orders
      - REDIS_URL=redis://redis:6379
    depends_on:
      - order-db
      - redis

  product-service:
    build: ./services/product
    environment:
      - DATABASE_URL=mongodb://product-db:27017/products

  user-db:
    image: postgres:15
    environment:
      POSTGRES_DB: users
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass

  order-db:
    image: postgres:15
    environment:
      POSTGRES_DB: orders
      POSTGRES_USER: order
      POSTGRES_PASSWORD: pass

  product-db:
    image: mongo:6

  redis:
    image: redis:7-alpine

開発環境でのプロファイル使用

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
    volumes:
      - .:/app
    profiles:
      - development

  web-prod:
    build:
      context: .
      target: production
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    profiles:
      - production

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password

  test-runner:
    build: .
    command: npm test
    environment:
      - NODE_ENV=test
    profiles:
      - testing

ヘルスチェックと依存関係管理

# health-check-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3

Docker Compose CLI コマンド

# 基本操作
docker-compose up                    # サービス起動(フォアグラウンド)
docker-compose up -d                 # サービス起動(バックグラウンド)
docker-compose down                  # サービス停止・削除
docker-compose down -v               # ボリュームも削除

# ビルド・更新
docker-compose build                 # イメージビルド
docker-compose up --build            # ビルド後起動
docker-compose pull                  # イメージ更新

# 個別サービス操作
docker-compose up web                # 特定サービスのみ起動
docker-compose restart web           # サービス再起動
docker-compose stop web              # サービス停止

# ログ・監視
docker-compose logs                  # 全サービスログ
docker-compose logs -f web           # 特定サービスログ(フォロー)
docker-compose ps                    # サービス状態確認
docker-compose top                   # プロセス確認

# 実行・デバッグ
docker-compose exec web bash         # サービス内でコマンド実行
docker-compose run --rm web npm test # ワンタイムコマンド実行

# プロファイル使用
docker-compose --profile development up
docker-compose --profile production up -d