「Connection refused」エラーが発生するまでに実装した内容
1.以下のdocker-compose.ymlでLaravel環境を立ち上げ。
version: '3'
services:
laravel:
image: laravel-image
container_name: laravel-container
build:
context: ./docker/laravel
dockerfile: Dockerfile
ports:
- "8080:80"
volumes:
- ./laravel:/app/laravel
working_dir: /app/laravel
mariadb:
image: mariadb:10.5.4
container_name: mariadb-container
volumes:
- db-volume:/var/lib/mysql
environment:
MYSQL_DATABASE: sample_db
MYSQL_USER: sample
MYSQL_PASSWORD: sample
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
volumes:
db-volume:
※今回のエラーとは関連が薄いため、laravel-containerのDockerfileの記述は割愛。
2.Laravelコンテナのシェルに入る。
$ docker exec -it laravel-container bash
※laravel-containerからmariadb-containerへの接続を行う。
3.マイグレーションを実行(ここでエラー発生)
$ php artisan migrate
このタイミングで、Connection Refusedが発生。
具体的には下記のようなエラーでした。
Illuminate\Database\QueryException
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = sample_db and table_name = migrations and table_type = 'BASE TABLE')
「Connection refused」エラーの原因と対応
原因はLaravelの「.env」ファイルとの整合性が取れていなかったこと。
以下の設定がdocker-compose.ymlの設定とずれていないかを確認する。
DB_CONNECTION=mysql ←mariadbの場合は「mysql」でOK
DB_HOST=mariadb-container ←コンテナ名
DB_PORT=3306 ←ポート番号
DB_DATABASE=sample_db ←データベース名
DB_USERNAME=sample ←ユーザ名
DB_PASSWORD=sample ←パスワード
※ちなみに私はDB_HOSTをコンテナ名にしていなかったためエラーでした。
念の為、configキャッシュをクリアする。
$ php artisan config:cache
上記以外の原因として考えられること
他にもいろいろあるとは思いますが、今回の状況では以下2点でも引っかかりました。
・Docker側のdocker-compose.ymlの3306ポートが定義していなかった。
→下記の設定をしっかりすることで解消。コンテナの再起動を忘れずに。
ports:
- "3306:3306"
・mariadbコンテナが起動していない。
→起動しているかを「docker ps -a」で確認する。