Docker Compose
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ほどの高度な機能なし
- 永続化データ: ボリューム管理に注意が必要
- パフォーマンス: 大規模環境でのスケーラビリティ限界
- ネットワーク複雑性: 高度なネットワーク設定が困難
- モニタリング: 本格的な監視・ログ集約には別ツールが必要
- バージョン管理: サービス間の依存関係とアップデート調整
主要リンク
- Docker Compose公式ドキュメント
- Compose ファイルリファレンス
- Docker Compose GitHub リポジトリ
- Compose CLI リファレンス
- Docker Hub (イメージレジストリ)
- Awesome Compose (サンプル集)
書き方の例
基本的な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