docker-compose.ymlについて一緒に学ぼう

Kyonと申します。

現在、ECサイトを管理している会社で業務しています。使用言語はPHP・Laravelです。　
経歴を話すと、元々は高専の建築学科を卒業後、インフラ系企業で2D設計や構造計算・現場監督、その後、自動車企業で走行テスト・2D・3D設計に従事しており、今までITはほぼ未経験です。

ずっとvibe cording（AIプログラミング）できてしまい、中身をしっかりと読み込む機会がありませんでした。そのため、CursorでECサイトの構築を行いながら、構成ファイルの分析も行っています。
この記事はGPTも使用していますが、しっかりと内容を確認し、学びがある記事にするように心がけています。
一緒に勉強していけば、ECサイトの全体像が見えてくると思うので、よければ頑張りましょう。

---

## 2025/05/19 追記

### Compose ファイル名の最新推奨

* **推奨:** `compose.yaml`
* **仕様に含まれる:** `compose.yml`
* **後方互換:** `docker-compose.yaml`, `docker-compose.yml`

> **ポイント**: `docker compose` (v2+) コマンドを使う場合は `compose.yaml` を置けば自動検出してくれます。

### `version` トップレベル要素は廃止

Compose Spec ではトップレベルの `version` キーは **obsolete (廃止)** となりました。

**✔️ 推奨される冒頭例**

```yaml
services:
  # ここに各サービスを記述
```

**❌ 旧来の例**

```yaml
version: '3.8'  # ← もう不要
services:
  # ...
```

> 既存の環境で `docker-compose` (v1) を使っている場合はまだ動きますが、今後は `docker compose` (v2) へ移行し、`version` 行を削除することを推奨します。

---

以下の記事本文は、学習用に**旧来の記述を残したまま**解説していますが、実運用では上記追記を踏まえてファイル名と `version` 行を調整してください。

---

## Dockerとは？

Dockerとは、アプリを「コンテナ」と呼ばれる**箱**に入れて動かす仕組みです。

* **従来の方法**　
  プログラムを動かすには、自分のパソコンに色々なソフトウェア（PHPやMySQLなど）を入れます。　
  → 環境構築が複雑で、エラーが起きやすい。

* **Dockerを使うと？**　
  コンテナという「箱」の中に必要なソフトウェアや設定をまとめて入れ、それごと動かします。　
  → 簡単に環境構築ができ、エラーが起きにくい。

例えると：

* **従来**　
  自炊するためにキッチンを一から準備する。
* **Docker**　
  「レンジでチンすればOKな弁当」を買ってくるイメージ。

---

## コンテナとは？

コンテナとは「プログラムを動かすために必要な環境をまるごと閉じ込めた箱」です。

具体例：

* PHPが動く箱（コンテナ）
* MySQLが動く箱（コンテナ）

Dockerを使うことで、これらの箱を自由に組み合わせたり、簡単に作ったり壊したりできます。

---

## Dockerのメリット

* **どんな環境でも同じ動作**（自分のパソコンでも、本番サーバーでも）
* **環境構築が簡単**（コマンド一つで完了）
* **環境の管理が楽**（複数のアプリを別々の箱で動かせる）

---

## Docker関連の用語整理（簡単版）

| 用語             | 意味                         |
| -------------- | -------------------------- |
| イメージ           | コンテナを作るための「設計図」。レシピのようなもの。 |
| コンテナ           | 実際に動いている箱（イメージをもとに作られる）    |
| Dockerfile     | イメージを作るための手順書（レシピそのもの）     |
| Docker Compose | 複数のコンテナを一度に管理できるツール        |

---

## docker-compose.ymlについて

複数のDockerコンテナをまとめて起動・管理するために使用されます。　
今回はLaravel（PHPフレームワーク）を使ったECサイトを構築するために、以下の3つのコンテナを使っています。

* **appコンテナ (PHP/Laravelアプリ本体)**
* **webコンテナ (Nginxサーバー)**
* **dbコンテナ (MySQLデータベース)**

それぞれの役割を整理すると：

| コンテナ名 | 役割                       |
| ----- | ------------------------ |
| app   | Laravelアプリのコード実行 (PHP処理) |
| web   | Webブラウザとの通信 (HTTPサーバー)   |
| db    | データの保存・管理 (MySQLデータベース)  |

---

## ファイルの行ごとの解説

### 最初の行（※2025/05/19追記：現在は省略推奨）

```yaml
# version: '3.8'  # ← 旧来はここでComposeファイルのバージョンを指定していました
```

* 以前は `3.x` 系を指定して新しい書式や機能を使っていましたが、2025年現在は **トップレベル `version` キーは不要** です。
* `docker compose` v2 以降では書かなくても自動判定されるため、**行ごと削除**するのが推奨です。

---

## servicesセクション（実行する各コンテナを定義）

```yaml
services:
```

ここから実際に立ち上げるDockerコンテナを指定します。

---

### appコンテナ (PHPアプリケーション)

```yaml
  app:
```

`app`という名前のコンテナを作成する指定です。Laravelアプリ本体を動かします。

```yaml
    build:
      context: .
      dockerfile: docker/php/Dockerfile
```

* `build`: Dockerfileからイメージをビルド（作成）します。
* `context`: Dockerfileを探す基準となるフォルダを指定します。`.` は現在のフォルダを指します。
* `dockerfile`: 実際のDockerfileがある場所を指定します。（今回は`docker/php/Dockerfile`です）

```yaml
    volumes:
      - ./src:/var/www/html
```

* `volumes`: ローカル（あなたのPC）のフォルダとコンテナ内のフォルダを同期します。
* `./src:/var/www/html`とは、あなたのPCの`src`フォルダが、コンテナ内の`/var/www/html`という場所に繋がります。
* これにより、ローカルでソースコードを編集すると即座に反映されます。

```yaml
    depends_on:
      - db
```

* `depends_on`: appコンテナがdbコンテナに依存しているという意味です。
* dbコンテナを先に起動してからappコンテナを立ち上げます。

```yaml
    networks:
      - laravel-network
```

* `networks`: ネットワークを指定します。コンテナ同士が通信するために同じネットワークに入ります。

---

### webコンテナ（Nginxウェブサーバー）

```yaml
  web:
```

* webサーバー用のコンテナを作ります。Webブラウザからの通信を受け付けます。

```yaml
    image: nginx:alpine
```

* Nginxの軽量版(alpine)イメージをDocker Hubから直接ダウンロードして使います。

```yaml
    ports:
      - "8080:80"
```

* コンテナの80番ポートをあなたのPC（ホスト）の8080番ポートとつなげます。
* ブラウザから`http://localhost:8080`にアクセスすると、このNginxコンテナに接続できます。

```yaml
    volumes:
      - ./src:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
```

* NginxもPHPコードを見る必要があるため、`./src`を共有します。
* Nginxの設定ファイルもローカルから指定します（`default.conf`という設定ファイルを共有）。

```yaml
    depends_on:
      - app
```

* Nginxはappコンテナ（Laravelアプリ）に依存します。Laravelが起動してからNginxを起動します。

```yaml
    networks:
      - laravel-network
```

* 同じネットワークで通信できるように指定しています。

---

### dbコンテナ（MySQLデータベース）

```yaml
  db:
```

* データベース用のコンテナを作ります。

```yaml
    image: mysql:8.0
```

* MySQLバージョン8.0の公式イメージを使います。

```yaml
    environment:
      MYSQL_DATABASE: laravel_ec
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
```

* MySQLの環境変数を設定し、データベース名、ユーザー名、パスワードを指定します。
* LaravelからMySQLに接続する時に必要な情報です。

| 項目                    | 의미                   |
| --------------------- | -------------------- |
| MYSQL\_DATABASE       | 作成するデータベースの名前        |
| MYSQL\_USER           | Laravelから接続するユーザー名   |
| MYSQL\_PASSWORD       | Laravelの接続ユーザーのパスワード |
| MYSQL\_ROOT\_PASSWORD | MySQL管理者(root)のパスワード |

```yaml
    ports:
      - "3306:3306"
```

* コンテナの3306（MySQLデフォルト）ポートをホストの3306ポートにつなげます。
* PCのMySQL管理ツールなどから接続できます。

```yaml
    volumes:
      - mysql-data:/var/lib/mysql
```

* MySQLのデータをDockerが管理する場所（ボリューム）に保存します。
* コンテナを停止・再起動してもデータが消えません。

```yaml
    networks:
      - laravel-network
```

* 他のコンテナと通信するために同じネットワークを使います。

---

## ネットワークの設定

```yaml
networks:
  laravel-network:
    driver: bridge
```

* コンテナ間通信のためのネットワークを定義しています。
* Dockerのデフォルトのネットワーク形式（bridge）を使っています。

---

## ボリュームの設定

```yaml
volumes:
  mysql-data:
```

* MySQLデータベースの保存用のボリュームを定義します。
* Dockerが自動的に場所を作って管理します。

---

## コンテナの起動方法（参考）

```bash
docker compose up -d
```

* Docker Composeで各コンテナをバックグラウンドで起動します。
* ファイルを変更したら再度実行すると、変更内容が適用されます。

停止する場合は：

```bash
docker compose down
```

---

これでLaravelアプリのためのDocker環境構築が完了です。　
後に他のファイルも解説予定です。