LaravelをVagrant on Dockerで動かしてリモートデバッグも有効にする

はじめに

はじめてLaravelアプリケーションをDockerで動かしてみたので知見を共有。

環境

構成

f:id:syogo0417:20181129125341p:plain
作った環境のザックリ構成

プロビジョニング自体はAnsibleで自動化しました。

コードはプロジェクト要素抜いたらGitHubにでも上げときます。

が、後述の反省点にある通りでやり方に問題はあるので、そのまま使うことは全くおススメしませんが。

各VolumeはゲストOS上のディレクトリとマウントします。

Laravel製アプリケーションはホストOS <=> ゲストOS <=> コンテナのVolumeで共有します。

今回は開発環境ということで、アプリケーションはゲストVM上にデプロイ(ってもホスト上のファイルをマウントしてるだけ)ですが、 本番環境なら、デプロイ用のコンテナを用意してgit clone & composer installなりするようにすれば、無停止デプロイの一兆上がりとなる想定でいます。

MySQLもコンテナ化してはありますが、本番環境ならコンテナ管理外で使う想定なので、どこからでもアクセスできるようにしてあります。

使ったイメージ

今回はそれぞれ公式から拝借

反省点

カジュアルにやりたかったので、公式のイメージをAnsibleから使うようにしましたが大失敗でした。 Ansibleのモジュールは完成済のイメージをデプロイする分には便利ですが、 今回みたいに更にカスタマイズする場合には向いてないな、と。

理由はコンテナ起動して必要な設定を入れなおさないといけなかったため。 私が知らない&見つけられなかっただけで、やりようがあったのかもしれませんが、 今回に限って言えば、おとなしくDockerfile書けば良かった、と思いました。

はまったこと

  1. 「/」以外にアクセスできない これの原因は、公式コンテナイメージだとapachemod_rewriteが有効になっていないため起きてました。 1時間くらい原因を探してた気がします。。

  2. remoteデバッグでコードが紐づかない xdebug.remote_connect_back=1にしてアクセスしてきたクライアントに繋ぎにいって止まるところまでは簡単にできたけど、ソースが紐づかないし、紐づけ方が判らなくて苦労しました。

最終的にはIDEAが何か吐いてるのを見つけて、書いてある通りにやったらいけました。 コンテナのボリュームとかどうでも良くて、ゲストOS上でマッピングしてれば何でもいいらしいです。。xdebugでのDockerとは一体。。

設定は以下のとおり

mkdir -p /var/www
cd /var/www
ln -s /vagrant html

シンボリックリンクをホストOS側に貼る場合は、vagrant upを管理者権限のPower shellなりで叩く必要があるのでお気を付けください。

php.ini

[xdebug]
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_connect_back=1
xdebug.remote_port=9001
xdebug.idekey="phpstorm"

あとはいつも通りIDEAの設定すればbreakpointで止まるようになります。

f:id:syogo0417:20181129131700p:plain

f:id:syogo0417:20181129131839p:plain

absolute file pathにはさっき作成したシンボリックリンクのパス(/var/www/html)を設定すればOK

参考にしたもの

大変参考になりました。ありがとうございました。

qiita.com