LaraDockでLaravel-5-boilerplateを使う


## はじめに


Laravel使った開発にLaradockを使うというのはどうだろう - Qiita
http://qiita.com/niisan-tokyo/items/d4485b8bb4fbfcfcc6be

という記事を読みまして、こんな便利なものがあるのか！と衝撃を受け早速使ってみたものです。

筆者はWindows10のGit Bash上で作業を行っています。
環境によってこの通りにはならない場合もありますので、あらかじめご了承ください。


## docker、docker-machine、docker-composeのインストール、設定

インストールは子細省略。各OSでやり方があるので公式に従ってください。
https://docs.docker.com/compose/install/

インストールが終わったら、docker-composeの起動にはdocker-machineの起動が必要なのでその設定も済ませます。

```sh
docker-machine start
eval $(docker-machine  env)
```

docker-machineで使用するコンテナを指定せずにコマンドを打つと、defaultという名前のコンテナが自動で選択されるので、`docker-machine start default` と打ったのと同等となります。
docker-composeからはこのdefaultが起動元として使用されるようなので、覚えておいて損はないかと。
（`docker-machine start default` で起動したdefaultコンテナ内で `docker-compose up` で起動したdockerコンテナが動作している）


## docker-machineのファイル共有設定

Windowsで、C:\Users以外で作業をしている場合は、ここでファイル共有の設定をしておくと後で楽です。
その他のOSの場合、C:\Usersをそのまま使う方はこの項はすっ飛ばしてOK。

例えば筆者の場合はDドライブを作業場所にしているので、ここを丸ごとマウントしてしまいたいので、まずはVirtualbox（またはVMware）に作成されているdefaultコンテナのファイル共有設定でD:\を/dでアクセスできるように紐付けします。

そしてdefaultコンテナにマウントの設定をします。
対象のファイルは /var/lib/boot2docker/profile です。

`docker-machine ssh` でログインして 下記コマンドでファイルを開かずとも追記が可能です。

```sh
echo 'sudo mkdir -p /d' |sudo tee -a /var/lib/boot2docker/profile
echo 'sudo mount -t vboxsf -o uid=0,gid=0 d /d' |sudo tee -a /var/lib/boot2docker/profile
```

ログアウト後、`docker-machine restart`で再起動ののち再ログインし、`ls -la /d` でDドライブの内容が読めることを確認したらOKです。

（VMwareはvboxsfでは設定できない気がするので違うコマンドが必要かもしれませんそこまでは調べていませんすみません！）


## LaraDockのダウンロード、設置

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

または.gitが不要な場合は、

```sh
mkdir laradock
cd laradock
curl -L -o laradock.tar.gz https://github.com/LaraDock/laradock/archive/master.tar.gz
tar zxvf laradock.tar.gz
mv laradock/laradock-master laradock/laradock
rm laradock.tar.gz
cd laradock
```

一つディレクトリを掘っておくのがポイントです。


## LaraDockを起動

そしておもむろにdocker-compose起動。

```sh
cd laradock
docker-compose up -d nginx mysql
```

nginx、mysqlと関連付けられているdockerコンテナがいくつも起動しますが、すべてDockerfileからイメージが生成されてコンテナが起動されるので、初回起動時はしばらく時間がかかります。
コーヒーやお茶菓子などで一服するか、ちゃちゃっと片付けられる他のお仕事しましょう。


起動が終わったら、実作業用としてworkspaceが用意されているのでそこにログイン。

```sh
docker exec -ti laradock_workspace_1 bash
```

ちなみにこのlaradock_workspace_1というコンテナ名は、先頭のlaradockの部分がディレクトリ名から取られているようなので、ディレクトリ名がlaradockでない場合はその名前になっています。

docker-compose.ymlを見ると一目瞭然ですが、nginxもphp-fpmもworkspaceもapplicationのボリュームを参照しています。
workspaceの/var/www/laravel内のファイル更新はnginxにもphp-fpmにも反映されるので便利。

tty modeがどうたらでログインできない場合は、docker-machineにsshログインして、そっちからログイン。

```sh
docker-machine ssh
docker exec -ti laradock_workspace_1 bash
```


## laravel-5-boilerplateのインストール、前準備

ログイン出来たら、workspaceにはcomposerもnpmも既に入っているので、開発環境の構築は不要です。素敵！超便利！
ログイン直後で既に/var/www/laravelディレクトリにいるので、
そのままlaravel-5-boilerplateをダウンロード。

```sh
git clone https://github.com/rappasoft/laravel-5-boilerplate
```

または.gitディレクトリが不要な場合は、

```sh
curl -L -o l5b.tar.gz https://github.com/rappasoft/laravel-5-boilerplate/archive/master.tar.gz
tar zxvf l5b.tar.gz
mv laravel-5-boilerplate-master laravel-5-boilerplate
rm l5b.tar.gz
```

ここで最初にディレクトリを一つ掘っておいたのが活きてきます。
nginxの設定が、ドメイン直下がdocument root直下にくるようになっており、document rootの下層ディレクトリに展開したのでパスがズレています。
いったんログアウトして、docker-compose.ymlの設定を変更。

```yml:docker-compose.yml
    application:
        build: ./application
        volumes:
            - ../laravel-5-boilerplate:/var/www/laravel
```

設定を適用させるため、docker-composeを再起動。

```sh
docker-compose restart
```

再度workspaceにログインしなおし、laravel-5-boilerplateセットアップの続き。

```sh
docker exec -ti laradock_workspace_1 bash
```

ログイン後のパスは/var/www/laravelで同じですが、`ls -la` で見てみると、先ほどDLしたlaravel-5-boilerpateのファイル達がdocument rootにきています。

ホストOS側でも、laradock/laradockと並んでlaradock/laravel-5-boilerplateが出来ているのが確認できると思います。


## laravel-5-boilerplateのセットアップ

ここからは通常のlaravel-5-boilerplateのセットアップフローに沿っていけばOK。

https://github.com/rappasoft/laravel-5-boilerplate/wiki/1.-Installation

```sh
compose install
npm instlal
```

Windowsで作業を行っていて、npm installでsymlinksエラーが出た場合は、

```sh
npm install --no-bin-links
```

でsymlinksは不使用であることを明示するとうまくいく。

次に.envの内容を編集。

```sh
cp .env.example .env
```

して、ホストOSで.envを変更します。
dockerネットワークはIPアドレスが自動割り振りなので、MySQLサーバにはIPアドレスは書かず、dockerイメージ名を書けば繋がります。（laradock_mysql_1 など）

DBユーザーやパスワードはdocker-compose.ymlにあるものが使えます。
APP_KEYをオリジナルのものに変更するのをお忘れなく！

.envを書き換え終わったら、

```sh
php artisan key:generate
php artisan migrate
```

database/seeds/Access/UserTableSeeder.phpにユーザーテーブルの初期設定定義があるので、
AdminとDefault Userをお好みで編集。このままで良ければ触らず次へ行って大丈夫です。

```sh
php artisan db:seed
```

で一通り完了。

ホストOSから http://192.168.99.100 にアクセスすれば、laravel-5-boilerplateが稼働しているのが確認できます。と思います。
お疲れ様でした！



## 参考文献

Laravel使った開発にLaradockを使うというのはどうだろう - Qiita
http://qiita.com/niisan-tokyo/items/d4485b8bb4fbfcfcc6be

Docker MachineでDドライブなどUsers以外を自動マウントする - Qiita
http://qiita.com/Bakudankun/items/d612865440565b10523f

Dockerにホストのフォルダをマウントしたい！ - Qiita
http://qiita.com/dojineko/items/f623894ef2436bef890e

npm install でエラーが出たときの対応 - 蒼の王座・裏口
http://sqlazure.jp/r/%E6%9C%AA%E5%88%86%E9%A1%9E/755/

どれも大変分かりやすく非常に参考になりました。ありがとうございます！





## 追記

ホストOSがWindowsだからの可能性がありますが、何度もgulpすると2回目以降などで`text file is busy.` でgulpが失敗するケースが出るようになりました。graceful-fsのバージョンが低いという警告がずっと出ていたのでこれを修正したら直りました。

修正前

```Dockerfile:laradock/workspace/Dockerfile
80行目
# Install stable node
RUN . ~/.nvm/nvm.sh \
    && nvm install stable \
    && nvm use stable \
    && nvm alias stable \
    && npm install -g gulp bower
```

修正後

```Dockerfile:laradock/workspace/Dockerfile
80行目
# Install stable node
RUN . ~/.nvm/nvm.sh \
    && nvm install stable \
    && nvm use stable \
    && nvm alias stable \
    && npm install -g graceful-fs \
    && npm install -g gulp \
    && npm install -g bower
```

`npm install -g graceful-fs gulp bower` と一コマンドに併記するのと、npm内部でどう変わるのかがイマイチ不明ですがその書き方だとダメで、`npm install -g xxx`の行を分割したうえでgraceful-fsを入れるようにすると失敗しなくなりました。

dockerコンテナが起動中の場合は一旦落として、dockerイメージをビルドし直し、再起動すると適用されます。

```
docker-compose down
docker-compose build workspace
docker-compose up -d nginx mysql
```