Laravel

Dockerで構築したLaravelがDBに接続できない時の解決策

事象

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接続ができました!