LaravelとDockerでphp artisan migrate

今回はdocker環境を用いたLaravelで`php artisan migrate`出来たので、自分が詰まった部分とその解決方法について共有していきたいと思います。
# 自分のdocker-compose.ymlと.envファイル
```:.docker-compose.yml
version: "3"

services:
  app:
    ports:
      - "80:80"
    build: ./docker/app
    container_name: laravel_app
    volumes:
      - ./src:/var/www/html

  db:
    image: mysql:5.7
    container_name: laravel_db

    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: laravel_pass
      TZ: "Asia/Tokyo"

    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports:
      - 3306:3306
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:5
    container_name: phpmyadmin

    links:
      - db
    ports:
      - 8080:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
```

```:.env
DB_CONNECTION=mysql
DB_HOST=larvel_db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass
```

# この状態で`php artisan migrate`
そうすると...erorrが帰ってきました。残念。
```:laravel_appコンテナ内
# php artisan migrate

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'192.168.80.4' (using password: YES) (SQL: select * from information_schema.tables where table_schema = laravel_db and table_name = migrations and table_type = 'BASE TABLE')

  at /var/www/html/laravelblog/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673|
```
# 取り組んだ手順
`.env`の`DB=HOST`をcontainer_nameであるlaravel_dbではなく、service名の`db`を指定してあげる。

```:変更後の.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass
```
・ 変更後にコンテナを立ち上げ直す！
```:ターミナル
$ docker-compose down
$ docker-compose up -d
```
・ phpが入っているlaravel_appコンテナ内に入る。
・ laravelのプロジェクト(laravel_blog)に移動してあげれば...
```
$ docker exec -it laravel_app bash

//laravel_appコンテナ内

# cd laravelblog
```

`php artisan make:model`は出来ました！けども
```:laravel_appコンテナ内
# php artisan make:model Article --migration
artisan make:model Article --migration
Model created successfully.
Created Migration: 2022_04_28_005924_create_articles_table
```
肝心な `php artisan　migrate`はまだ通らない。

```
# php artisan migrate

1   PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'192.168.128.4' (using password: YES)")
      /var/www/html/laravelblog/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
```
## 「Laravel環境で使用するユーザーを作成していないという重大なミス！！」　ここ大事。
なぜ出来ないんだ!！と脳内発狂していたのですが、ふと「`.env`や`docker-compose.yml`で設定したユーザー名がMySQLに存在していなくね？」という疑問が浮かびました。

phpmyadminを開き、DB_USERNAMEで使われているlaravel_userとDB_PASSWORDのlaravel_passでホスト名は「%」で新規ユーザーを追加しました。

すると...

```:laravel_appコンテナ内
# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.09 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.05 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.04 seconds)
Migrating: 2022_04_28_005924_create_articles_table
Migrated:  2022_04_28_005924_create_articles_table (0.04 seconds)
```
無事、`php artisan migrate` 出来ました！


`.env`や`docker-compose.yml`で設定したユーザー名をデータベース上に追加しなくちゃいけないというのは盲点でしたが解決できましたね。

今回は手っ取り早くphpmyadminを使いましたが、構築環境にphpmyadminがない場合はMySQLのイメージが入っているlaravel_dbコンテナに入り、そこから更にMySQLにログインして新規ユーザーを追加するやり方もあるみたいです。気になる人はネットで調べてみてください。

## やってみた感想
初心者からするとdockerで構築していくのは中々ハードルが高いですが、解決できてよかったです。
今回の記事はおそらくハマりポイントの一つだと思うので、少しでも参考になれば嬉しいです！

記事とは関係ないですが、laravelとdockerが一緒に組み込まれたlaradockというイメージもあるみたいなので余裕があれば、そちらも確認したいと思いました。

# 参照
https://teratail.com/questions/278562