Laradock と闘った話

概要

Laravel + Docker の勉強の一環として、Laradock で環境構築しようとしたらハマりポイントがめちゃくちゃあったので奮闘の記録を書きます。環境とバージョンにかなり左右されるので、同じようにやってもうまくいく保証は無いですが一応自分の備忘録といて残します。

試した環境について

Laradock を使う前に、YYPHP のハンズオンで Docker から Laravel を動かす方法について動画を見ながら勉強した。こちらはうまくいった。

www.youtube.com

やりたかったこと

下記の記事のように小さなアプリを作りたいと思って環境構築をしていたのだけど、どうしてもうまく Vagrant 上にマウントすることができなかったので Laradock なら必要な実行環境がすべて用意できるらしいと聞き、環境構築を始めた。

Laravel + Vue.js で出席管理Webアプリを作成する - Part.1 | LuftGarden

Laradock の公式はこっち。

Laradock

つまずきポイント

まずは公式ドキュメントにそって進める

コンテナ上に Laravel プロジェクトを作成する

Qiita や stackoverflow などの記事をdigっていたら同じポイントでつまずいていた人の記事があったので参考に。

DockerでLaravelの開発環境を構築する(更新:2017/07/03)

$ docker exec -it --user=laradock laradock_workspace_1 /bin/bash で workspace コンテナにログインし、コンテナの中で composer からプロジェクトを作成。 laravel/laravel 以降のプロジェクト名は任意で決めてよい。 ただし、root ユーザーで composer を実行しようとすると警告が出るので、上記のように必ず--userオプションでユーザー名を指定する必要がある。

下記のコマンドで laravel_docker_test という名前のプロジェクトを作成する。

laradock@<container-id>:/var/www$ composer create-project laravel/laravel laravel_docker_test

YAMLファイルの設定方法がわからない

プロジェクトの作成が終わったらdocker-compose stopで各コンテナを一旦停止。上の記事では docker-compose.yml のapplicationsを変更する手順で進めているが、自分が手元でgit cloneした Laradock の YAMLファイルには項目が存在しない・・・。 どうやら、docker-compose のバージョンが「3」に上がってから項目が削除されたみたい。 github.com

YAMLファイルではなく.env ファイルを変更する

現行の Laradock ではローカルとコンテナ上のディレクトリの紐付けはYAMLファイルではなく、/laravel/.envで管理されているのでそこに該当する変数をいじれば良いということがわかった。

Laradock + nginx + MySQL + phpMyAdmin => macOS

というわけで、.envファイルを以下のように変更

APP_CODE_PATH_HOST=../laravel_docker_test

ついでに、MySQL と NGINX の HOST の設定も上記の記事の通りに変えておく。 .envファイルを変更した場合、コンテナに反映させるためには必ずdocker-compose up -d-dオプションを付けて再実行しなければならない。 ここで再度 localhost に接続すれば・・・

f:id:takflife:20181013170210p:plain

はい。 本番はここから。

MySQLマイグレーションがしたい

先ほどの記事にある、[laravelプロジェクト]/app/Providers/AppServiceProvider.phpの設定変更までやったら MySQL 上にテーブルを作成する。 でも、現段階だとマイグレーションファイルを作ってphp artisan migrateを実行してもエラーになる。

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

うう。。。ヤックシェービング。。。

ここが最後の難関で、なんとかこの記事の通り認証方式を変更することで解決できた。

Laradock+MySQL マイグレーションするまで

docker-compose exec mysql mysql -uroot -prootMySQLにログイン。

mysql> ALTER USER 'default'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';`
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';

先にマイグレーションファイルを作る前に、このコマンドで認証方式を変更しておいたほうがよさそう。 これで認証方式が mysql_native_passwordに変わったのでphp artisan migrateできるようになった。 ただ、MySQLにログインする際 -prootCLIでオプションを付けているのでログイン後に安全では無いよ、と怒られる。この辺のことも解決しておきたいけど。今回は疲れたのでとりあえずここまで。