php artisan migrate でSQLSTATE[HY000] [2002]のエラーが出る

# はじめに
一度、コンテナなどをdownした後にもう一度upして`migrate`しようとすると、エラーになったので解決した方法をメモします。
いち解決方法なのでご参考になれば幸いです。

# 条件
```bash
mac OS "11.2.3 Big Sur"
Laravel Framework "6.20.27"
PHP "8.0.7"
nginx "1.18"
mysql "8.0"
```

# php artisan migrate ができなくなった

```terminal
❶ docker-compose down
Stopping web_1 ... done
Stopping app_1 ... done
Stopping db_1  ... done
Removing web_1 ... done
Removing app_1 ... done
Removing db_1  ... done
Removing network lantern_default

❷ docker-compose up -d
Creating app_1 ... done
Creating db_1  ... done
Creating web_1 ... done
```
① 一度upした`コンテナ` `ネットワーク` `ボリューム` `イメージ` を削除します。
デフォルトではコンテナとネットワークのみ削除します。

https://docs.docker.jp/compose/reference/down.html#down

② イメージを作成、さらにコンテナを作成・起動する。

https://docs.docker.jp/compose/reference/up.html?highlight=up#up

ここまではちゃんとできているように見えるのですが、appコンテナ内で`migrate`をしようとすると以下のエラー

```terminal
% docker-compose exec app bash

/var/www/html#  php artisan migrate

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = lantern and table_name = migrations and table_type = 'BASE TABLE')

  at /var/www/html/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| 

  Exception trace:

  1   PDOException::("PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known")
      /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=db;port=3306;dbname=lantern", "lantern_user", "lantern_pass", [])
      /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.
```

実際のターミナル画面
![スクリーンショット 2021-08-25 15.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/34163923-91c0-9e08-7bbd-44c4954f394a.png)


以下のエラーは、`DB_HOST`が異なる場合に表示される。

```
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
```
これは、`.env`で設定している`DB_HOST`の値と、`docker-compose.yml`の`services`で設定しているDBの名前が一致していないと起こることもある。

```:.env
DB_HOST=db
```

```yml:docker-compose.yml
services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile

    ( 省略 )

  web:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile

    ( 省略 )

  db:  # servicesで設定しているDB名
    build:
      context: .
      dockerfile: ./docker/mysql/Dockerfile

    ( 省略 )
```

しかし、名前が一致しているためこのことが原因ではないことがわかる。

`docker-compose ps`でコンテナの様子を見る。（db落ちてる・・・。）

```
% docker-compose ps

    Name                   Command               State                 Ports              
------------------------------------------------------------------------------------------
db              docker-entrypoint.sh mysqld      Exit 1                                   
app_1   　　　　　　　　　　　　　　　　docker-php-entrypoint php-fpm    Up       9000/tcp                        
web_1   　　　　　　　　　　　　　　/docker-entrypoint.sh ngin ...    Up       0.0.0.0:80->80/tcp,:::80->80/tcp
```

`log`を見てみるが、`[Error]`表記は見当たらない。

```
% docker-compose logs

(dbのlogのみ表示)

db     | 2021-08-25 13:50:26+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started.
db     | 2021-08-25 13:50:27+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db     | 2021-08-25 13:50:27+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started.
```



念の為、appコンテナ内でキャッシュをあらかた削除しても変化なし。

```terminal
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear
```

# 解決
`volume`を一括削除することで解決しました。

```
% docker volume prune

WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
ba53e7ce7cfad60548a239ec1164eaffa33b25c0f3ab6704f4c04fe98c4ed362
673fcb4811cf0029496745d2231d3c2a35ce1ee2257c23b1bb5ae3f74de02f6b
75d6dc4cd93203db7002431d2f39e3135cec328afe3222535366b2b1a6064d11
7804e118e3461ffa02cef0eea6a2f9850990f4b48e9c5b61e1a82c50c684357a
docker-laravel-env_db-store
c7f73c4d0fa34e29c75e41bd6f2e5f0d568ee348b3252d003eeadb04086d7d30
6a9a9caed760fad54e01bb66ae73e1dbbd48afe77ff2ddee1c85abc3426193da
b0e76adbcee655df609bd5ef13532d8ffb3ad64b5e5efff608aec40092355a64
5797c61813c2913ef44b9d90dd6b1cca53bc850b90aed2461d7bccaceb8e9de9
d2f7fbc5ff229dc742889062e78ed15b915ec239598ce8d004cdcb43bc6955e6
fe16849776b7f034a9a69231b9544e73afeb8e1a63fac803a439c1dd0385dc37
e08385c1d6a81c0b358511400ec183b1522956aff0516e670d9f88ad69d5c58e
5ab426718d1c9cf03ca17178637f78bcbedb0341be24361cb0689272f73b0a7b
lantern_mysql-volume
b307a1d46318a7e31248ba195de7b164b6db6f805684b7aaca81fac9cafb3112
e6678666f6b728cd69e2f4cc60ba8f01b2adf70e203625b4c6d8418e0a2f4362
6a0685551380139c2947862b799881ccc75c85f28679b3bf632474a0349c0ed4
ee2157d4d73bc7d7eac844350b58517aa7a64eab30138f9c8b201e93cb176ea1
69f2fef782f831b84162ac586f9379b7f82bde17a7c2d9686139bfdbd6b94108
647296d44ca8e9fa9ee7709ec5f26133dc3073da77cc2f3c46e83684afac87c5

Total reclaimed space: 2.817GB
```

かなり溜まってたみたいです。
dockerでエラーになった時の対処法をまた一つ知ることができました。

# 参考

https://blackbird-blog.com/docker-mysql01

https://www.engilaboo.com/laravel-test-by-docker/

https://qiita.com/mineaki27th/items/2fec99060f1c97ec2892

https://qiita.com/ksato9700/items/b0075dc54dfffc64b999#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E6%96%AD%E6%8D%A8%E9%9B%A2

https://qiita.com/reflet/items/5caa88abcf1e8964783a