概要
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
を修正
# Laravelプロジェクトパスに変更
APP_CODE_PATH_HOST=../myapp/
# 下記を追加
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
port変更
Apacheとバッティングしそうなのでportを変更した。
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
に変更
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/.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
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