先日、個人開発でLaradockを用いてサーバ環境構築を行いました。

今回はDocker環境でLaravelの環境構築を簡単に出来るLaradockを使用した時にハマったポイント(migrateが出来るまで)を纏めたいと思います!
環境構築手順
Laradock公式ページ
https://laradock.io/getting-started/
を基に環境構築をしていきます。今回はPHPのファイルが一切ない状態から始めます。
LaradockのリポジトリをCloneする
まずはLaradockをローカル環境にダウンロードする必要があります。
$ pwd /Library/WebServer/project $ git clone https://github.com/Laradock/laradock.git
Laravelのソースコード用のディレクトリを作っておく
$ pwd /Library/WebServer/project # src という名前で用意 $ mkdir src $ ls -l total 0 drwxr-xr-x 82 suzukitakashi wheel 2624 9 21 20:47 laradock drwxr-xr-x 2 suzukitakashi wheel 64 9 21 20:52 src
Laradockディレクトリ内で env-example を .env にコピーする
$ cd /Library/WebServer/project/laradock $ cp env-example .env
この .env ファイルが環境構築をする上での設定ファイルになります。
.envファイルに先程作成したLaravelソースコード用のパスを指定する
########################################################### ###################### General Setup ###################### ########################################################### ### Paths ################################################# # Point to the path of your applications code on your host APP_CODE_PATH_HOST=../src ←ここを修正
You can edit the
.env
file to choose which software’s you want to be installed in your environment. You can always refer to thedocker-compose.yml
file to see how those variables are being used.https://laradock.io/getting-started/
.env
ファイルを編集して、環境にインストールするソフトウェアを選択できます。
いつでもdocker-compose.yml
ファイルを参照して、これらの変数がどのように使用されているかを確認できます。
公式に書いてあるように docker-compose.yml を確認し、.env で対応した箇所の設定を行うことでlaradockをカスタマイズしていきます。
基本的にはこの流れで環境構築が可能です。
コンテナーを立ち上げる
$ pwd /Library/WebServer/project/laradock $ docker-compose up -d nginx mysql
-d オプションはデタッチモードを示し、このオプションがないとバッググラウンドでサーバーが立ち上がりません(control + c でシャットダウンしてしまいます)
今回は nginx と mysql のみコンテナを立ち上げます。
が、nginxのようなサーバーコンテナを立ち上げると自動で必要なコンテナも一緒に立ち上がります。
Creating laradock_mysql_1 ... done Creating laradock_docker-in-docker_1 ... done Creating laradock_workspace_1 ... done Creating laradock_php-fpm_1 ... done Creating laradock_nginx_1 ... done
完了すると上記の5つのコンテナが立ち上がっているのがわかります。
なお、この引数となっている nginx mysql については docker-compose.yml に定義されています。
Apache や PostgreSQL を使いたい場合はこの引数を変えれば、それぞれのコンテナを立ち上げることができます。
コンテナにアクセスする
docker-compose exec workspace bash
上記コマンドでコンテナにアクセスします。
この例では workspace というソースコードを管理するコンテナにアクセスしています。
※注意!
docker exec -it {workspace-container-id} bash
他のブログでたまに見かける上記の書き方はWindows用のアクセス方法です。
環境をよく確認して実行しましょう!
Laravelのコードをダウンロードする
workspaceコンテナに入っても何もないかと思います。
ここにLaravelのコードをダウンロードします。
公式の手順とは少し逸れますが、公式のドキュメントを元に進めます。





workspaceのコンテナにアクセスする
ここは上記手順で既に入っているので割愛します
Laravelをインストールする
composer create-project laravel/laravel myTools "6.0.*"
今回は src という名前で LaravelのVersionは LTS の 6.0 にします
root@fa1daf41e1c0:/var/www# composer create-project laravel/laravel myTools "6.0.*" Do not run Composer as root/super user! See https://getcomposer.org/root for details
以下のエラーはrootで実行していることが原因です。
公式ドキュメントではアクセス時に
docker-compose exec --user=laradock workspace bash
と、–user=laradock を付けるとlaradockというユーザー名義でアクセスすることができ、Laravel環境を立ち上げることが出来るようになると記載されています。
補足になりますが、上記のlaradockのようなサーバ上で管理されているユーザーの一覧は
cat /etc/passwd
で確認することが出来ます。
.envファイルを編集する
Laravelのインストールが完了すると、最初に設定したソースコード用のディレクトリに新たにLaravelのファイルが追加されます。
それに伴い、一番最初に設定した .env ファイルを書き換える必要があります。
########################################################### ###################### General Setup ###################### ########################################################### ### Paths ################################################# # Point to the path of your applications code on your host APP_CODE_PATH_HOST=../src/myTools ←ここを修正
もう一度コンテナを立ち上げ直して設定を反映させる
$ pwd /Library/WebServer/project/laradock $ docker-compose up -d nginx mysql
.envファイルを編集する
Open your PHP project’s
.env
file or whichever configuration file you are reading from, and set the database hostDB_HOST
tomysql
:PHPプロジェクトの
https://laradock.io/getting-started/#Usage.env
ファイルまたは読み取り中のいずれかの構成ファイルを開き、データベースホストDB_HOST
をmysql
次のように設定します。
DB_HOST=mysql
.envファイルがたくさん出てきてしまい、混乱すると思いますが、ここでは workspace コンテナ内で先程作ったLaravelの .env ファイルを指します。
なお、コンテナの中で編集した結果は、最初に設定したソースコード用のディレクトリに新たにLaravelのファイルにも反映されます。
動作確認
http://localhost/ にアクセス
Laravelの画面が表示されたら成功です!!
ブラウザで正しく表示されない場合、
$ docker-compose ps
で各コンテナの状態を確認が可能です。
$ docker-compose ps Name Command State Ports -------------------------------------------------------------------------------- laradock_docker-in- dockerd-entrypoint.sh Up 2375/tcp, 2376/tcp docker_1 laradock_mysql_1 docker-entrypoint.sh Up 0.0.0.0:3306->3306/tcp mysqld , 33060/tcp laradock_nginx_1 /bin/bash Up 0.0.0.0:443->443/tcp, /opt/startup.sh 0.0.0.0:80->80/tcp laradock_php-fpm_1 docker-php-entrypoint Up 9000/tcp php-fpm laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp
Up が正常に立ち上がっている状態ですが、Exit が出ている場合、エラーが発生して落ちてしまっています。
問題の切り分けにご活用ください!
発生した問題
MySQLの接続でエラーが発生する
今回の対応で、
php artisan migrate
を行おうとしたところ、エラーが発生してしまったのでその解決法を紹介します。
エラーログ
php artisan migrate Illuminate\Database\QueryException : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE') at /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:665 661| // If an exception occurs when attempting to run a query, we'll format the error 662| // message to include the bindings with SQL, which will make this exception a 663| // lot more helpful to the developer instead of just the database's errors. 664| catch (Exception $e) { > 665| throw new QueryException( 666| $query, $this->prepareBindings($bindings), $e 667| ); 668| } 669| Exception trace: 1 PDOException::("PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]") /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70 2 PDO::__construct("mysql:host=mysql;port=3306;dbname=laravel", "root", "", []) /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70 Please use the argument -v to see more details.
対応策
ポイントは
caching_sha2_password
です。MySQLの最新版である MySQL8.0ではログイン認証方式が変更され、デフォルトで caching_sha2_password が使われます。
MySQL 8.0 is a development release. You may prefer to use the latest stable version, or an even older release. If you wish, you can change the MySQL image that is used.
MySQL 8.0は開発リリースです。
https://laradock.io/documentation/#change-the-mysql-version
最新の安定バージョン、またはさらに古いリリースを使用することをお勧めします。
必要に応じて、使用するMySQLイメージを変更できます。
とのことで、caching_sha2_password に立ち向かう記事は沢山あるのですが、公式が推奨していることもあるため、おとなしくバージョンを下げます。
$ pwd /Library/WebServer/project/laradock # .envファイルを編集 $ vi .env
### MYSQL ################################################# MYSQL_VERSION=5.7 # ここを latest から 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
MySQLのバージョンを下げられない
終わったら
$ docker-compose up -d mysql
をして、設定を読み込ませようと思ったらうまく反映されませんでした。
キャッシュを削除して立ち上げる
$ docker-compose build --no-cache mysql
のコマンドでも変わらず…
エラーログ
ログを表示するために -d オプションを消して立ち上げてみたところ、
$ docker-compose up mysql ︙ [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800! ︙
というエラーを確認しました。
対応策
この不具合は最初にMySQLのVer.8.0を立ち上げた時点で、.env で指定したDATA_PATH_HOSTディレクトリにデータが入ってしまっていることが原因です。
バージョンを下げたVer.5.7のDBの設定データを入れることが出来ずに出ているエラーでした。
########################################################### ###################### General Setup ###################### ########################################################### ### Paths ################################################# ︙ # Choose storage path on your machine. For all storage systems DATA_PATH_HOST=~/.laradock/data # ← ここにDBの設定ファイルが貯まる
対応策は2つあり、
rm -rf ~/.laradock/data
で既存のファイルを全て削除するか、
DATA_PATH_HOST=./laradock/data # どこでも可
上記のようにDATA_PATH_HOSTをどこか違う場所に置けばDBを立ち上げることが出来ます。
まとめ
まず最初にブログを読む前に公式のページを見よう
全ての勉強に言えることなのですが、Laradockは日本語対応はされていないので、日本語で説明されている記事に飛びつきがちです。
そのため最初に公式ドキュメントを読まずにQiitaなどのブログを読んで同じ手順でやりたくなります。
しかし、それでは本当の意味での理解にはなりませんし、開発環境の違いでエラーが発生した時にどうしたら良いか分からなくなってしまいます。
公式ドキュメントは世界で一番正しいことを書いている資料です。
今はGoogle翻訳のChrome拡張などを使えば、英語を読めなくてもなんとなく内容を察することが出来るようになりました。
怖がらないで公式のページを読む習慣を付けましょう。
どうしても分からなくなったらQiitaなどを参考にする
MySQLのエラーの解決策に関してはひたすら調べましたが、「Laravel MySQL 立ち上がらない」という検索よりは、エラーログを確認した状態でエラーログを検索した方が確実な情報が手に入りやすいです。
自分がどこまで分かっているか、今の知識でどこまで原因を調査できるか、を少しずつ整理していくと問題解決のスピードは上がっていきます。
さて、これでローカルの開発環境が整ったので何かやっていこうかと思います。
ここまで読んで頂きありがとうございました!
コメント