docker-composeでLaravel開発環境を構築する ~③MySQLコンテナの作成と接続確認~

# はじめに
業務で`Laravel`の開発環境を`docker-compose`で構築することがありました。
しかし詳しいことは全く知らなかったので、自分で1から作ってみようと思います。

環境は`WEB(nginx)`、`PHP`、`DB(MySQL)`サーバーの構成となります。

今回は目次の6についてです。
1、2に関しては[こちら](https://qiita.com/yun-yzrh/items/2d5b24d9df30624ab6d2)、3、4、5については[こちら](https://qiita.com/yun-yzrh/items/d63b7e67256ed914deb8)をご覧ください。

# 目次
　1. [docker-compose.ymlについて](https://qiita.com/yun-yzrh/items/2d5b24d9df30624ab6d2#docker-composeyml%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6:~:text=%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%BD%9C%E6%88%90-,docker%2Dcompose.yml%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6,-docker%2Dcompose%E3%81%A7)
　2. [必要なディレクトリ、ファイルの準備](https://qiita.com/yun-yzrh/items/2d5b24d9df30624ab6d2#docker-composeyml%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6:~:text=%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B-,%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%BA%96%E5%82%99,-%E3%81%A7%E3%81%AF%E3%80%81%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)
　3. [nginxコンテナの作成](https://qiita.com/yun-yzrh/items/d63b7e67256ed914deb8#:~:text=%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%BD%9C%E6%88%90-,nginx%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%BD%9C%E6%88%90,-%E3%81%9D%E3%82%8C%E3%81%A7%E3%81%AF%E3%80%81nginx)
　4. [PHPコンテナの作成](https://qiita.com/yun-yzrh/items/d63b7e67256ed914deb8#php%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%BD%9C%E6%88%90:~:text=%E3%81%A8%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99%E3%80%82-,PHP%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%BD%9C%E6%88%90,-nginx%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%A8) 
　5. [Laravelプロジェクトの作成](https://qiita.com/yun-yzrh/items/d63b7e67256ed914deb8#laravel%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90:~:text=Container%20web%20%20%20%20%20%20%20%20%20%20%20Started-,Laravel%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90,-Laravel%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92)
　6. [MySQLコンテナの作成](#mysqlコンテナの作成) → 今回はここ
　
# MySQLコンテナの作成
それでは、`MySQL`コンテナの作成をしていきます。
前回作成した`db`ディレクトリ配下にある、`Dockerfile`と`my.conf`に書き込みを行い、それに伴い`docker-compose.yml`にもコンテナについて定義していきます。
```
laravel
└── docker
    ├── docker-compose.yml --> 書き込み
    ├── web
    │   ├── Dockerfile
    │   └── default.conf
    └── php
    │   ├── Dockerfile
    │   ├── php.ini
    └── db
        ├── Dockerfile  　　--> 書き込み
        └── my.conf　　     --> 書き込み
```

### 1. MySqlの設定ファイルmy.confの作成
文字コードの設定を定義します。
```~/laravel/docker/db/my.conf
# 文字コードの指定
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
```
### 2. Dockerfileの作成
コンテナ作成に必要な`Dockerfile`を作成します。
```~/laravel/docker/db/Dockerfile
# ベースイメージの指定
FROM mysql:8.0

# 作成した設定ファイルをmysqlコンテナの設定ファイルにコピー
COPY ./db/my.conf /etc/my.conf
```
### 3. docker-compose.ymlの作成
上で作成したファイルを元に`docker-compose.yml`に`MySQL`コンテナを定義します。
```~/laravel/docker/docker-compose.yml
# docker-composeのバージョン
version: "3" 

# コンテナの定義
services:
  # nginxコンテナ
  web:
    ### 省略 ###
  # PHPコンテナ
  php:
    ### 省略 ###
  # DBコンテナ
  db:
    # コンテナ名
    container_name: "db"
    # コンテナ作成に使用するDockerfileのパス
    build:
      dockerfile: "./db/Dockerfile"
    # ホストとコンテナのポート番号の対応付け
    ports:
      - "3306:3306"
    # 環境変数の指定
    environment:
      - "MYSQL_ROOT_PASSWORD=password"
      - "MYSQL_DATABASE=database"
      - "MYSQL_USER=laravel"
      - "MYSQL_PASSWORD=password"
    # volumeをバインド
    volumes:
      - "./db/data:/var/lib/mysql"
```
以上で`DB`コンテナを起動する準備ができました。
コマンドで起動をして、正常に起動したのを確認します。
```
$ docker compose up -d --build
```
```
[+] Running 4/4
 ⠿ Network docker_default  Created
 ⠿ Container web           Started
 ⠿ Container php           Started
 ⠿ Container db            Started
```
これで`DB`コンテナ作成が完了しました。
では`Laravel`プロジェクトから`Database`に接続できるよう設定してみましょう。

#### 接続確認
先ほど`docker-compose.yml`で指定した環境変数を、`Laravel`プロジェクト内の`env`ファイルにも設定します。
```~/src/.env
# 省略
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=laravel
DB_PASSWORD=password
# 省略
```
設定したら再度コンテナを立ち上げて、`PHP`コンテナでマイグレーションを行います。
```
$ docker compose up -d --build
$ docker compose exec php bash
$ php artisan migrate
```
```
INFO  Preparing database.  

Creating migration table ................................... 129ms DONE

INFO  Running migrations.  

2014_10_12_000000_create_users_table ....................... 145ms DONE
2014_10_12_100000_create_password_reset_tokens_table ....... 161ms DONE
2019_08_19_000000_create_failed_jobs_table ................. 156ms DONE
2019_12_14_000001_create_personal_access_tokens_table ...... 209ms DONE
```
正常に接続ができ、マイグレーションできました。
SQLクライアントからも確認してみましょう。（ここでは`dbeaver`を使って接続してみます。）

① 新しい接続を作成するボタンをクリックします。
② 今回作成した`DB`と同じ`MySQL`を選択します。
③ 次へボタンをクリックします。
![スクリーンショット 2023-04-20 9.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192385/999b273d-e267-8279-587e-3bac08130645.png)
④ `Database`、`ユーザー名`、`パスワード`にそれぞれ`docker-compose.yml`で指定した環境変数（`Laravel`プロジェクト内の`env`ファイルに設定した値）を入力します。
⑤ テスト接続ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192385/922bd214-123e-523b-2705-53a3783a236a.png)

**【補足】**
④の工程で`Server Host`には`localhost`と記載しました。
他の項目と同じように`docker-compose.yml`で指定した環境変数を記載しなかったのは、
[3.docker-compose.ymlの作成](https://qiita.com/yun-yzrh/items/2d3abcf1108b3a241f98#mysql%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%BD%9C%E6%88%90:~:text=etc/my.conf-,3.%20docker%2Dcompose.yml%E3%81%AE%E4%BD%9C%E6%88%90,-%E4%B8%8A%E3%81%A7%E4%BD%9C%E6%88%90)でポートの対応付け（ポートフォワーディング）をしているためです。
```~/laravel/docker/docker-compose.yml
    # ホストとコンテナのポート番号の対応付け
    ports:
      - "3306:3306"
```
このように`docker-compose.yml`に設定することで、ホストのポート番号`3306`に接続するとコンテナのポート番号`3306`に接続されます。
つまりSQLクライアントでホストを`Localhost`、ポートを`3306`で指定すれば、コンテナに接続されるということです。

⑥ 無事に接続できたことが確認できました。OKボタンでダイアログを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192385/6d1ea8ba-c8a4-7a2c-2cc9-dd21915726a8.png)
⑦ テーブルリストにも先ほどマイグレーションしたテーブルが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192385/c17a65ed-659a-e056-762c-cc4da9627144.png)

# まとめ
今回は`MySQL`のコンテナ作成と接続確認を行いました！
これで`docker-compose`で`nginx`、`PHP`、`MySQL`3つのコンテナを作成して、`Laravel`の開発環境を構築することができました。
今回は基本的な設定のみで環境構築を行いました。
まだまだ`docker-compose`でできることはたくさんあると思うので、一つずつ勉強していきたいと思います！

# 参考
https://zenn.dev/naoyuki42/articles/ae215286ba92b2