search
LoginSignup
1

More than 1 year has passed since last update.

posted at

updated at

DockerでのLaravel環境構築で、DBに接続できない(Connection refused)

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

DBに直接接続も可能でした。
image.png

解決

調べてみると、
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では、コンテナ間の通信をコンテナのサービス名で行なうようです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1