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環境を構築・運用することができます。また、チーム全体での開発効率も向上させることができます。