Docker上Laravelでの「Connection refused」エラー対応

Laravel

「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」で確認する。