今日は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
今回は以上となります。ありがとうございました。

コメント