Laradockでの環境構築方法２パターンを細かめに説明

社内でLaravelを使う上で、今までHomesteadを使っていたのですが、デプロイも楽にしたい、Docker触りたいっていう単純な気持ちでLaradockに手を出してみました。
個人で色々調べて手順をまとめたので、記事にしてみます。
自分が書いた社内Docker初心者向け手順書を元に書いたので、ちょっと細かめですがご了承下さい。

#Laradockとは？
http://laradock.io/
Dockerを用いてlaravelの環境を作るために必要なものがほぼ全てパッケージ化されているものです。
vagrantでいうHomesteadのようなものですね。Symfony、CodeIgniterとかも普通に使えるらしいです。
Vue等も最初から使えたり、Dockerなのでimageをそのままデプロイしたりもできるので僕はHomesteadよりこっちが好きです。
また、Dockerfileやcomposeの書き方も完成度が高いと思う（僕が初心者だからかもですが）ので、非常に参考になります！
なのでこれからDockerを学ぼうとしてる人、Dockerでの開発環境を作ってみたいって方も一度見てみるのもいいかもしれません。

#Laradockの仮想環境でのフォルダ構造２パターン
Laradockはcloneした時に作られるlaradock フォルダをどこに置くかによって、仮想環境のフォルダ構造を変えることができます。
これはlaradockのマウント設定が以下のように、ホスト側での.envがある一つ上、つまりlaradock フォルダと同じ階層を、仮想側の/var/www/の下とリンクさせる様に設定されているからです。

```docker-compose.yml
volumes:
- ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}
```

```:.env
APP_CODE_PATH_HOST=../
APP_CODE_PATH_CONTAINER=/var/www:cached
```
なのでlaradockフォルダの置き方で以下の２パターンを作ることができます。
#####開発用のプロジェクト共有フォルダ
```
-プロジェクト管理フォルダ
    -laradock
    -projectA
    -projectB
```
とすれば、仮想環境では

```
$ ls /var/www/ 
laradock projectA projectB
```

#####１つのプロジェクトのみの動作環境

```
-projectA
    -app
    -bootstrap
    -その他色々
    -laradock
```
とすれば、仮想環境では

```
$ ls /var/www/
app bootstrap config ~~  laradock
```
開発環境やデプロイ環境に合わせて簡単に切り替えられます。
ただ所々必要な手順があるので、今回はそれをまとめてみました。

#今回構築する環境
PHPはとりあえず最新のを使います。
MySQLは5.7に指定。AWSのRDSでのMySQLも5.7が最新だったと思うので、まだこちらが一般的な気がします。
(2018年8月時点)

#①開発用の共有フォルダ作成手順
###1, プロジェクト管理フォルダ内でlaradockをclone

```
$ git clone https://github.com/Laradock/laradock.git
``` 
###2, laradockフォルダ内に移動してenvファイルをコピー

```
$ cd laradock
$ cp env-example .env
```

###3, .envファイルを開いてMySQLのバージョンを変更。その他DBパスワードやPHPバージョン等もここで変更可能


```
MYSQL_VERSION=5.7
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
```
###4, MySQLの設定

```
#DB作成用ファイルの編集
$ cd mysql/docker-entrypoint-initdb.d
$ cp createdb.sql.example createdb.sql(初回のみ)
$ vi createdb.sql

CREATE DATABASE IF NOT EXISTS `myapp` COLLATE 'utf8_general_ci' ; 　#コメントアウトを外し、DB_DATABASE名を記入
GRANT ALL ON `myapp`.* TO 'root'@'%' ;　　　　　　　　　　　　　　                     　　#コメントアウトを外し、DB_DATABASE、DB_USERを記入

#２つ目以降のDB作成は上の２行を書き足せばOK

$ cd ..
$ vi my.cnf

#最下行に以下を追記
+ explicit_defaults_for_timestamp = true
```
###5, コンテナを走らせる(初回は結構時間かかります)
laradockフォルダ直下へ移動し、以下のコマンドを実行

```
$ docker-compose up -d nginx mysql (phpmyadmin redis) //()内は使う予定があれば必要に応じて、初回はいらないかと
```
###6, DB作成
DBを作成するには、mysqlのコンテナに入りcreatedb.sqlを実行する。
以降、DBを追加する場合はcreatedb.sqlに追記し、下記のコマンドを実行すればOK

```
$ docker-compose exec mysql bash
$ mysql -u root -p < /docker-entrypoint-initdb.d/createdb.sql
mysqlコンテナから出る
$ exit
```

###7, workspaceコンテナに入り、プロジェクト作成

```
$ docker-compose exec workspace bash
#デフォルトで/var/wwwにいるはずなので、lsで内容を確認
$ ls
laradock その他フォルダにあるもの
$ composer create-project --prefer-dist laravel/laravel myapp
```

###8, プロジェクトの.envファイル編集

```
$ cd myapp
$ vi .env
DB_HOST=mysql
DB_DATABASE=myapp
DB_USER=root
```

###9, DB接続を確認

```
php artisan migrate
```

###10, HOST側に戻りnginxの設定

```
$ exit
$ cd nginx/sites
$ cp laravel.conf.example myapp.conf
$ vi myapp.conf
- server_name laravel.test;
+ server_name myapp;
- root /var/www/laravel/public;
+ root /var/www/myapp/public;
```

###11, hostsファイルの編集
laradockフォルダ内に移動し

```
$ docker-machine ip
```
とすると、192.168.99.100あるいは何もないとエラー文がでる（その他もあるかも？）

```:hosts
docker-machine ipで192.168.99.100の場合
+ 192.168.99.100 myapp
エラー文の場合
+ 127.0.0.1 myapp
```
###12, コンテナを再起動する

```
$ docker-compose restart
```
http://myapp/ にアクセスしてLaravelの文字が出たらOK

#②１つのプロジェクトのみの動作環境作成手順
手順はこちらの方が少ないです。hostsとかnginxの設定がいらないので。①とかぶる内容も多数。
また、こちらの場合は既にプロジェクトがある前提です。

###1, プロジェクトフォルダ直下へ移動し、laradockをclone

```
$ cd myapp
$ git clone https://github.com/Laradock/laradock.git
```
###2, laradockフォルダ内に移動してenvファイルをコピー

```
$ cd laradock
$ cp env-example .env
```

###3, .envファイルを編集
ここでいくつか①の構築と違う点があります。
まず、プロジェクトでDBがひとつの場合はMYSQL_DATABASEで設定できます。
DBデータの中身はDATA_PATH_HOSTの場所に格納されます。
デフォルトだとホームディレクトリに作るため、複数のプロジェクトで同じ場所を指定することになります。
エラーなどの原因となるので、プロジェクトごとのlaradock/dataというフォルダに格納するよう設定します。
①ではそのままホームディレクトリに作ってますが、これも気になる人は変えても大丈夫です。

```
- DATA_PATH_HOST=~/.laradock/data 
+ DATA_PATH_HOST=./data

MYSQL_VERSION=5.7
MYSQL_DATABASE=myapp
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
```
###4, MySQLの設定
DBがひとつだけでenvに書いたならmy.cnfの設定だけでOK

```
#DB作成用ファイルの編集
$ cd mysql/docker-entrypoint-initdb.d
$ cp createdb.sql.example createdb.sql(初回のみ)
$ vi createdb.sql

CREATE DATABASE IF NOT EXISTS `myapp` COLLATE 'utf8_general_ci' ; 　#コメントアウトを外し、DB_DATABASE名を記入
GRANT ALL ON `myapp`.* TO 'root'@'%' ;　　　　　　　　　　　　　　                     　　#コメントアウトを外し、DB_DATABASE、DB_USERを記入

#２つ目以降のDB作成は上の２行を書き足せばOK

$ cd ..
$ vi my.cnf

#最下行に以下を追記
+ explicit_defaults_for_timestamp = true
```


###5, コンテナを走らせる(初回は結構時間かかります)
laradockフォルダ直下へ移動し、以下のコマンドを実行

```
$ docker-compose up -d nginx mysql (phpmyadmin redis) 
```
###6, DB作成（DB1つの場合はスキップ可）
DBを作成するには、mysqlのコンテナに入りcreatedb.sqlを実行する。
以降、DBを追加する場合はcreatedb.sqlに追記し、下記のコマンドを実行すればOK

```
$ docker-compose exec mysql bash
$ mysql -u root -p < /docker-entrypoint-initdb.d/createdb.sql
mysqlコンテナから出る
$ exit
```

###7, プロジェクトの.envファイル編集

```
$ cd myapp
$ vi .env
DB_HOST=mysql
DB_DATABASE=myapp
DB_USER=root
```

###8, workspaceに入り、DB接続の確認

```
$ docker-compose exec workspace bash
$ ls /var/www/
app bootstrap config ~~  laradock
$ php artisan migrate
```
laradock直下へ移動し、docker-machine ipコマンドを実行。
結果先にアクセス（エラーの場合はlocalhost）

---
以上、長くなりましたが、少しでもお役に立てれば幸いです。

##参考
http://laradock.io/#Usage
https://github.com/laradock/laradock/issues/977