Docker Compose完全ガイド
Docker Compose完全ガイド
Section titled “Docker Compose完全ガイド”Docker Composeを使用した複数コンテナの管理を、実務で使える実装例とともに詳しく解説します。
1. Docker Composeとは
Section titled “1. Docker Composeとは”Docker Composeの役割
Section titled “Docker Composeの役割”Docker Composeは、複数のコンテナを定義し、管理するためのツールです。YAMLファイルでサービスを定義し、一括で管理できます。
docker-compose.yml ├─ サービス1(アプリケーション) ├─ サービス2(データベース) └─ サービス3(キャッシュ)なぜDocker Composeが必要か
Section titled “なぜDocker Composeが必要か”問題のある構成(Docker Composeなし):
# 問題: 複数のコンテナを手動で管理docker run -d --name db postgres:14docker run -d --name app --link db my-app:latestdocker run -d --name redis redis:alpine
# 問題点:# 1. 起動順序の管理が困難# 2. ネットワーク設定が複雑# 3. 環境変数の管理が困難# 4. 一括操作ができない解決: Docker Composeによる一括管理
# 解決: docker-compose.ymlで一括管理version: '3.8'
services: app: build: . depends_on: - db - redis
db: image: postgres:14
redis: image: redis:alpine
# メリット:# 1. 一括起動(docker-compose up)# 2. 依存関係の自動解決# 3. ネットワークの自動設定# 4. 環境変数の一元管理2. docker-compose.ymlの基本構造
Section titled “2. docker-compose.ymlの基本構造”基本的な構成
Section titled “基本的な構成”version: '3.8'
services: web: build: . ports: - "3000:3000" environment: - NODE_ENV=production volumes: - .:/app depends_on: - db
db: image: postgres:14-alpine environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydb volumes: - postgres_data:/var/lib/postgresql/data
volumes: postgres_data:3. サービスの定義
Section titled “3. サービスの定義”services: app: build: context: . dockerfile: Dockerfile args: - NODE_ENV=productionservices: db: image: postgres:14-alpineservices: app: ports: - "3000:3000" # ホスト:コンテナ - "8080:80" # 複数ポートの公開environment
Section titled “environment”services: app: environment: - NODE_ENV=production - DATABASE_URL=postgresql://postgres:password@db:5432/mydb # または env_file: - .envvolumes
Section titled “volumes”services: app: volumes: - .:/app # バインドマウント - /app/node_modules # 匿名ボリューム - app_data:/data # 名前付きボリュームdepends_on
Section titled “depends_on”services: app: depends_on: - db - redis
db: image: postgres:14-alpine
redis: image: redis:alpine4. ネットワークの設定
Section titled “4. ネットワークの設定”デフォルトネットワーク
Section titled “デフォルトネットワーク”version: '3.8'
services: app: build: .
db: image: postgres:14-alpine
# 自動的に同じネットワークに接続されるカスタムネットワーク
Section titled “カスタムネットワーク”version: '3.8'
services: app: build: . networks: - app-network
db: image: postgres:14-alpine networks: - app-network
networks: app-network: driver: bridge5. ボリュームの設定
Section titled “5. ボリュームの設定”名前付きボリューム
Section titled “名前付きボリューム”services: db: image: postgres:14-alpine volumes: - postgres_data:/var/lib/postgresql/data
volumes: postgres_data:バインドマウント
Section titled “バインドマウント”services: app: build: . volumes: - ./src:/app/src # 開発環境でのホットリロード匿名ボリューム
Section titled “匿名ボリューム”services: app: build: . volumes: - /app/node_modules # node_modulesを上書きしない6. 実務でのベストプラクティス
Section titled “6. 実務でのベストプラクティス”パターン1: フルスタックアプリケーション
Section titled “パターン1: フルスタックアプリケーション”version: '3.8'
services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - "3000:3000" environment: - REACT_APP_API_URL=http://backend:8000 depends_on: - backend
backend: build: context: ./backend dockerfile: Dockerfile ports: - "8000:8000" environment: - DATABASE_URL=postgresql://postgres:password@db:5432/mydb depends_on: - db
db: image: postgres:14-alpine environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydb volumes: - postgres_data:/var/lib/postgresql/data
redis: image: redis:alpine volumes: - redis_data:/data
volumes: postgres_data: redis_data:パターン2: 環境別の設定
Section titled “パターン2: 環境別の設定”version: '3.8'
services: app: build: context: . dockerfile: Dockerfile.dev volumes: - .:/app environment: - NODE_ENV=development - DEBUG=true
# docker-compose.prod.ymlversion: '3.8'
services: app: build: context: . dockerfile: Dockerfile.prod environment: - NODE_ENV=production restart: alwaysパターン3: ヘルスチェック
Section titled “パターン3: ヘルスチェック”services: app: build: . healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s
db: image: postgres:14-alpine healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 57. Docker Composeのコマンド
Section titled “7. Docker Composeのコマンド”基本的なコマンド
Section titled “基本的なコマンド”# サービスの起動docker-compose up -d
# サービスの停止docker-compose down
# サービスの再ビルドdocker-compose up -d --build
# ログの確認docker-compose logs -f
# サービスの状態確認docker-compose ps
# サービスの再起動docker-compose restart高度なコマンド
Section titled “高度なコマンド”# 特定のサービスのみ起動docker-compose up -d app
# サービスのスケールdocker-compose up -d --scale app=3
# サービスの一時停止docker-compose pause
# サービスの再開docker-compose unpause
# サービスの削除(ボリュームも含む)docker-compose down -v8. よくある問題と解決策
Section titled “8. よくある問題と解決策”問題1: サービスが起動しない
Section titled “問題1: サービスが起動しない”原因:
- 依存関係が正しく設定されていない
- ポートが既に使用されている
解決策:
# サービスの状態確認docker-compose ps
# ログの確認docker-compose logs app
# サービスの再ビルドdocker-compose up -d --build問題2: ボリュームが正しくマウントされない
Section titled “問題2: ボリュームが正しくマウントされない”原因:
- パスが正しく設定されていない
- 権限の問題
解決策:
# 絶対パスを使用volumes: - /absolute/path:/app
# 権限の設定user: "1000:1000"これで、Docker Composeの基礎知識と実務での使い方を理解できるようになりました。