Laravel Sail(Larave + Docker)環境で、phpMyadminを使う方法

Laravel Sailで開発を行っている時に、手軽にDBの内容を見たり操作したいと思い調べてみた。
色々なサイト・設定が出てきたがなかなかうまくいかず、私がうまくいった設定を記載する。

# 環境
- WSL2
- Laravel Sail (Laravel 11系)
- MySQL
- Docker Desktop for Windows

Laravel Sail(Laravel + Docker)の環境構築に関しては下記記事を参照してください！

https://qiita.com/curacao/items/892109e579c377b9b4b8

# docker-compose.ymlに設定を追記する
Laravel Sailの環境ができたら、`docker-compose.yml`にphpMyadminの設定を追加する。
既存の設定の`mysql`と同じ階層に`phpmyadmin`の項目を追加する。
```docker-compose.yml
     phpmyadmin:
        image: phpmyadmin/phpmyadmin
        ports:
            - "8081:80"
        environment:
            PMA_HOST: mysql
            PMA_USER: '${DB_USERNAME}'
            PMA_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
        networks:
            - sail
        depends_on:
            - mysql
```

記載するときには、`services.phpmyadmin`となるように、`services.mysql`と同じ階層になるように注意してください！

``` docker-compose.yml 階層参考例
services:
    laravel.test:
        ~laravelの設定~
    mysql:
        ~MySQLの設定~
     phpmyadmin:
        image: phpmyadmin/phpmyadmin
        ports:
            - "8081:80"
        environment:
            PMA_HOST: mysql
            PMA_USER: '${DB_USERNAME}'
            PMA_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
        networks:
            - sail
        depends_on:
            - mysql
networks:
    sail:
        driver: bridge
volumes:
    sail-mysql:
        driver: local
```

設定にある`${DB_USERNAME}`や、`${DB_PASSWORD}`は`.env`の設定を使っています。

Laravel Sailを使っていると、デフォルトで`.env`には下記の設定があると思います。
記載がない方は追加してください。
```.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=sail
DB_PASSWORD=password
```

この設定はmysqlの部分でも使われていると思います。
`docker-compose.yml`の中で、`mysql.environment`の部分に以下のような記載があるはずです。

```docker-compose.yml
    mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: '%'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
```

phpMyadminを使う為にも、`mysql`の設定と揃える必要があるので、これらを変えている方は適宜合わせて設定してください。


設定したら、コンテナを再起動する
```
sail down
sail up -d
```
※`sail`というコマンドは`./vendor/bin/sail`と同じです！入力を楽にしたいので登録しています。詳しくは下記リンクから「./vendor/bin/sailって打つの面倒くさい」という項目を参照してください。

https://qiita.com/curacao/items/892109e579c377b9b4b8#vendorbinsail%E3%81%A3%E3%81%A6%E6%89%93%E3%81%A4%E3%81%AE%E9%9D%A2%E5%80%92%E3%81%8F%E3%81%95%E3%81%84

再起動後、`http://localhost:8081`にアクセスすると表示されるはずです！
あとは、`.env`にあるユーザーとパスワードを使ってログインできたらOKです！


# 最初ハマったこと
初めは以下のような設定で試していました。
```
phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
        - "8081:80"
    environment:
        MYSQL_USERNAME: '${DB_USERNAME}'
        MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
        PMA_HOST: mysql
    depends_on:
        - mysql
```
この設定でやるとphpMyadminのログインページは開くんですが、
> mysqli::real_connect(): php_network_getaddresses: getaddrinfo for mysql failed: Name or service not known

> mysqli::real_connect(): (HY000/2002): php_network_getaddresses: getaddrinfo for mysql failed: Name or service not known

このようなエラーが出ていて、MySQLサーバーに接続ができなく、ログインができないという現象でした。
そこから試行錯誤して冒頭の設定にたどり着いた感じです。
もし同様な現象が起きている方がいたら参考になればと思います。

# 終わりに
様々なDBクライアントツール(Sequel AceやDBeaverなど)がありますが、手軽にプロジェクトごとに一緒に起動したいという点で今回はphpMyadminを使用しました！
同じようなログイン設定でクライアントツールでも使えると思います。