Dockerでlaravelの環境構築を行なったときに解決に時間がかかって苦しんだことを書き留めます。
事象
Connection refused のエラーでDBに接続できない。
# php artisan migrate
Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = test_db and table_name = TEST_MIGRATIONS and table_type = 'BASE TABLE')
DBのコンテナは正常に動いているし、
# docker-compose -f docker-compose.test.yml ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------
mysql docker-entrypoint.sh mysql ... Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
php8.0-apache /usr/sbin/httpd -DFOREGROUND Up 0.0.0.0:80->80/tcp,:::80->80/tcp
phpmyadmin /docker-entrypoint.sh apac ... Up 0.0.0.0:8888->80/tcp,:::8888->80/tcp
解決
調べてみると、
Laravel側 の.env の DB_HOST には、
docker-compose の services: に定義したDBコンテナのサービス名を設定する必要があるとのこと。
.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=test_user
DB_PASSWORD=test_pass
↓
.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=test_user
DB_PASSWORD=test_pass
上記の通り修正し、LaravelからDBに接続できました。
ローカルPCからのDB接続時と同じように、
127.0.0.1 でポートを指定すれば接続できると思い込んでいたため、気づくのに時間がかかりました…。
Dockerでは、コンテナ間の通信をコンテナのサービス名で行なうようです。