Docker Compose 完全ガイド:実践で使えるyaml設定テンプレート15選

Docker Compose とは:開発環境構築の救世主

現代のWebアプリケーション開発において、複数のサービスを連携させる必要性は日々増加しています。例えば、典型的なWebアプリケーションでは、Webサーバー、アプリケーションサーバー、データベース、キャッシュサーバーなど、複数のコンポーネントが協調して動作する必要があります。Docker Composeは、このような複雑な開発環境の構築と管理を劇的に簡略化するツールです。

複数コンテナ管理の課題を解決するツール

従来のDocker単体での開発環境構築では、以下のような課題が存在していました:

  • 複数のコンテナを個別に起動・管理する必要がある
  • コンテナ間のネットワーク設定を手動で行う必要がある
  • 環境変数や設定の管理が煩雑になりやすい
  • チーム間での環境の共有と再現が困難

Docker Composeは、これらの課題を一つのYAML形式の設定ファイルで解決します。docker-compose.yamlという単一のファイルに、必要なサービス、ネットワーク、ボリューム、環境変数などの設定をまとめて記述することで、複数のコンテナを一元管理できるようになります。

docker-compose.yamlが環境構築を劇的に簡略化する理由

Docker Composeが開発環境構築を劇的に簡略化できる理由は、以下の特徴にあります:

  1. 宣言的な設定管理
  • インフラストラクチャをコードとして管理(Infrastructure as Code)
  • 環境の再現性が高く、バージョン管理が容易
  • チーム間での共有が簡単
  1. シンプルなコマンド体系
  • docker-compose up で全環境を起動
  • docker-compose down で全環境を停止・削除
  • 開発者の作業効率が大幅に向上
  1. 柔軟な環境変数管理
  • .envファイルによる環境変数の一括管理
  • 開発環境と本番環境の切り替えが容易
  • 機密情報の安全な管理が可能
  1. 自動的な依存関係解決
  • サービス間の起動順序を制御可能
  • ヘルスチェックによる起動完了の確認
  • 複雑なマイクロサービス環境でも安定した起動を実現

例えば、以下のような簡単なdocker-compose.yamlの記述だけで、PHPアプリケーションの基本的な開発環境を構築できます:

version: '3.8'
services:
  app:
    build: .
    volumes:
      - .:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: app
      MYSQL_ROOT_PASSWORD: secret

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf

このように、Docker Composeを使用することで、開発者はアプリケーションのコード作成に集中でき、環境構築にかかる時間とエネルギーを大幅に削減することができます。次のセクションでは、このdocker-compose.yamlの基本的な構文について詳しく解説していきます。

docker-compose.yamlの基本構文を理解する

Docker Composeの設定ファイルは、サービス、ネットワーク、ボリュームなどの要素をYAML形式で定義します。適切な構文で記述することで、複雑な開発環境も簡単に構築できます。

バージョン指定で変わる記述方法の違い

Docker Composeのファイル形式には複数のバージョンが存在し、使用するバージョンによって利用可能な機能や記述方法が異なります。

主要なバージョンの特徴:

バージョン主な特徴対応するDocker Engineの最小バージョン
3.8最新の機能をサポート(GPUリソース、構成の拡張性)19.03.0+
3.7ロールバック機能、環境変数の拡張構文18.06.0+
3.3長期サポート版、安定性重視17.06.0+
2.xレガシーサポート(非推奨)1.10.0+

最新のプロジェクトでは、以下のように version: ‘3.8’ を指定することを推奨します:

version: '3.8'
services:
  # サービス定義

サービスブロックで定義するコンテナの設定

サービスブロックは、個々のコンテナの設定を定義する中心的な要素です。

services:
  webapp:
    # コンテナのベースイメージ指定
    image: nginx:alpine
    # カスタムビルド設定
    build: 
      context: ./webapp
      dockerfile: Dockerfile.dev
    # ポート転送設定
    ports:
      - "80:80"
      - "443:443"
    # 環境変数設定
    environment:
      NODE_ENV: development
      API_KEY: ${API_KEY}
    # ボリュームマウント
    volumes:
      - ./src:/usr/share/nginx/html
    # コンテナのリソース制限
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M

主要な設定オプション:

  1. image / build
  • 既存のイメージを使用する場合はimage
  • カスタムビルドする場合はbuild
  • どちらか一方、または両方を指定可能
  1. ports
  • ホストとコンテナのポートマッピング
  • 短縮記法: “80:80”
  • 詳細記法: “`yaml ports:
    • target: 80
      published: 8080
      protocol: tcp
      “`
  1. environment / env_file
  • 直接指定: environment:
  • ファイル指定: env_file: .env

ネットワークとボリュームで実現するコンテナ間連携

コンテナ間の通信とデータ永続化を実現するための設定を解説します。

version: '3.8'
services:
  frontend:
    image: nginx:alpine
    networks:
      - frontend-network
    volumes:
      - static-content:/usr/share/nginx/html

  backend:
    image: php:8.1-fpm
    networks:
      - frontend-network
      - backend-network
    volumes:
      - ./src:/var/www/html
      - vendor-cache:/var/www/vendor

networks:
  frontend-network:
    driver: bridge
  backend-network:
    driver: bridge
    internal: true  # 外部非公開

volumes:
  static-content:
  vendor-cache:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/cache
      o: bind

ネットワーク設定のポイント:

  1. ネットワークの種類
  • bridge: 同一ホスト内のコンテナ間通信(デフォルト)
  • host: ホストのネットワークを直接使用
  • overlay: Swarmモードでのコンテナ間通信
  • none: ネットワーク無効
  1. ネットワークオプション
  • internal: true: 外部ネットワークとの隔離
  • enable_ipv6: true: IPv6サポート
  • attachable: true: 外部コンテナからの接続許可

ボリューム設定のポイント:

  1. 名前付きボリューム
  • データの永続化
  • コンテナ間でのデータ共有
  • バックアップの容易さ
  1. バインドマウント
  • ホストのファイルシステムを直接マウント
  • 開発時のソースコード同期に有用
  • パフォーマンスへの影響を考慮

これらの基本構文を理解することで、必要に応じて設定をカスタマイズし、最適な開発環境を構築することができます。次のセクションでは、これらの知識を活用した実践的なテンプレート集を紹介します。

実践で使えるDocker Compose設定テンプレート集

実際の開発現場ですぐに活用できる、実用的なDocker Compose設定テンプレートを紹介します。各テンプレートには、本番環境での利用を想定した設定やセキュリティ考慮事項も含まれています。

PHP + Nginx + MySQLの開発環境テンプレート

最も一般的なPHP開発環境の構成例です。開発効率と実運用性を両立させた設定となっています。

version: '3.8'
services:
  app:
    build:
      context: ./php
      dockerfile: Dockerfile
    volumes:
      - ./src:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/php.ini
    networks:
      - app-network
    depends_on:
      - db
    environment:
      PHP_IDE_CONFIG: serverName=docker

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./src:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
    networks:
      - app-network
    depends_on:
      - app

  db:
    image: mysql:8.0
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
      - ./mysql/conf.d:/etc/mysql/conf.d
      - ./mysql/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - app-network
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    command: --default-authentication-plugin=mysql_native_password

networks:
  app-network:
    driver: bridge

volumes:
  mysql-data:
    driver: local

このテンプレートのポイント:

  • PHPコンテナとNginxコンテナの分離による最適なリソース管理
  • カスタムPHP設定とNginx設定の外部化
  • MySQLデータの永続化とバックアップ容易性の確保
  • 環境変数による機密情報の管理

WordPressサイト構築のためのテンプレート

WordPress開発環境に最適化された構成です。パフォーマンスとセキュリティを考慮しています。

version: '3.8'
services:
  wordpress:
    image: wordpress:php8.1-fpm-alpine
    volumes:
      - ./wp-content:/var/www/html/wp-content
      - ./php.ini:/usr/local/etc/php/php.ini
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: ${WP_DB_PASSWORD}
      WORDPRESS_TABLE_PREFIX: wp_
    networks:
      - wordpress-network
    depends_on:
      - db

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./wp-content:/var/www/html/wp-content
    networks:
      - wordpress-network
    depends_on:
      - wordpress

  db:
    image: mysql:8.0
    volumes:
      - wordpress-db:/var/lib/mysql
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: ${WP_DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    networks:
      - wordpress-network

  redis:
    image: redis:alpine
    networks:
      - wordpress-network

networks:
  wordpress-network:
    driver: bridge

volumes:
  wordpress-db:

特徴と利点:

  • Redisによるキャッシュ機能の統合
  • wp-contentディレクトリの永続化
  • データベースの自動バックアップ対応
  • 開発環境と本番環境の容易な切り替え

Laravel開発環境のマルチコンテナ設定

Laravel固有の要件に対応した開発環境設定です。

version: '3.8'
services:
  laravel:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    volumes:
      - .:/var/www/html
      - ./storage:/var/www/html/storage
      - vendor:/var/www/html/vendor
    networks:
      - laravel-network
    depends_on:
      - db
      - redis

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - .:/var/www/html
      - ./docker/nginx/conf.d:/etc/nginx/conf.d
    networks:
      - laravel-network
    depends_on:
      - laravel

  db:
    image: mysql:8.0
    volumes:
      - laravel-db:/var/lib/mysql
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    networks:
      - laravel-network

  redis:
    image: redis:alpine
    volumes:
      - redis-data:/data
    networks:
      - laravel-network

  queue:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    command: php artisan queue:work
    volumes:
      - .:/var/www/html
    networks:
      - laravel-network
    depends_on:
      - db
      - redis

networks:
  laravel-network:
    driver: bridge

volumes:
  laravel-db:
  redis-data:
  vendor:

Laravel環境の特徴:

  • Artisanコマンド実行用の専用コンテナ
  • キューワーカーの個別管理
  • Redisセッション管理の統合
  • Composerパッケージの永続化

Redisを含むキャッシュサーバー構成

高パフォーマンスなキャッシュ層の実装例です。

version: '3.8'
services:
  redis-master:
    image: redis:6-alpine
    command: redis-server --requirepass ${REDIS_PASSWORD}
    ports:
      - "6379:6379"
    volumes:
      - redis-master-data:/data
    networks:
      - cache-network

  redis-slave:
    image: redis:6-alpine
    command: redis-server --slaveof redis-master 6379 --requirepass ${REDIS_PASSWORD} --masterauth ${REDIS_PASSWORD}
    depends_on:
      - redis-master
    networks:
      - cache-network

  redis-sentinel:
    build:
      context: ./sentinel
      dockerfile: Dockerfile
    depends_on:
      - redis-master
      - redis-slave
    networks:
      - cache-network

networks:
  cache-network:
    driver: bridge

volumes:
  redis-master-data:

キャッシュ構成のポイント:

  • マスター/スレーブレプリケーション
  • Sentinelによる自動フェイルオーバー
  • パスワード認証によるセキュリティ強化
  • データ永続化オプション

MongoDB + Express.jsのNoSQL開発環境

NoSQLデータベースを使用するNode.js開発環境の例です。

version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - .:/usr/src/app
      - node_modules:/usr/src/app/node_modules
    environment:
      - NODE_ENV=development
      - MONGO_URL=mongodb://mongo:27017/myapp
    networks:
      - mern-network
    depends_on:
      - mongo

  mongo:
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - mongodb-data:/data/db
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js
    environment:
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_ROOT_USER}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD}
    networks:
      - mern-network

  mongo-express:
    image: mongo-express
    ports:
      - "8081:8081"
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=${MONGO_ROOT_USER}
      - ME_CONFIG_MONGODB_ADMINPASSWORD=${MONGO_ROOT_PASSWORD}
      - ME_CONFIG_MONGODB_URL=mongodb://mongo:27017/
    networks:
      - mern-network
    depends_on:
      - mongo

networks:
  mern-network:
    driver: bridge

volumes:
  mongodb-data:
  node_modules:

NoSQL環境の特徴:

  • MongoDB管理ツール(mongo-express)の統合
  • Node.jsモジュールの効率的な管理
  • 初期化スクリプトによるデータベース設定の自動化
  • 開発効率を重視したホットリロード対応

これらのテンプレートは、それぞれの開発ニーズに応じてカスタマイズして使用できます。次のセクションでは、これらの環境をより効果的に運用するための実践的なヒントを紹介します。

Docker Compose の実践的なヒント集

Docker Composeを本番環境で効果的に活用するためのベストプラクティスと実践的なヒントを紹介します。

環境変数の効果的な使用方法

環境変数の適切な管理は、セキュリティと柔軟性の両面で重要です。

# .env.example
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=dbuser
DB_PASSWORD=secret
REDIS_HOST=redis
REDIS_PASSWORD=secret
APP_KEY=base64:your-base64-encoded-key
# docker-compose.yaml
version: '3.8'
services:
  app:
    build: .
    environment:
      - DB_HOST=${DB_HOST}
      - DB_PORT=${DB_PORT}
      - DB_DATABASE=${DB_DATABASE}
      - DB_USERNAME=${DB_USERNAME}
      - DB_PASSWORD=${DB_PASSWORD}
      - REDIS_HOST=${REDIS_HOST}
      - REDIS_PASSWORD=${REDIS_PASSWORD}
      - APP_KEY=${APP_KEY}

環境変数管理のベストプラクティス:

  1. 複数の環境ファイルの使用
   # 開発環境用
   docker-compose --env-file .env.development up

   # ステージング環境用
   docker-compose --env-file .env.staging up

   # 本番環境用
   docker-compose --env-file .env.production up
  1. 機密情報の安全な管理
  • .envファイルはバージョン管理から除外
  • プロジェクトには.env.exampleのみをコミット
  • 本番環境の値は安全な方法で管理者間で共有
  1. 変数の展開と条件分岐
   services:
     app:
       environment:
         - NODE_ENV=${NODE_ENV:-development}
         - PORT=${PORT:-3000}
         - DB_URL=${DB_URL:-mongodb://localhost:27017}

本番環境とステージング環境の切り替え設定

異なる環境に対応するための効果的な設定管理方法を解説します。

# docker-compose.base.yaml
version: '3.8'
services:
  app:
    build: .
    networks:
      - app-network

  db:
    image: mysql:8.0
    networks:
      - app-network

networks:
  app-network:
    driver: bridge
# docker-compose.development.yaml
version: '3.8'
services:
  app:
    volumes:
      - .:/app
    environment:
      - DEBUG=true
    ports:
      - "3000:3000"
      - "9229:9229"  # デバッグポート

  db:
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=development_password

volumes:
  db-data:
# docker-compose.production.yaml
version: '3.8'
services:
  app:
    restart: always
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
    environment:
      - NODE_ENV=production

  db:
    restart: always
    volumes:
      - /data/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}

環境切り替えのコマンド例:

# 開発環境の起動
docker-compose -f docker-compose.base.yaml -f docker-compose.development.yaml up

# 本番環境の起動
docker-compose -f docker-compose.base.yaml -f docker-compose.production.yaml up -d

コンテナ間の依存関係を制御するdepends_on

サービス間の起動順序と依存関係を適切に管理することは、アプリケーションの安定性に重要です。

version: '3.8'
services:
  app:
    build: .
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  db:
    image: mysql:8.0
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

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

depends_onの高度な使用方法:

  1. ヘルスチェックの実装
  • 各サービスの起動状態を確実に検証
  • 適切なタイミングでの依存サービスへの接続
  • エラー時の自動リカバリー
  1. 起動順序の制御
   services:
     db:
       image: mysql:8.0

     cache:
       image: redis:alpine
       depends_on:
         - db

     app:
       build: .
       depends_on:
         - db
         - cache
  1. 条件付き起動の設定
   services:
     app:
       depends_on:
         db:
           condition: service_healthy
           restart: true

実践的なヒント:

  1. リソース制限の設定
   services:
     app:
       deploy:
         resources:
           limits:
             cpus: '0.50'
             memory: 512M
           reservations:
             cpus: '0.25'
             memory: 256M
  1. ロギングの設定
   services:
     app:
       logging:
         driver: "json-file"
         options:
           max-size: "10m"
           max-file: "3"
  1. ネットワークセグメンテーション
   services:
     frontend:
       networks:
         - frontend-network

     backend:
       networks:
         - frontend-network
         - backend-network

     db:
       networks:
         - backend-network

   networks:
     frontend-network:
     backend-network:
       internal: true

これらの実践的なヒントを適切に組み合わせることで、より安定した運用環境を構築することができます。次のセクションでは、実際の運用で遭遇する可能性のあるトラブルシューティングとデバッグ手法について解説します。

トラブルシューティングとデバッグ手法

Docker Compose環境で発生する一般的な問題とその解決方法、効率的なデバッグ手法について解説します。

よくあるエラーとその解決方法

  1. コンテナ起動時のエラー
# エラーメッセージ例
Error response from daemon: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use

解決手順:

# 使用中のポートの確認
sudo lsof -i :3306

# 競合するプロセスの停止
sudo service mysql stop  # ローカルのMySQLが動いている場合

# または全てのコンテナを停止して再起動
docker-compose down
docker-compose up -d
  1. ネットワーク関連のエラー
# エラーメッセージ例
ERROR: Network backend-network declared as internal but is used by a service with public ports

解決方法:

# docker-compose.yaml
networks:
  frontend-network:
    driver: bridge
  backend-network:
    driver: bridge
    internal: true  # 内部ネットワークの正しい設定

services:
  web:
    networks:
      - frontend-network  # 公開ポートを持つサービスは外部ネットワークに接続
  db:
    networks:
      - backend-network  # 内部サービスは内部ネットワークのみに接続
  1. ボリューム関連のエラー
# エラーメッセージ例
ERROR: for db  Cannot create container for service db: create .: volume name is too short

解決方法:

version: '3.8'
services:
  db:
    volumes:
      - mysql_data:/var/lib/mysql  # 明示的なボリューム名の指定

volumes:
  mysql_data:  # トップレベルでボリュームを定義
    name: myproject_mysql_data  # プロジェクト固有の名前を付ける

ログ確認とデバッグの効率的な取り組み

  1. ログの確認方法

基本的なログ確認:

# 全てのサービスのログを表示
docker-compose logs

# 特定のサービスのログを表示
docker-compose logs app

# リアルタイムでログを追跡
docker-compose logs -f

# 最新の100行のみ表示
docker-compose logs --tail=100

高度なログ管理設定:

services:
  app:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        labels: "app_logs"
        env: "production"
  1. デバッグモードの活用

デバッグ用の設定例:

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    environment:
      - DEBUG=true
      - NODE_ENV=development
    volumes:
      - .:/app
      - /app/node_modules
    command: ["npm", "run", "debug"]
    ports:
      - "9229:9229"  # Node.jsデバッグポート
  1. コンテナ内部の調査
# コンテナ内でシェルを実行
docker-compose exec app sh

# 特定のコマンドを実行
docker-compose exec db mysql -u root -p

# プロセス一覧の確認
docker-compose top

パフォーマンス最適化のベストプラクティス

  1. リソース使用量の監視
# コンテナのリソース使用状況を確認
docker stats

# 特定のサービスの詳細な状態を確認
docker-compose ps
docker inspect <container_id>
  1. パフォーマンス設定の最適化
services:
  app:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

    # キャッシュの活用
    volumes:
      - cache:/tmp/cache

  db:
    command: mysqld --performance_schema=OFF
    volumes:
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro

volumes:
  cache:
  1. 一般的なパフォーマンス問題の解決策

ネットワークパフォーマンスの改善:

services:
  app:
    dns:
      - 8.8.8.8
      - 8.8.4.4
    networks:
      app_net:
        ipv4_address: 172.16.238.10

networks:
  app_net:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 1450

ボリュームパフォーマンスの最適化:

services:
  app:
    volumes:
      - type: bind
        source: ./src
        target: /app
        consistency: cached  # MacOSでの性能改善

デバッグのためのチェックリスト:

  1. 起動時の確認事項
  • コンテナのステータス確認
  • ネットワーク接続の確認
  • ボリュームのマウント状態確認
  • 環境変数の設定確認
  1. 実行時の確認事項
  • リソース使用状況のモニタリング
  • ログの監視
  • アプリケーションの応答時間確認
  • エラーメッセージの分析
  1. トラブル発生時の対応手順
  • エラーログの収集
  • コンテナの再起動
  • 設定ファイルの検証
  • 依存関係の確認

これらのトラブルシューティングとデバッグ手法を理解することで、Docker Compose環境で発生する問題に効率的に対応できます。次のセクションでは、Docker Compose活用のベストプラクティスについて解説します。

Docker Compose 活用のベストプラクティス

長期的な運用を見据えた Docker Compose の効果的な活用方法と、チーム開発における実践的なベストプラクティスを紹介します。

保守性を高めるファイル分割の手法

大規模なプロジェクトでは、Docker Compose ファイルを適切に分割することで、保守性と再利用性を向上させることができます。

  1. 環境別の設定ファイル分割

基本構成ファイル(docker-compose.yaml):

version: '3.8'
services:
  app:
    build:
      context: .
      target: development
    volumes:
      - .:/app
    networks:
      - app-network

  db:
    image: mysql:8.0
    networks:
      - app-network

networks:
  app-network:

開発環境用(docker-compose.dev.yaml):

services:
  app:
    environment:
      - NODE_ENV=development
      - DEBUG=true
    ports:
      - "3000:3000"
      - "9229:9229"
    volumes:
      - .:/app
      - /app/node_modules

  db:
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=development
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

本番環境用(docker-compose.prod.yaml):

services:
  app:
    build:
      target: production
    environment:
      - NODE_ENV=production
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
    restart: always

  db:
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
    volumes:
      - /data/mysql:/var/lib/mysql
    restart: always
  1. 機能別のファイル分割

モニタリング設定(docker-compose.monitoring.yaml):

services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    depends_on:
      - prometheus

バックアップ設定(docker-compose.backup.yaml):

services:
  backup:
    image: backup-service
    volumes:
      - db_data:/backup/data:ro
    environment:
      - AWS_ACCESS_KEY_ID=${AWS_KEY}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET}
    command: ["backup", "--destination", "s3://my-bucket/backup"]

セキュリティを考慮した設定のポイント

  1. 最小権限の原則に基づく設定
services:
  app:
    user: node
    security_opt:
      - no-new-privileges:true
    read_only: true
    tmpfs:
      - /tmp
      - /var/run
    environment:
      - NODE_ENV=production
    secrets:
      - db_password
      - api_key

  db:
    user: mysql
    security_opt:
      - no-new-privileges:true
    environment:
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
    secrets:
      - db_root_password

secrets:
  db_password:
    file: ./secrets/db_password.txt
  api_key:
    file: ./secrets/api_key.txt
  db_root_password:
    file: ./secrets/db_root_password.txt
  1. ネットワークセキュリティの強化
services:
  frontend:
    networks:
      - frontend-network
    ports:
      - "443:443"
    security_opt:
      - no-new-privileges:true

  backend:
    networks:
      - frontend-network
      - backend-network
    expose:
      - "8080"

  db:
    networks:
      - backend-network
    expose:
      - "3306"

networks:
  frontend-network:
    driver: bridge
  backend-network:
    driver: bridge
    internal: true
    driver_opts:
      encrypt: "true"
  1. セキュアな環境変数管理
services:
  app:
    env_file:
      - .env.production
    environment:
      - JWT_SECRET_FILE=/run/secrets/jwt_secret
      - API_KEY_FILE=/run/secrets/api_key
    secrets:
      - jwt_secret
      - api_key

secrets:
  jwt_secret:
    external: true
  api_key:
    external: true

CIツールと連携で実現する自動化

  1. GitHub Actionsとの連携例
# .github/workflows/docker-compose.yml
name: Docker Compose CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Build and start services
        run: docker-compose -f docker-compose.yaml -f docker-compose.ci.yaml up -d

      - name: Run tests
        run: docker-compose exec -T app npm run test

      - name: Cleanup
        run: docker-compose down
  1. 継続的デプロイメントの設定
# docker-compose.ci.yaml
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.ci
    environment:
      - CI=true
      - TEST_DATABASE_URL=postgres://test:test@db:5432/testdb
    command: ["npm", "run", "test"]

  db:
    environment:
      - POSTGRES_USER=test
      - POSTGRES_PASSWORD=test
      - POSTGRES_DB=testdb

実践的なベストプラクティスのまとめ:

  1. プロジェクト構成のベストプラクティス
  • 環境別の設定ファイル分割
  • 機能別のモジュール化
  • 再利用可能なコンポーネント設計
  1. 運用面でのベストプラクティス
  • 自動化されたビルドとテスト
  • 継続的なセキュリティ監査
  • 効率的なリソース管理
  1. チーム開発でのベストプラクティス
  • 明確なドキュメント化
  • バージョン管理の徹底
  • コードレビューの促進

これらのベストプラクティスを適切に組み合わせることで、効率的で安全なDocker Compose環境を構築・運用することができます。また、チーム全体での開発効率も向上させることができます。