Docker Compose とは:開発環境構築の救世主
現代のWebアプリケーション開発において、複数のサービスを連携させる必要性は日々増加しています。例えば、典型的なWebアプリケーションでは、Webサーバー、アプリケーションサーバー、データベース、キャッシュサーバーなど、複数のコンポーネントが協調して動作する必要があります。Docker Composeは、このような複雑な開発環境の構築と管理を劇的に簡略化するツールです。
複数コンテナ管理の課題を解決するツール
従来のDocker単体での開発環境構築では、以下のような課題が存在していました:
- 複数のコンテナを個別に起動・管理する必要がある
- コンテナ間のネットワーク設定を手動で行う必要がある
- 環境変数や設定の管理が煩雑になりやすい
- チーム間での環境の共有と再現が困難
Docker Composeは、これらの課題を一つのYAML形式の設定ファイルで解決します。docker-compose.yaml
という単一のファイルに、必要なサービス、ネットワーク、ボリューム、環境変数などの設定をまとめて記述することで、複数のコンテナを一元管理できるようになります。
docker-compose.yamlが環境構築を劇的に簡略化する理由
Docker Composeが開発環境構築を劇的に簡略化できる理由は、以下の特徴にあります:
- 宣言的な設定管理
- インフラストラクチャをコードとして管理(Infrastructure as Code)
- 環境の再現性が高く、バージョン管理が容易
- チーム間での共有が簡単
- シンプルなコマンド体系
docker-compose up
で全環境を起動docker-compose down
で全環境を停止・削除- 開発者の作業効率が大幅に向上
- 柔軟な環境変数管理
.env
ファイルによる環境変数の一括管理- 開発環境と本番環境の切り替えが容易
- 機密情報の安全な管理が可能
- 自動的な依存関係解決
- サービス間の起動順序を制御可能
- ヘルスチェックによる起動完了の確認
- 複雑なマイクロサービス環境でも安定した起動を実現
例えば、以下のような簡単な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
主要な設定オプション:
- image / build
- 既存のイメージを使用する場合は
image
- カスタムビルドする場合は
build
- どちらか一方、または両方を指定可能
- ports
- ホストとコンテナのポートマッピング
- 短縮記法: “80:80”
- 詳細記法: “`yaml ports:
- target: 80
published: 8080
protocol: tcp
“`
- target: 80
- 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
ネットワーク設定のポイント:
- ネットワークの種類
- bridge: 同一ホスト内のコンテナ間通信(デフォルト)
- host: ホストのネットワークを直接使用
- overlay: Swarmモードでのコンテナ間通信
- none: ネットワーク無効
- ネットワークオプション
internal: true
: 外部ネットワークとの隔離enable_ipv6: true
: IPv6サポートattachable: true
: 外部コンテナからの接続許可
ボリューム設定のポイント:
- 名前付きボリューム
- データの永続化
- コンテナ間でのデータ共有
- バックアップの容易さ
- バインドマウント
- ホストのファイルシステムを直接マウント
- 開発時のソースコード同期に有用
- パフォーマンスへの影響を考慮
これらの基本構文を理解することで、必要に応じて設定をカスタマイズし、最適な開発環境を構築することができます。次のセクションでは、これらの知識を活用した実践的なテンプレート集を紹介します。
実践で使える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}
環境変数管理のベストプラクティス:
- 複数の環境ファイルの使用
# 開発環境用 docker-compose --env-file .env.development up # ステージング環境用 docker-compose --env-file .env.staging up # 本番環境用 docker-compose --env-file .env.production up
- 機密情報の安全な管理
.env
ファイルはバージョン管理から除外- プロジェクトには
.env.example
のみをコミット - 本番環境の値は安全な方法で管理者間で共有
- 変数の展開と条件分岐
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の高度な使用方法:
- ヘルスチェックの実装
- 各サービスの起動状態を確実に検証
- 適切なタイミングでの依存サービスへの接続
- エラー時の自動リカバリー
- 起動順序の制御
services: db: image: mysql:8.0 cache: image: redis:alpine depends_on: - db app: build: . depends_on: - db - cache
- 条件付き起動の設定
services: app: depends_on: db: condition: service_healthy restart: true
実践的なヒント:
- リソース制限の設定
services: app: deploy: resources: limits: cpus: '0.50' memory: 512M reservations: cpus: '0.25' memory: 256M
- ロギングの設定
services: app: logging: driver: "json-file" options: max-size: "10m" max-file: "3"
- ネットワークセグメンテーション
services: frontend: networks: - frontend-network backend: networks: - frontend-network - backend-network db: networks: - backend-network networks: frontend-network: backend-network: internal: true
これらの実践的なヒントを適切に組み合わせることで、より安定した運用環境を構築することができます。次のセクションでは、実際の運用で遭遇する可能性のあるトラブルシューティングとデバッグ手法について解説します。
トラブルシューティングとデバッグ手法
Docker Compose環境で発生する一般的な問題とその解決方法、効率的なデバッグ手法について解説します。
よくあるエラーとその解決方法
- コンテナ起動時のエラー
# エラーメッセージ例 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
- ネットワーク関連のエラー
# エラーメッセージ例 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 # 内部サービスは内部ネットワークのみに接続
- ボリューム関連のエラー
# エラーメッセージ例 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 # プロジェクト固有の名前を付ける
ログ確認とデバッグの効率的な取り組み
- ログの確認方法
基本的なログ確認:
# 全てのサービスのログを表示 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"
- デバッグモードの活用
デバッグ用の設定例:
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デバッグポート
- コンテナ内部の調査
# コンテナ内でシェルを実行 docker-compose exec app sh # 特定のコマンドを実行 docker-compose exec db mysql -u root -p # プロセス一覧の確認 docker-compose top
パフォーマンス最適化のベストプラクティス
- リソース使用量の監視
# コンテナのリソース使用状況を確認 docker stats # 特定のサービスの詳細な状態を確認 docker-compose ps docker inspect <container_id>
- パフォーマンス設定の最適化
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:
- 一般的なパフォーマンス問題の解決策
ネットワークパフォーマンスの改善:
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での性能改善
デバッグのためのチェックリスト:
- 起動時の確認事項
- コンテナのステータス確認
- ネットワーク接続の確認
- ボリュームのマウント状態確認
- 環境変数の設定確認
- 実行時の確認事項
- リソース使用状況のモニタリング
- ログの監視
- アプリケーションの応答時間確認
- エラーメッセージの分析
- トラブル発生時の対応手順
- エラーログの収集
- コンテナの再起動
- 設定ファイルの検証
- 依存関係の確認
これらのトラブルシューティングとデバッグ手法を理解することで、Docker Compose環境で発生する問題に効率的に対応できます。次のセクションでは、Docker Compose活用のベストプラクティスについて解説します。
Docker Compose 活用のベストプラクティス
長期的な運用を見据えた Docker Compose の効果的な活用方法と、チーム開発における実践的なベストプラクティスを紹介します。
保守性を高めるファイル分割の手法
大規模なプロジェクトでは、Docker Compose ファイルを適切に分割することで、保守性と再利用性を向上させることができます。
- 環境別の設定ファイル分割
基本構成ファイル(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
- 機能別のファイル分割
モニタリング設定(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"]
セキュリティを考慮した設定のポイント
- 最小権限の原則に基づく設定
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
- ネットワークセキュリティの強化
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"
- セキュアな環境変数管理
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ツールと連携で実現する自動化
- 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
- 継続的デプロイメントの設定
# 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
実践的なベストプラクティスのまとめ:
- プロジェクト構成のベストプラクティス
- 環境別の設定ファイル分割
- 機能別のモジュール化
- 再利用可能なコンポーネント設計
- 運用面でのベストプラクティス
- 自動化されたビルドとテスト
- 継続的なセキュリティ監査
- 効率的なリソース管理
- チーム開発でのベストプラクティス
- 明確なドキュメント化
- バージョン管理の徹底
- コードレビューの促進
これらのベストプラクティスを適切に組み合わせることで、効率的で安全なDocker Compose環境を構築・運用することができます。また、チーム全体での開発効率も向上させることができます。