PHP
MySQL
laravel
docker
LaraDock

LaradockのMySQLに接続できなくてはまった話

概要

LaradockでLaravelの環境を作ったがMySQLに接続できなくてだいぶはまったので対処法をまとめた。

初期設定

まずは公式ドキュメントを参考に。
Getting Started

プロジェクトディレクトリで下記コマンドを叩く。

$ git clone https://github.com/laradock/laradock.git
$ cd laradock
$ cp env-example .env
$ docker-compose up -d nginx mysql phpmyadmin redis workspace 

laradock/.envを修正

laradock/.env
# Laravelプロジェクトパスに変更
APP_CODE_PATH_HOST=../myapp/

# 下記を追加
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd

port変更

Apacheとバッティングしそうなのでportを変更した。

laradock/.env
NGINX_HOST_HTTP_PORT=8888

Laravelインストール

コンテナに入る。

$ docker-compose exec workspace bash

入ったらLaravelをインストールする。

root@e8802b8f256b:/var/www# composer create-project laravel/laravel myapp

インストールが完了したらlocalhost:8888にアクセスするとLaravelの画面が表示される。

DB接続

php artisan migrate

[PDOException]
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

[ErrorException]
PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]

エラーが返ってきて死ぬほどはまった。

MySQL 8.0から仕様が変わったとのこと。
MySQL 8.0.4におけるデフォルト認証形式の変更
【Docker】MySQL8.0系を使う時に発生する問題について

8.0である必要がなかったので、5.7にして再ビルドした。

やったこと

イメージ、データ削除

$ docker rmi laradock_mysql
$ docker rm volume laradock_mysql
$ rm -rf ~/.lardock/data/mysql

バージョンを5.7に変更

laradock/.env
MYSQL_VERSION=5.7

再ビルド

$ docker-compose build --no-cache mysql

MySQLバージョン確認

$ docker-compose exec mysql bash
root@8a9792617ae7:/# mysql --version
mysql  Ver 14.14 Distrib 5.7.24, for Linux (x86_64) using  EditLine wrapper

MySQLにログイン

$ docker-compose exec mysql bash
root@8a9792617ae7:/# mysql -udefault -psecret
mysql> 

php artisan migrateが実行できるか確認

$ docker exec -it laradock_workspace_1 /bin/bash
root@09a020d7430e:/var/www# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

これ見て解決した。
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client #1392

これ以外にやったこと

myapp/.envlaradock/.envに合わせるよう修正

laradock/.env
MYSQL_VERSION=5.7
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
myapp/.env
DB_CONNECTION=mysql
DB_HOST=mysqlあるいは192.168.0.1
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

Request::ip()で出てきたIPに合わせるといける。

@php
echo Request::ip()."<br>";
$remote_addr = $_SERVER['REMOTE_ADDR']."<br>";
$server_addr = $_SERVER['SERVER_ADDR']."<br>";
echo $remote_addr;
echo $server_addr;
@endphp

[php] Laravel 5.1でクライアントのIPアドレスを取得する方法は?