【laradock】nginx | laravel | mysql構成でphp artisan migrateで失敗する問題の解決方法

以下を参考にLaradockで環境構築した際に「php artisan migrate」でこけた時のメモ
qiita.com

問題

「docker-compose up」で立ち上げはうまくいったけど、プロジェクトディレクトリで「php artisan migrate」実行時、以下のようなエラーが発生。

 Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')

  at /var/www/src/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::("SQLSTATE[HY000] [2002] Connection refused")
      /var/www/src/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

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

  Please use the argument -v to see more details.

解決方法

「.env」ファイルのDB設定はデフォルトで以下のようになっており、

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

「DB_HOST=127.0.0.1」はDBが同コンテナに同居する場合は問題ないが、コンテナが分かれている場合はDBコンテナのIPアドレスを設定し、さらにmysql側でWebサーバー側からアクセスするユーザーを作成してやる必要がある。コレ普通だったら当たり前なことなんだけど、なんとなくLaradockならdocker-compose upする時にその辺うまいこと勝手にやってくれるのかなとか思ってたんですけどね。

手順

まず以下コマンドでworkspaceコンテナに接続し、IPアドレスを確認

docker exec -it laradock_workspace_1 bash
hostname -i
172.19.0.4 172.18.0.2

次にDBコンテナに接続し、workspaceからアクセスするユーザーを作成し、全権限を付与

docker exec -it laradock_mysql_1 bash
mysql -u root -p
Enter password: root
mysql> use mysql;
mysql> CREATE USER root@172.19.0.4 IDENTIFIED BY 'root';
mysql> CREATE USER root@172.18.0.2 IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON * . * TO root@172.19.0.4;
mysql> GRANT ALL PRIVILEGES ON * . * TO root@172.18.0.2;

それからDBコンテナ側のIPアドレスを確認し、

mysql> exit
root@c0bd97a0915b:/# hostname -i
172.19.0.3

確認したDBコンテナのIPアドレスを「.env」ファイルのDB_HOSTに書き込む。

DB_CONNECTION=mysql
DB_HOST=172.19.0.3
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

この状態でコンテナを再起動し、

docker-compose stop
docker-compose up -d nginx mysql

プロジェクトディレクトリで「php artisan migrate」を実行

docker exec -it laradock_workspace_1 bash
root@fca294aa9d0a:/var/www# cd src/
root@fca294aa9d0a:/var/www/src# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.05 seconds)

無事成功しました!