【Laravel】Docker環境でマイグレーションエラーが発生した話し

20200501_telework01 実践してみた

今日はDocker環境でLaravel設定時にマイグレーションの時に、MySQL接続エラー「SQLSTATE[HY000] [2002] Connection refused」が発生した時の対処法を記載します。

環境

まずは発生した環境を記載します。

環境 バージョン
Windows10 HOME
Docker Docker version 20.10.11, build dea9396
PHP 7.4
MySQL
5.7

エラー内容

エラー発生時の環境設定

Laravel環境作成時のDocker環境

  • docker-compose.yml
# Compose fileのバージョン指定
version: '3'

# どんなコンテナを立ち上げるか
services:

# ---------------------------------
# laravelを動かすコンテナ
# ---------------------------------
  app:
  # どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの80番につなぐ
    ports:
      - "8000:80"
# 先ほど作ったDockerfileを使って、コンテナをビルドするという指定
    build: ./app
# コンテナの名前を指定
    container_name: laravel_app
# ローカルのディレクトリとコンテナ上のディレクトリのリンクを設定
# ./src は docker-composer.yml のディレクトリ直下にある src を設定している
# コンテナが作成されると src ディレクトリからコンテナの /var/www/html にアクセスすることができる
    volumes:
      - ./src:/var/www/html

# ----------------------------------
# MySQLを動かすコンテナ
# ----------------------------------
  db:
  # Docker HubからMySQL5.7の公式イメージをダウンロードしてくる指定
    image: mysql:5.7
    container_name: laravel_db

    # コンテナ内の環境変数を指定。環境変数を渡すとビルド時に設定してくれるDockerイメージがあるので、利用の際はDocker Hubのサイトで確認する
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: laravel_pass
      TZ: 'Asia/Tokyo'

    # 起動時のコマンド
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    # ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
    volumes:
      - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
      - laravel-db:/var/lib/mysql
    ports:
      - 3307:3306

  #phpMyAdmin用コンテナ
  phpmyadmin:
    container_name: phpMyAdmin-forlaravel
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: db
    restart: always
    ports:
      - "81:80"

volumes:
  laravel-db:
    driver: local

Laravelのコンテナで「php artisan migrate」を実行すると次のようなエラーが発生。

oot@cccceb4f8f58:/var/www/html/laraveltokyo# php artisan migrate

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

  at /var/www/html/laraveltokyo/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/html/laraveltokyo/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=172.18.0.2;port=3307;dbname=laravel_db", "laravel_user", "laravel_pass", [])
      /var/www/html/laraveltokyo/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.

エラーを見ると「SQLSTATE[HY000] [2002] Connection refused」と書いてありました。

これは以前にも見たことありますが、MySQLに上手く接続できてないようです。

原因

MySQLに接続できていないのでLaravelの「.env」ファイルの設定が問題なんだろうと思って、色々触っていたところ、原因はMySQLに接続するポート番号が間違えていたという単純な話しでした。

元々、別のMySQLがあったためポート番号を「3307→3306」へ転送する設定をしていたため、「.env」の中身を3307で接続するようにしていたため、それが原因でした。

修正前の設定値

  • .env
DB_CONNECTION=mysql
DB_HOST=172.18.0.2
DB_PORT=3307
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass

対処法

対処としてはポート番号を「3306」に変えてやることで無事マイグレーションできました。

修正後のファイル

  • .env
DB_CONNECTION=mysql
DB_HOST=172.18.0.2
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass

すごい単純な話しでしたが、2時間も費やしてしまった。
Laravelアプリのコンテナからすれば、コンテナ内の話しなので変更前のポートは確かに関係ないですね。。

これで解決できる方がいれば幸いです。
誰も間違わないかw

今回は以上となります。ありがとうございました。

コメント

タイトルとURLをコピーしました