以下を参考に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)
無事成功しました!