Dockerを使ったLaravelでの「Connection refused」エラー

目次 閉じる

趣旨

Connection refusedでdatabaseが繋がらない状況だったのでその対処をまとめました。

内容

以下を実行したところ、、

# php artisan migrate

Connection refusedのエラーをよく見るとlaravelの.env設定とdocker-composeの設定があっていないのではとの仮説

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

  at /var/www/html/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:665
    661|         // If an exception occurs when attempting to run a query, we'll format the error
    662|         // message to include the bindings with SQL, which will make this exception a
    663|         // lot more helpful to the developer instead of just the database's errors.
    664|         catch (Exception $e) {
  > 665|             throw new QueryException(
    666|                 $query, $this->prepareBindings($bindings), $e
    667|             );
    668|         }
    669| 

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [2002] Connection refused")
      /var/www/html/laravel/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

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

  Please use the argument -v to see more details.

docker-compose.ymlを確認します。

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: [データベースの名前]
      MYSQL_USER: [データベースのユーザ名]
      MYSQL_PASSWORD: [データベースのパスワード名]
      MYSQL_ROOT_PASSWORD: [データベースのパスワード名]
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql

laravelの中に置いている.envはdocker-compose.ymlで定義した名に合わせます。
一般的にPORTはmysqlなら3306で。
<公式>
https://readouble.com/laravel/5.4/ja/homestead.html

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=[docker-composeで定義したデータベース名]
DB_USERNAME=[docker-composeで定義したユーザ名]
DB_PASSWORD=[docker-composeで定義したパスワード名]

DB_HOSTはdocker-compose.ymlで「mysql」と命名していたので、「mysql」としてますが、「db」などで命名している場合はDB_HOST=dbにしてください。
docker-composeでリスタートします。

 $ docker-compose restart

コンテナに入り、ご自身が作成したlaravelのルートファイルで再度php artisan migrateをします。

 $ docker-compose exec app bash

# ls
docker    docker-compose.yml  laravel

# cd laravel

# php artisan migrate

できました!!!

# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.11 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.04 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です