最強のローカルPHP環境制作に向けて

# 最強の環境を作りたい。

最強の環境を作るために試したこと、気になるもの全てまとめます。

試したことについては良かったとこ悪かったとこ交えながら話します。

試して欲しいことやこうしたらいいよというものがあればコメントお願いします。

まず、目標です。

##目標

・とりあえず軽い、早い。
・Xdebugが動く。
・各種settingをいじれる。
・BaserCMS(CakePHP)が動く。
・環境構築が素早くできる。


# 今まで試したこと

## その1 macデフォルト

「デフォルトこそ至高」

でももちろん他の人と環境を共有することの難しさ、ローカルのファイルの散らばり具合がとんでもないですね。
実は最初からほとんどMAMPを使っていたので触れたのは少しです。

## その2 MAMP

「原点にして頂点」

installさえしてしまえば条件はほとんど満たせます。
使った期間は一番多いかもしれません。
**installさえしまえば**ですね。MAMPって1G以上あるのでダウンロードする時間がとんでもないんですよね。

## その3 Docker for Mac

「環境構築はコマンド一つで」

環境構築といえばDockerですかね。
ローカルのマシンを汚さずに済み、チームと共有するのはファイル一つ、コマンド一つで環境を作れます。
ただDockerはもともとlinuxの技術で作られているため(詳しくは知らないんでごまかしてます)macと少し相性が悪く、
ファイルのioがくそ遅いんですよ。
ロードに時間がかかってほんと辛いです。

## その4 Docker-sync

「自動で更新されないなら更新させればいいじゃない」

開発者がgithubで毒舌であることで話題のDocker-sync。
issueで普通に「issue投げる前にgoogle使おうね」とかいって👎めっちゃくらってますw
Docker-syncはvolumeの共有を
mac<->webコンテナ
ではなく
mac<->syncコンテナ<->webコンテナ
としてsyncコンテナに監視させることでwebコンテナからのioを早くしましょうよ。というものです。
こいつにはとてもお世話になったんですが、欠点としてまずコンテナが一つ多く立つことによりメモリが消費されます。
低スペックには辛いものです。。。。

## その5 Docker on Vagrant VM

「Docker用のosがあるらしい」

Docker-sync飽きてきたなーとか思ってた時に出てきた新規ワードでした。
もともとVagrant自体は触ったことあったのですが、その時はWindows上にUbuntuを起動するまでで終わってました。
最近になって、Vagrantで使えるlinuxのディストリビューションの中に「Barge」という、Dockerを構築するためだけの
osがあったんです。
installしてみるとdockerは使えるのにvimすら入ってない。
これは軽いだろと思い構築しました、この辺からとにかく軽い物を目指し始めました。
ただ、vagrant上のdockerって、**xdebug起動するととにかく遅い**んですよ。
そりゃそうですね、
docker<->ホストより
docker<->vagrantVM<->ホスト
の方が明らかに遅いですよね。
ここはめっちゃ悩んでます。

## その6 dockerのimageをalpineで作り替える

「余計な物は必要ない」

docker for macを使い始めた時、公式のイメージをいじって環境を作っていたのですが、公式のイメージはdebianベースで作られています。
debianもサーバー用のディストリビューションで、なかなか軽量のものになっているのですが、linuxにはさらに軽量なalpineというものがあります。
alpineのいいところはもうとにかく軽い。ディスクイメージは5MBです！さらに必要なphpの要素は大体パッケージ化されてあるので、わざわざxdebug等をmakeする必要がないんです。結果ビルドがくっそ早い。
そして同じような構成で公式から作ったイメージは600MBくらいあるのですが、できたのは220MB。ヤバイ。
さらにopcacheも入れちゃって。opcacheをdebianに入れて試してないので比較はしてませんが、ここまですると流石に動作は早くなりました。
**ただxdebugがおっそい！！！**


# まだやったことなくて期待してるもの

今のところ私が試したものは上に書いた通りです。いかに気になってはいるもののまだ実行に写せてないものを上げていきます。

## その7 lamp in one container

「コンテナ分ける必要なくないか？」

環境を新しくする上で、ネットでいろんな物を探したところ、ある物を見つけました。
lampのDockerfileです。ふつう、コンテナというものは1コンテナ1サービスということで、データベースとwebのコンテナは分ける物です。
でも待てよ。。。LAMPを1サービスとして捉えればこれは１コンテナに収まる物では・・・？？
利点としてはデータベースを指定する時にわざわざホスト名をmysqlとかにしなくてそのままlocalhostでできたりとかですかね。
他には単純にコンテナ数が減るのでマシンのリソース使わずに済むのでは？とか考えてまだやってません。


## その8 docker in docker

「dockerコンテナ内でdockerコンテナ、建てれます。」

これは聞いたことあるだけで全く知らないので調べました。
するとどうやらテストとかのために使用したいみたいな感じなんですね。
dockerコンテナ上でjenkins等のテスト環境を構築する際に使用したかったりするからだそうです。
例えばその4のパターン(docker on vagrantVM)だとVM上のデーモンを参照するため、ローカルマシンから`docker ps`できません。たまにコンテナの中に入って処理したい場合(適当なPHPのスクリプト動かしたい時とか)にわざわざ`vagrant ssh`した後に`docker exec -it web bash`ってするのめんどいです。
docker in dockerには二つ種類があって、その中にmacのdockerデーモンを利用する物があります。
それだとコンテナ入りやすくなったりxdebug早く動くんじゃねえかな？後volumeどうなるんだろ、、、って感じですね。


## その9 docker for mac + mutegan

「https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484」

すみません。全くの初見の言葉だったので代名詞はリンクそのまま貼らせてもらいましたw
私はあまり感じたことはなかったのですが、現状のVMのファイルマウントでも少し遅いようです。
記事内ではvagrantのVM上にこれを使うことで「ネイティブと同じ速度」を感じられているようです。
でもdocker-syncを使っていた私からするとまた同じような物か、と考えてしまいました。
結局ローカルのマシンに別のソフトをinstallすることになり、dockerの思想から離れたものになるかと思います。
これについては暇な時にやりますね。

## その10 Vagrant + Chef

「サーバー構築はレシピで自動化」

Chefとは料理長のことですね。サーバーの設定一覧をcookbookと言うらしいです。fuelPHPみたいに出てくる単語が統一されているものはとても好きです。cakePHPのbake的な。
要はvagrantでローカル環境は汚さなくなってるのだからわざわざdockerを使う必要はないのでは？ということです。結構昔の技術らしいですね。
私の考えではdockerが重いのならわざわざ使う必要ないし、コマンド一つ(`vagrant up`)でいけてくれるなら別にいいというのと、デフォルトの興味があるのでやってみたさはありますね、チューニング死骸もありそうですし。
vagrantfile一つ配っとけばあとは勝手に設定してくれるのなら最高なのでは？
問題はxdebugの速度ですね。今一番の悩みです。


# 今のところのまとめ

現状では上記のように、まだ未調査の技術はあるという感じですね。
他にもxdebugのチューニング等やりたいことはあります。
気になっている順番としては
1 lamp in one container
2 docker in docker
3 vagrant + chef
ってとこですかね。
最強のローカル環境目指して今後も頑張りたいと思いますのでよろしくお願いします。
何かいい案があればコメントお願いしたいです！
それでは。