事象
Dockerで構築したLaravelでphp artisan migrateを実行したところ、下記のようなエラーが発生しました。
# php artisan migrate
Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
Illuminate\Database\QueryException
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = swgp and table_name = migrations and table_type = 'BASE TABLE')
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:742
738▕ // If an exception occurs when attempting to run a query, we'll format the error
739▕ // message to include the bindings with SQL, which will make this exception a
740▕ // lot more helpful to the developer instead of just the database's errors.
741▕ catch (Exception $e) {
➜ 742▕ throw new QueryException(
743▕ $query, $this->prepareBindings($bindings), $e
744▕ );
745▕ }
746▕ }
+36 vendor frames
37 artisan:37
Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
どうやらDBに接続できていないようです。
解決策
.envにあるDB_HOSTにはDBコンテナのサービス名を設定しなければならない。
以下のコードでいうところのdbです。
version: "3.8"
services:
db: ←これ
build:
context: ./docker/mysql
dockerfile: Dockerfile
container_name: swgp_db
restart: always
volumes:
- ./db_data:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
TZ: "Asia/Tokyo"
.envのDB_HOSTにDBコンテナのサービス名を設定します。
DB_CONNECTION=mysql
DB_HOST=db ←変更
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=sample
DB_PASSWORD=password
.envの設定を反映させるために、以下のコマンドでキャッシュをクリアします。
php artisan config:clear
これでDB接続ができました!