Docker Compose チートシート


# Docker Compose チートシート

## 基本構成

### `version`
Composeファイルのフォーマットバージョンを指定します。最新の機能を使用するには高いバージョンが必要です。
```yaml
version: "3.8"  # Docker Composeバージョンの指定
```

### `services`
すべてのコンテナ化されたアプリケーション（サービス）を定義するメインセクション。各サービスは独立したコンテナとして動作します。

```yaml
services:
  # アプリケーションコンテナ（例：Node.jsアプリケーション）
  app:
    image: node:14  # 使用するDockerイメージ
    ports:
      - "3000:3000"  # ホストとコンテナ間のポートフォワーディング
  # データベースコンテナ（例：PostgreSQL）
  db:
    image: postgres:13  # 使用するPostgreSQLイメージ
    ports:
      - "5432:5432"  # デフォルトでPostgreSQLが使用するポート
```

## 詳細設定

### `build`
Dockerfileを使用してローカルでイメージをビルドします。サービスをビルドする際に使います。
```yaml
services:
  web:
    build: ./path_to_dockerfile  # Dockerfileのパス
```

### `image`
Docker Hubまたはローカルから指定のDockerイメージを使います。
```yaml
services:
  web:
    image: nginx:latest  # 最新のNginxイメージを使用
```

### `ports`
ホストのポートとコンテナのポートをマッピングします。外部アクセスを許可する際に使用されます。
```yaml
services:
  web:
    ports:
      - "8080:80"  # ホストの8080ポートをコンテナの80ポートにマッピング
```

### `volumes`
ホストとコンテナ間でデータを共有したり永続化するために使用します。
```yaml
services:
  web:
    volumes:
      - ./app:/usr/src/app  # ホストのディレクトリをコンテナ内にマウント
```

### `environment`
サービスに必要な環境変数を指定します。機密情報や設定値を渡すために利用されます。
```yaml
services:
  db:
    environment:
      POSTGRES_USER: user  # PostgreSQLのユーザー名
      POSTGRES_PASSWORD: password  # PostgreSQLのパスワード
```

### `depends_on`
サービスが他のサービスに依存している場合に指定します。依存関係にあるサービスが先に起動されます。
```yaml
services:
  web:
    depends_on:
      - db  # webはdbサービスが先に起動されるのを待つ
```

### `networks`
サービス間の通信を分離するためのネットワークを定義します。サービス間のセキュリティや接続を管理します。
```yaml
services:
  web:
    networks:
      - frontend  # webはfrontendネットワークに接続
  db:
    networks:
      - backend  # dbはbackendネットワークに接続

networks:
  frontend:  # frontendネットワークの定義
  backend:  # backendネットワークの定義
```

### `command`
コンテナの起動時に実行するデフォルトコマンドを上書きします。例えばスクリプトの実行を変更できます。
```yaml
services:
  web:
    command: ["npm", "start"]  # npm startでアプリケーションを起動
```

### `restart`
再起動ポリシーを指定します。サービスが異常終了した場合に自動再起動できます。
```yaml
services:
  web:
    restart: always  # コンテナが終了した際に常に再起動
```

### `healthcheck`
コンテナの正常性をチェックするための設定です。チェックが失敗した場合は再起動のトリガーになります。
```yaml
services:
  web:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]  # ヘルスチェックのコマンド
      interval: 1m30s  # チェックの間隔
      timeout: 10s  # チェックのタイムアウト時間
      retries: 3  # 再試行回数
```

### `volumes`（共有ボリュームの定義）
複数のサービスで使用する永続化ボリュームを定義します。例えばデータベースのデータを保持する場合に便利です。
```yaml
volumes:
  db_data:
    driver: local  # デフォルトのローカルドライバーを使用してボリュームを作成
```

---

## 最終例

以下の例では、Webアプリケーション、Redis、PostgreSQLデータベースを含む`docker-compose.yml`の設定を示しています。ボリュームと依存関係、ヘルスチェック、ポートのマッピングが含まれています。

```yaml
version: "3.8"  # Docker Composeのバージョン指定

services:
  web:
    build: .  # 現在のディレクトリ内のDockerfileをビルド
    ports:
      - "5000:5000"  # ホストの5000ポートをコンテナの5000ポートにマッピング
    volumes:
      - .:/code  # 現在のディレクトリをコンテナ内の/codeディレクトリにマウント
    depends_on:
      - redis  # Redisが起動するまでwebコンテナは待機

  redis:
    image: "redis:alpine"  # 軽量なRedisイメージを使用

  db:
    image: "postgres:13"  # PostgreSQLデータベース
    environment:
      POSTGRES_USER: user  # データベースユーザー名
      POSTGRES_PASSWORD: password  # データベースパスワード
    volumes:
      - db_data:/var/lib/postgresql/data  # データベースの永続化ボリュームをマウント

volumes:
  db_data:
    driver: local  # ローカルストレージを使った永続化ボリューム
```

---

この詳細なチートシートは、`docker-compose.yml`の基本的な構造から高度な設定までを網羅しています。これを活用して、複雑なマルチコンテナ環境の管理が簡単にできるようになるはずです。