私はこれまでローカル環境でも本番サーバ環境でもdebian系のlinuxマシンの上で直接Laravel(LEMP)環境を構築してきました。
dockerを知り、共同開発を楽に行うために、そしてあわよくばkubernetesを使うなどして本番環境でも使えるような形で、dockerを活用してLaravel(LEMP)環境を構築できないかと考えてみました。
Installation – Laravel – The PHP Framework For Web Artisansの公式ドキュメントで紹介されているSailを使うやり方は、簡単に環境を構築できますが、何をしているのかよくわからず、php – Is Laravel Sail deployment-ready – Stack Overflowあたりを読む限り本番環境で使うためには作られていないようなので、却下しました。
そこで、これならわかるDocker上にLaravel環境構築 | アールエフェクトを主に参照して、自分なりにdocker-composeでミニマムなlaravel(LEMP)環境を構築してみました。
結論は以下のgithubをご覧ください。
Asano-Naoki/docker_laravel_minimum: docker-compose for minimum laravel(LEMP) environment
使い方は上記のgithubの日本語版 README はこちらに書いてあるとおりです。
ここからは詰まった箇所などを紹介していきます。
まず、全体構成をどうするかに悩みました。既存のプロジェクトにも簡単に適用できるように、Sailを使った場合の構成を参考にして、通常のlaravelプロジェクトディレクトリの中にdockerディレクトリとdocker-compose.yamlを入れる形にしました。mysqlのデータベース関係のファイルは、Sailを使った場合と異なり、dockerティレクトリの中にvolumeを構築してその中に保存するようにしました。
このやり方ではlaravelプロジェクトディレクトリはdocker-composeとは別に事前に用意することになります。その際にdockerのcomposerを使うと楽に新しいlaravelプロジェクトディレクトリを作成することができるのですが、デフォルト設定で行うと所有者がrootになってしまうということにしばらく気づかず少しハマりました。
理解のためにまずはphpのコンテナだけを作成して、php artisan serveコマンドで確認しようとしました。そのときには、
--host=0.0.0.0
というオプションを設定しないとdocker外のブラウザからアクセスできないということにしばらくハマりました。このあたりのdockerコンテナ内外での通信といった概念はややこしいです。
次にmysqlコンテナを加えました。
phpからmysqlを扱うために、pdo_mysqlをインストールします。phpからmlocati/docker-php-extension-installer: Easily install PHP extension in Docker containersへとリンクをたどり、その指示に従いました。
いつものクセでシェルから「mysql -u root -p」でmysqlにログインしようとしても一向にできる気配がなく悩みました。よく考えればそりゃそうです。mysql-clientが入っていないのですから。「php artisan db」も同じです。
mysql-clientをphpコンテナにインストールしてからもmysqlにログインできず困りました。エラーメッセージを手がかりにして調べてみると、パスワード方式の問題のようだと判明し、docker-compose.yamlに
command: --default-authentication-plugin=mysql_native_password
の行を追加しました。
その他、mysqlコンテナの初回立ち上げ時にはそれなりの時間がかかる、.envで指定するDB_HOSTが127.0.0.1ではなくmysqlだということにも少し詰まりました。
最後はnginxです。ここでは “The stream or file “/var/www/html/storage/logs/laravel.log” could not be opened in append mode: Failed to open stream: Permission denied”エラーに悩まされました。パーミションを777に設定して解決するのは簡単ですが、誰でも書き込めるようにするのは抵抗があったので、www-dataを所有グループに変更し、パーミションは775にするということで対応しました。どうやらdockerコンテナ内外で同じUID/GIDが付与されているようです。そのUID/GIDがコンテナの内外ではそれぞれ別のユーザーやグループを指しているとしても。
こうした試行錯誤の過程ではdocker-composeをupしたりdownしたりを繰り返します。それが面倒なので.bashrcにdocker-composeコマンドの別名(エイリアス)としてdcを登録しました。
けっこう苦労しましたが、おかげでdockerにも慣れつつ、理解しながらdocker-composeでミニマムなLaravel(LEMP)環境を構築することができたと思います。