Laradock on macでLaravelの開発環境をサクッと整備

# 事前情報

ざっと、ネットで拾った以下のあたりに目を通して、とりあえず、手を動かしてみる。

- [laradockで簡単laravel環境構築 - Qiita](http://qiita.com/tenko/items/73227ccc057d65eac9c5)
- [Laravel開発環境をLaradockで構築する ｜ Tips Note by TAM](https://www.tam-tam.co.jp/tipsnote/program/post11885.html)
- [Laravel : laradockでlaravelの開発環境構築 | DN-Web64](http://www.dn-web64.com/archives/web/laradock_laravel/)
- [Docker for Macを使ってサクッとLaravel環境を構築する - TERAKOYA](https://terakoya.site/web/docker-mac-php-laravel5-setup/)
- [Laradock で PHP フレームワーク Laravel 5.4 をインストールする – ウェブ小ネタ帳](http://web.konetacho.com/post/136.html)

# 事前準備
## Dockerインストール
Docker for Macを入れたつもりでいたけれど、アプリケーションのディレクトリに入れただけで、一度も起動していなかった。
Orz

ので、アプリを起動して、必要なコマンドなどをインストール。
ダイアログに従って、ただただ進めるだけで良いため、詳細は割愛。

# Laradocセットアップ
## セットアップ時の留意点
全体の流れとしては、Laradockをgit cloneしてきて、必要な初期設定をして、composerでLaravelのプロジェクトを配置すれば、とりあえず、デモ画面までは、サクサクっと表示できる。

ポイントは、以下のあたり。

- 初期設定に関しては、.envファイルを作成して編集が必要
- ローカルマシンとのディレクトリ共有の指定方法
- 各ミドルウェアのポートのバッティングに留意
- nginxの設定と、名前解決

.envファイルの作成については、割愛しているページも多かったので、要注意！

Laradocのルートディレクトリにenv-exampleというファイルが転がっているので、それを複製し、.envファイルを作成する。

.envファイルには、各ミドルウェアの起動するポートや、ソース(アプリケーション)の配置箇所を設定する。

ソース(アプリケーション)の配置箇所は、最終的に、Dockerのインスタンスが参照するローカル側のディレクトリとなるため、そのあたりの設定の整合性をちゃんと取った上で設定する必要がある。

Docker側と、ローカルのディレクトリのマッピングは、.envファイルと同階層に配置されているdocker-compose.ymlに記載されている。

あと、nginxについては、.confファイルを追加して、/etc/hostsにlocalhostの127.0.0.1と適当な名前解決用の文字列を設定して、その文字列でアクセスできるようにしておく。

上記を踏まえ、実際に叩いたコマンドや設定した内容が以下。

## Laradocのダウンロードと、各種設定
```bash
# 任意のディレクトリに移動して、Laradockを配置
git clone https://github.com/LaraDock/laradock.git
# 2017-07-14時点でmasterだと対応しているMySQLが8.0になっていて後続の作業がうまくいないないので、v5.5.1でタグを指定してcloneするのが良い
git clone --depth=1 -b v5.5.1 https://github.com/LaraDock/laradock.git

# 直下にDockerのファイル群が配置されているディレクトリが作成されるので、移動
cd laradock

# サンプルの.envファイルを複製
cp env-example .env
```

Laradockのディレクトリで、`vi .env`して以下のあたりを適当に編集

```ini:$LARADOCK_ROOT/.env
# ローカル側でソースorアプリを配置している場所
# .envが配置されている場所からの相対パスで指定できる
# docker-composer.ymlで、Docker側の/var/wwwとマッピングさせているので、そのあたりの整合性に注意して設定する
APPLICATION=../laravel

# 複数のLaradockを用途毎に使い分けているので、データファイルはそれぞれで設定
DATA_SAVE_PATH=.laradock/data

# 追記: Aug. 27, 2017
# 開発でデバッグをするために、Xdebugを有効化
WORKSPACE_INSTALL_XDEBUG=true
PHP_FPM_INSTALL_XDEBUG=true

# nginxが起動するポート
# ローカルのブラウザから参照する場合に、http://localhost:8080/のように指定するポートのこと
NGINX_HOST_HTTP_PORT=8080

# MySQLの設定
MYSQL_DATABASE=laradock
MYSQL_USER=laradock
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
```

MySQLの設定は、Laravelのアプリを開発する時に必要になるので、設定内容は把握しておくべし。

他、必要に応じて、`vi docker-composer.yml`も確認して必要に応じて編集する。

多くの場合、`.env`だけで対応できるはずだが、留意点としては、ローカル側とDockerコンテナ側のディレクトリのマッピング部分で、これは、次項のnginxのサイトの設定とも関係するので、内容は把握しておく。

```yml:$LARADOCK_ROOT/docker-composer.yml
applications:
  image: tianon/true
  volumes:
    - ${APPLICATION}:/var/www/laravel
```

nginxの設定も追加でしておくと、後々の勝手がいいはず。

```yaml:$LARADOCK_ROOT/nginx/sites/
# nginxの設定ファイルが配置されているディレクトリに移動
cd ./nginx/sites/

# サンプルの設定ファイルを複製
cp project-1.conf.example laravel.conf
```

上記で複製したサイトごとの設定ファイルを任意で編集。
`vi laravel.conf`

```nginx:$LARADOCK_ROOT/nginx/sites/laravel.conf
server_name laravel.study;
root /var/www/laravel/public;
```

編集する箇所は、公開するディレクトリ`root`の設定と、接続する時の名前`server_name`あたりで良い。そのほかは、PHPやLaravel用の設定が既に記述済みなので特に編集の必要なし。


*追記: Aug. 27, 2017*
もう一つが、デバッグ環境のXdebugの設定で、対象ファイルは2つ。

- $LARADOCK_ROOT/php-fpm/xdebug.ini
- $LARADOCK_ROOT/workspace/xdebug.ini

```$LARADOCK_ROOT/*/xdebug.ini
xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.remote_connect_back=0
xdebug.cli_color=1
```

Macの場合は、xdebug.iniに対する上記の編集に加えて以下も必要。

```$LARADOCK_ROOT/*/xdebug.ini
xdebug.remote_host=docker.for.mac.localhost
```

## ローカル側の設定
Laradocのnginxに記述した`server_name`で名前解決できるようにローカルのファイルを編集。
`sudo vi /etc/hosts`

```text:/etc/hosts
127.0.0.1 laravel.study
```

laravel.studyでブラウザでアクセスするように記述したので、それで名前解決ができるように設定。

# Dockerコンテナの起動とLaravelインストール

流れは以下のような感じ

1. 初期設定用のworkspaceのDockerコンテナを起動して
2. Dockerのコンテナに入り
3. Laravelをインストール／プロジェクトを作成して
4. workspaceのDockerコンテナを停止して
5. nginxやMySQLのDockerコンテナを起動
6. ブラウザでLaravelのデモ画面を表示する

```bash
# Laradockのルートディレクトに移動
cd laradock

# 初期設定用のworkspaceのDockerコンテナを起動
# 初回は、10〜15分くらいかかる
docker-compose up -d workspace

# 起動したコンテナ名を確認
docker-compose ps

# 初期では、workspaceとapplicationくらいしか出てこないはず
# ここに書くため、事後にキャプったため、初期のタイミングでは出てこないmysqlやnginxまで一覧い出力されている
         Name                        Command              State           Ports         
---------------------------------------------------------------------------------------
laradock_applications_1   /true                           Exit 0                        
laradock_mysql_1          docker-entrypoint.sh mysqld     Exit 0                        
laradock_nginx_1          nginx                           Exit 0                        
laradock_php-fpm_1        docker-php-entrypoint php-fpm   Exit 0                        
laradock_workspace_1      /sbin/my_init                   Up       0.0.0.0:2222->22/tcp 

# コンテナに入る
docker-compose exec workspace bash

# Laravelのプロジェクトを配置するディレクトリに移動
cd /var/www

# Laravelのプロジェクトを配置(Laravelをダウンロード)
composer create-project laravel/laravel laravel --prefer-dist

# コンテナから出る
exit

# コンテナを停止
docker-compose stop

# nginxとmysqlのコンテナを起動
docker-compose up -d nginx mysql
```

もし、初回の`docker-compose up`をした後に、再度、設定をし直して、それを反映したい場合は、以下のどちらかで再構築する必要がある。

```bash
docker-compose build nginx mysql
```

起動と同時に再構築する場合は、以下のように指定する。

```bash
docker-compose up -d --build nginx mysql
```

ブラウザで以下にアクセスして、デモページが見られればOK
http://laravel.study:8080/