質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

Laravelでartisan migrateができない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 225

afroscript.10

score 142

前提・実現したいこと

Docker上でLaravelを用いたアプリ開発をしようとしています。

発生している問題・エラーメッセージ

下記の記事を元にDocker上でLaravelを動かすことはできたのですが、
https://qiita.com/A-Kira/items/1c55ef689c0f91420e81

次に下記記事に沿って、Laravelを触ってみようとしたところで詰まってしまいました。

https://qiita.com/sano1202/items/6021856b70e4f8d3dc3d

2.マイグレーションの実行の部分ですが、マイグレーションファイルを作成し、php artisan migrateで、マイグレーションの実行を行ったところ、次のようなerrorが出ました。

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

  Exception trace:

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

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

  Please use the argument -v to see more details.

※追記
マイグレーションファイルはこちらです。記事に従ってphp artisan make:migration create_books_table --create=booksで作成しました。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateBooksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
          $table->bigIncrements('id');
          $table->string('name', 50);
          $table->integer('price');
          $table->string('author', 50)->nullable();
          $table->timestamps();
        });
        // Schema::create('books', function (Blueprint $table) {
        //     $table->bigIncrements('id');
        //     $table->timestamps();
        // });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('books');
    }
}

試したこと

現状、.envファイルのDB部分は、下記のようになっております。

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

docker exec -it db-host bashでmySQLコンテナに入り、USERNAM/PASSWORDともにrootでログインしましたが、問題なくログインできます。

databaseというデータベースも存在してました。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| database           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

また、(関係ある試みか分からないですが)
1つ目の記事のdocker-compose.yamlファイル内で、MYSQL_USER: docker/MYSQL_PASSWORD: dockerも作っていたので、.envファイルを下記のように書き換えてphp artisan migrateを実行しても同様のerrorでした。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=docker
DB_PASSWORD=docker

補足情報(FW/ツールのバージョンなど)

Docker: 19.03.1
PHP: 7.2.21
Laravel: 5.8.31
MySQL:5.7.27

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • afroscript.10

    2019/08/16 13:44

    このようになりました!(error変わらずです;;)

    root@3f10f09d6bcb:/var/www# composer dump-autoload
    Generating optimized autoload files> Illuminate\Foundation\ComposerScripts::postAutoloadDump
    > @php artisan package:discover --ansi
    Discovered Package: beyondcode/laravel-dump-server
    Discovered Package: fideloper/proxy
    Discovered Package: laravel/tinker
    Discovered Package: nesbot/carbon
    Discovered Package: nunomaduro/collision
    Package manifest generated successfully.
    Generated optimized autoload files containing 3628 classes
    root@3f10f09d6bcb:/var/www# php artisan migrate

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

    Exception trace:

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

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

    Please use the argument -v to see more details.

    キャンセル

  • Kosuke_Shibuya

    2019/08/16 13:53

    もうお手上げ

    キャンセル

  • afroscript.10

    2019/08/16 13:59

    了解です...!ここまで時間使って頂き、本当にありがとうございます...!!

    なんとかもがいてみます...!;;

    キャンセル

回答 1

checkベストアンサー

+2

docker exec -it db-host bashでmySQLコンテナに入り、USERNAM/PASSWORDともにrootでログインしましたが

こちらを拝見して気になったのですが、「MySQLコンテナ」と「Laravelが動いているコンテナ」は別ですよね?

もしそうだとしたら、「mySQLコンテナに入ってログインできた」は「Laravelが動いているコンテナからログインできる」とイコールではありませんので、「Laravelが動いているコンテナ」からはログインできないのでは?

■確認
MySQLコンテナではなく「Laravelが動いているコンテナ」で mysql -h 127.0.0.1 -u root -proot を実行したらどうなりますか?(「Laravelが動いているコンテナ」にmysqlコマンドがインストールされていないようでしたら、インストールした上で確認してください)

■仮説
上記がログインできないとすると、おそらく、.envファイルの

DB_HOST=127.0.0.1

この設定が誤っているのではないかと思います。
※ 127.0.0.1 は、通常は自分自身のサーバーのIPアドレスです。
MySQLコンテナからは(自分自身なので)この値で接続できますが、Laravelが動いているコンテナからの接続時には(自分自身ではないので)通常使用されないと思われます(proxy設定等を駆使して、応用的に使うこともありますが……)。

■(仮説が正しいとして)対応
https://qiita.com/maejima_f/items/34cf3b8eb5ffbe256ad9
でLaravelプロジェクトのコンテナとMySQLのコンテナの接続方法を解説しているので、そちらが参考になるのではないでしょうか?(私は動作未検証ですが)


コメントを受けて追記。

「Laravelが動いているコンテナ」で
mysql -h 172.20.0.3 -u root -proot
を実行したら接続できますか?

もし接続できるようであれば、.envファイルの修正はしましたか?

DB_HOST=127.0.0.1

→この設定は、MySQLのIPアドレスとして[127.0.0.1]=自分自身のサーバーを指定しているので、ここを[172.20.0.3]に変更する必要があります。


気づいたことがあったので、さらに追記(上記の追記事項はそのまま確認をすすめてください)。

回答コメントに添付していただいたエラーメッセージに

2 PDO::__construct("mysql:host=mysql;port=3306;dbname=database", "root", "root", [])

と書かれているのですが、 mysql:host=mysql; の部分、本来は mysql:host=172.20.0.3; 、要するに「host=[MySQLのIPアドレス];」になるのが正しいです。

質問時のエラーメッセージは

2 PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=database", "root", "root", [])

となっており、(127.0.0.1 という誤ったIPアドレスではありますが)フォーマット的には正しいです。

今回の修正で、誤って .envファイルのDB_HOSTの設定を消してしまったり、 DB_HOST=mysql と書いたりしていませんか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/21 12:27

    下記でmigrateできるようになりました!...が、これであってますでしょうか...??

    ■mysqlが動いているコンテナ情報を確認
    docker inspect 2c7094b2aef2

    ■mysqlが動いているコンテナのIP情報が下記であることが確認できた
    "IPAddress": "172.20.0.2",

    ■.envを下記のように修正

    DB_CONNECTION=mysql
    DB_HOST=172.20.0.2
    DB_PORT=3306
    DB_DATABASE=test_db1
    DB_USERNAME=root
    DB_PASSWORD=root

    ■ php artisan config:clearを実行

    root@3f10f09d6bcb:/var/www# php artisan config:clear
    Configuration cache cleared!

    ■php artisan migrateを実行

    root@3f10f09d6bcb:/var/www# php artisan migrate
    Migrating: 2014_10_12_000000_create_users_table
    Migrated: 2014_10_12_000000_create_users_table (0.09 seconds)
    Migrating: 2014_10_12_100000_create_password_resets_table
    Migrated: 2014_10_12_100000_create_password_resets_table (0.05 seconds)
    Migrating: 2019_08_20_021523_create_books_table
    Migrated: 2019_08_20_021523_create_books_table (0.03 seconds)
    Migrating: 2019_08_20_022045_test_db1_table
    Migrated: 2019_08_20_022045_test_db1_table (0 seconds)

    キャンセル

  • 2019/08/21 13:11

    問題ないと思います。お疲れ様でした。

    ちなみに、そちらでアクセスできる理由ですが、おそらく

    ```
    mysql> SELECT user, host FROM mysql.user;
    +---------------+------------+
    | user | host |
    +---------------+------------+
    | root | % |
    ```

    があるためかと思われます。
    ※"%"はワイルドカード=localhost以外のどこからでもアクセスできます。
    https://b.l0g.jp/mysql/user-at-localhost/


    もしかしたらご存知かもしれませんが、今回の修正について簡単に説明させていただきます。

    IPアドレスとは?
    :サーバー(やコンテナ)の住所。

    IPアドレス=127.0.0.1
    :「自分自身(のサーバーやコンテナ)」を表す特別な住所表記。いわゆる「俺ん家」
     Aサーバーで「127.0.0.1」を指定すればAサーバーを指すし、Bサーバーで「127.0.0.1」を指定すればBサーバーを指す。

    今回の対応:
    質問の時点では、「MySQLコンテナの住所」を書かなければならないところに「俺ん家(127.0.0.1)」と書かれていた。
    ※「俺ん家」、つまり、「Laravelが動いているコンテナの住所」なので、これでは接続できない(「MySQLコンテナ」は別の住所にあるので)。

    「MySQLコンテナの住所」を正しい住所(172.20.0.2)に書き直した。

    接続できた。

    ※途中でrootユーザーに「172.20.0.3」からのアクセス権を付与したりしていただいていますが、この設定は無くても問題なかったと思われます(rootユーザーに「%(ワイルドカード)」が設定されているため)。

    なお、
    > DB_HOST=mysql
    ですが、Dockerコンテナのラベルにこの名前が設定されている場合、この名前で接続できるようですね。失礼いたしました。
    この辺りはあまり知見がないため、コメントは差し控えさせていただきます。

    キャンセル

  • 2019/08/21 13:32

    問題ないとのことでよかったです!
    細かい解説までして頂き、ありがとうございます!

    >ちなみに、そちらでアクセスできる理由ですが、おそらく

    このあたりもなんとなくしか分かってなかったので、非常に勉強になります!!mm

    >ですが、Dockerコンテナのラベルにこの名前が設定されている場合、この名前で接続できるようですね。失礼いたしました。
    >この辺りはあまり知見がないため、コメントは差し控えさせていただきます。
    ここもよく分からなかったので、Dockerについてもっと調べてみます!

    本当にありがとうございました!とてもとても助かりました!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る