Laradockを使ってLaravel環境を5分で構築する(つもりが若干躓いた)

# はじめに
Laradockという、Dockerコンテナ上でLaravelを動作させることができる素敵なプロジェクトがあるとのことで、早速試してみた。よくある事だが、ドキュメントでいかにも簡単そうに手順が書かれていても、実際はつまづきポイントが潜んでいて、今回も少し立ち止まったので、そこも含めた手順になります。

# 環境
* 2018/06/10 現在
* Docker for mac 18.03.1-ce
* Laravel v5.6.*
* Laradock v7.2.0
* nginx

# 公式ドキュメント
http://laradock.io/introduction/
まずはこのイントロダクションに沿って進めてみる。

# 手順
## git clone

```bash
$ cd /YOUR/PROJECT/PATH
$ git clone https://github.com/Laradock/laradock.git
$ ls -lah
laradock
```
本記事と同じバージョンにする場合は `-b v7.2.0` を指定してください。
未指定で最新。

## `.env` の作成

環境変数がまとめられているファイルをコピーして作成

```bash
cd /YOUR/PROJECT/PATH/laradock
cp env-example .env
```
あとでもう一度編集しますが取り急ぎポートを変えて置きます。
**ドキュメントには載っていないですが、80だとmacのApacheが利用するポートと被りエラーになることがあるので8888に変えて置きます**

```bash

$ vi .env

### NGINX #################################################

NGINX_HOST_HTTP_PORT=8888 // 80 → 8888(まぁ何でもいい)
```

# コンテナ作成

起動したいサービスを指定してupします
(サービスというのは `docker-compose.yml` の各項目の値)

```bash
$ cd /YOUR/PROJECT/PATH/laradock
$ docker-compose up -d nginx mysql phpmyadmin redis workspace
// ・・・しばしご歓談・・・

// コンテナの起動を確認
$ docker ps --format "table {{.ID}} {{.Names}}"
    CONTAINER ID NAMES
    27f1a9cbf5a2 laradock_nginx_1
    dff26644e009 laradock_php-fpm_1
    04100991a64a laradock_phpmyadmin_1
    430d25cd8b16 laradock_workspace_1
    d53e9263b730 laradock_mysql_1
    311721d412de laradock_docker-in-docker_1
    568796ee3551 laradock_redis_1
```

# Laravel本体のダウンロード
本体はcomposerを利用して入手します。
composerや必要なライブラリがそろった `workspace` コンテナにて行います。

```
$ docker exec -it laradock_workspace_1 bash

// コンテナにて
# cd /var/www
# composer create-project laravel/laravel my-cool-app "5.6.*"
# ls
laradock  my-cool-app
```

`docker-compose.yml`でvolumesが `../:/var/www`の状態でコンテナを生成したので
`/YOUR/PROJECT/PATH/laradock/../`がコンテナの`/var/www`にマウントされ、
ローカルからでも本体が確認出来ます。

```
// ローカルにて
$ cd /YOUR/PROJECT/PATH
$ ls
laradock  my-cool-app
```

# .env にLaravelのパスを設定
```
$ vi .env
APP_CODE_PATH_HOST=../
↓
APP_CODE_PATH_HOST=../my-cool-app/

// コンテナ更新
$ docker-compose up -d nginx mysql phpmyadmin redis workspace

// マウントされているパスが変わっているのが分かる
$ docker exec -it laradock_workspace_1 bash

# cd /var/www && ls
app        composer.json  database      public     routes      tests
artisan    composer.lock  package.json  readme.md  server.php  vendor
bootstrap  config         phpunit.xml   resources  storage     webpack.mix.js
```
# ブラウザで確認
```
http://localhost:8888/
```
ッターーーーン

<img width="709" alt="screenshot2.png" src="https://qiita-image-store.s3.amazonaws.com/0/87716/70fa23bc-1af7-61b9-7d88-6ee4d2c360db.png">

# localhost以外のドメインを設定してみる
先ほどでウェルカム画面は見れたのですが、試しにドメインを `http://my-cool-app.test:8888`に変えてみます。

```
// ローカルにて
$ cd /YOUR/PROJECT/PATH/laradock/nginx/sites
$ cp default.conf my-cool-app.conf
vi my-cool-app.conf

server_name my-cool-app.test; //ここだけ変更

$ sudo vi /etc/hosts
// 追記する
127.0.0.1   my-cool-app.test
```

**このときドメインは〇〇.devは避けたほうが良いです。**
(Chromeで`.dev`ドメインがHTTPSにリダイレクトされてしまう)

# 注意点

## .envのportの変更
80でdocker-compose upするとnginxコンテナが起動せず以下のようなエラーが出ることがあります。

```
Starting laradock_nginx_1 ... error

ERROR: for laradock_nginx_1  Cannot start service nginx: driver failed programming external connectivity on endpoint laradock_nginx_1 (779ebdcb60c4eb4d4e2688df7076747a12b54e2770016a280723a506fb82f656): Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE)

ERROR: for nginx  Cannot start service nginx: driver failed programming external connectivity on endpoint laradock_nginx_1 (779ebdcb60c4eb4d4e2688df7076747a12b54e2770016a280723a506fb82f656): Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE)
ERROR: Encountered errors while bringing up the project.
```

原因はmacのApacheやculpritというプロセスが80ポートを使ってたからでした。
(最初何も考えずに進めてエラーになった)

[ERROR: for nginx Cannot start service nginx](https://github.com/laradock/laradock/issues/251#issuecomment-243901283)
というISSUEを見て解決しました。

# 〇〇.dev ドメインを使わない
理由は[Chromeだと.devが強制的にHTTPSになってしまうから](https://laravel-news.com/chrome-63-now-forces-dev-domains-https)で、代わりに
`“.localhost”, “.invalid”, “.test”, or “.example”.`あたりを使うように言われていました。

# 変更が反映されない
もし`up`したのに設定がコンテナに反映されてない疑惑があれば、以下の様にキャッシュなしで再ビルドを試してみると良いかもしれません。

```
$ docker-compose build --no-cache nginx 
```