Laradock と闘った話
概要
Laravel + Docker の勉強の一環として、Laradock で環境構築しようとしたらハマりポイントがめちゃくちゃあったので奮闘の記録を書きます。環境とバージョンにかなり左右されるので、同じようにやってもうまくいく保証は無いですが一応自分の備忘録といて残します。
試した環境について
Laradock を使う前に、YYPHP のハンズオンで Docker から Laravel を動かす方法について動画を見ながら勉強した。こちらはうまくいった。
やりたかったこと
下記の記事のように小さなアプリを作りたいと思って環境構築をしていたのだけど、どうしてもうまく Vagrant 上にマウントすることができなかったので Laradock なら必要な実行環境がすべて用意できるらしいと聞き、環境構築を始めた。
Laravel + Vue.js で出席管理Webアプリを作成する - Part.1 | LuftGarden
Laradock の公式はこっち。
つまずきポイント
まずは公式ドキュメントにそって進める
.env
ファイルを編集して http://localhost/ に接続 -> 404 Not Found orz
コンテナ上に 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 に接続すれば・・・
はい。 本番はここから。
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]
うう。。。ヤックシェービング。。。
ここが最後の難関で、なんとかこの記事の通り認証方式を変更することで解決できた。
docker-compose exec mysql mysql -uroot -proot
でMySQLにログイン。
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にログインする際 -proot
とCLIでオプションを付けているのでログイン後に安全では無いよ、と怒られる。この辺のことも解決しておきたいけど。今回は疲れたのでとりあえずここまで。