Laravel使った開発にLaradockを使うというのはどうだろう

こんにちは皆さん

dockercon やばかったですね
docker swarm モードの導入が個人的に一番衝撃的でした。
kubernetesみたいな外部ツール使わなければならなかったことが、docker engineでできてしまうという便利感がやばすぎです

そんなわけで、最近Docker使った開発に染まりきってきたところで、Dockerを使用したLaravel開発環境があるというので、早速導入してみたわけです。

# Laravel

最近やたらと人気の出てきたフレームワークです。
私はcodeigniterとかphalconとかは使っていたのですが、あまりlaravelを業務で使うことはありませんでした。
しかし、composerやオートローダを使用した自由な開発ができるフレームワークだし、人気もあるのでさわってみたいなぁとは思っていたのです。

## Homestead?

Homesteadはlaravel開発用の公式なvagrant用のboxです。
php, php-fpm, nginxの標準的なWEBアプリのセットだけでなく、mysql, mariaDB, mongoDBのようなDBから、redisのようなキャッシュ、nodejsまで兼ね備えた、All in Oneの仮想マシンです。
おそらく開発をするだけなら、なんの文句も出ない素晴らしい開発環境なのですが。。。実運用を考えてみた時、おそらくこんなに多機能なサーバを用意することはまず無いです。
AWSやgcpといったモダンなクラウドサービスを使っているのであれば、WEBサーバはWEBサーバの機能だけを持ち、DBもキャッシュもそれ専用のマシンを用意するのが定石です。
つまり、クラウドでの運用環境と開発環境との間に大きな差異が生まれてしまうということです。
この問題は意外に深刻で、開発環境での検証にそれほど信頼性が持てないということになり、「開発環境とは何だったのか」状態になっていました。

## Laradock!!

LaradockはこのHomesteadが抱える問題を解決するために、登場したようです。
LaradockはHomesteadの持っていた機能を、役割ごとに細かく分割し、本番での運用状況に近づけることができます。
今回は、こいつを使ってLaravelの開発環境を構築してしまいましょう

# Laradockを準備する

## 動作環境

本検証はMac OS X 10.11.15 でdocker toolboxを使用しています
docker toolboxにはdocker と docker-composeが同梱されていますので、以降はこれらがあることを前提に述べていきま

## コードを入手する

homesteadはboxイメージまるごとですが、laradockはいくつかのDockerfileとcomposeの設定ファイルだけです。
なので、取得だけなら以下のように瞬時に終わります

```
mkdir laraveltest
cd laraveltest
git clone https://github.com/LaraDock/laradock.git
cd laradock
```

では、laradockディレクトリに入って早速使ってみましょう
## workspaceの起動

laravelのプロジェクトを始めるためにはなにはともあれ初期設定などをこなす必要があります
laravelでの開発を行うためにはどうしてもcomposerやnodeなどのツール類が必要になってきますが、これら必要なツールを一式用意してくれるコンテナイメージがworkspaceです。
早速workspaceを立ち上げてみましょう

```
docker-compose up -d workspace
```
初回起動は非常に時間がかかります
既存のイメージを使用しているわけではなく、その場でDockerfileを使用して生成しているからです
一回作ってしまえば、次からの立ち上げは直ぐなので、我慢しましょう

立ち上がったら、まずコンテナ名を取得します

```
$ docker-compose ps
WARNING: The INSTALL_PRESTISSIMO variable is not set. Defaulting to a blank string.
         Name               Command      State    Ports
-------------------------------------------------------
laradock_application_1   true            Exit 0
laradock_workspace_1     /sbin/my_init   Up
```
現在立ち上がっているコンテナは`laradock_workspace_1`であることがわかるので、

```
$ docker exec -it laradock_workspace_1 /bin/bash
```
これでworkspaceに入れます

workspaceが共有しているディレクトリは`docker-compose.yml`を見ればわかります

```docker-compose.yml

### Laravel Application Code Container ######################

    application:
        build: ./application
        volumes:
            - ../:/var/www/laravel

(中略)

### Workspace Utilities Container ###########################

    workspace:
        build:
            context: ./workspace
            args:
                INSTALL_PRESTISSIMO: ${INSTALL_PRESTISSIMO}
        volumes_from:
            - application
        tty: true
```
これによると、laradockのルートディレクトリの直上のディレクトリが/workspaceの/var/www/laravelとリンクしているようです

気を取り直してworkspace上でlaravelプロジェクトを立ち上げてみましょう
workspaceコンテナ上には、既にcomposerが搭載されているので、/var/www/laravel で

```
composer create-project laravel/laravel testapp
```
これで、laravelのプロジェクトスケルトンが生成されます
## 動作を確認してみる

とりあえず、スケルトンの状態で動かしてみましょう
workspace上ではこんな感じのディレクトリ構成になっています

```
$ ls /var/www/laravel
laradock  testapp
```
testappが先ほど作ったlaravelプロジェクトのスケルトンになります
次に、とりあえずの動作確認をしてみましょう

```
$ exit # workspaceから出る
$ docker-compose stop # 今動いているworkspaceを止める
$ ls ../
laradock	testapp
```
こんな感じでホストPCにもtestappができているので、アプリケーションのデータボリュームを変更します

```
# docker-composer.yml
### Laravel Application Code Container ######################

    application:
        build: ./application
        volumes:
-            - ../:/var/www/laravel
+            - ../testapp:/var/www/laravel

### Databases Data Container ################################
```
次にwebアプリを起動します
webアプリだけであれば、php-fpmとnginxを起動するだけでよいでしょう

```
$ docker-compose up -d php-fpm nginx
```
。。。初回はやはりdocker buildがはしるので、ちょっと我慢して待ちましょう
起動完了したら、ブラウザで192.168.99.100にアクセスしてみます

<img width="798" alt="スクリーンショット 2016-06-30 9.08.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/102182/ca1cdb95-fceb-d6be-a6ee-4ffa734176a3.png">

とりあえず、起動まで確認できました

# まとめ

単純にdocker好きなんで、laravel開発するのもdockerでやりたいなぁとか思っていたのですが、作業環境の容易に結構気を使う必要があったので、このlaradockの存在は有りがたかったです
docker-composeの設定のやり方とか、開発自体以外でも参考になる所も多いので、いいもん見つけたなぁ、ってな感じでした

# 参考
[公式](http://laradock.github.io/laradock/)