Laradockにて複数プロジェクトを並行して開発する方法 ※正攻法ではない

#背景
チームで開発しているプロダクトとは別にLaravelにて個人的なプロダクトを作れる開発環境が欲しく、[こちら](https://pensuke.work/posts/laradock-multiproject/)の記事を参考にLaradockで複数プロジェクトを準備しようと思いましたが、Laravelに変更を加えてもNginxにキャッシュが残ってしまい、変更を加えるたびにNginxを再起動しなければならない状況を打破できなかった。
そのため、邪道であることは承知しているが、Laradockで複数プロジェクトを並行して開発する方法を備忘録として記事にします。

#対象読者・想定レベル

- 上記のリンクの方法ではLaradockで複数プロジェクト作れなかった。
- Dockerの基礎的なコマンドは使用したことがある。
- Docker Desktop for Mac or Windowsを使用している。（Docker Toolboxは分からないです）
- Laravelの開発環境を簡単に用意したい。

#全体のゴール
以下のようなディレクトリ構成で運用できるようになる。

```
Laradockの開発フォルダ
  ├── project1
  |       ├── laradock
  |       └── src
  ├── project2
  |       ├── laradock
  |       └── src
  └── project3
  |       ├── laradock
  |       └── src
  以下同様に続く
```
プロジェクトの切り替えはURLによって、ではなく、作業停止するコンテナの停止→これから作業する別プロジェクトのコンテナ起動によって切り替える。

#第１段階：まっさらな状態からLaradockの開発環境を1つ用意する
[こちら](https://qiita.com/okita_kamegoro/items/3278d62dd0174960b7f7)と[公式ドキュメント](https://laradock.io/getting-started/)を参照して書いたので、適度に端折ってます。詳しく知りたい方はリンクを御覧ください。

###第１段階のゴール

以下のようなディレクトリ構成でLaravelデフォルトのDB作るところまで

```
Laradockの開発フォルダ
  └── project1
          ├── laradock
          └── src
```

###Laradockの用意
```
# project1ディレクトリの中でLaradockのインストール
$ git clone https://github.com/Laradock/laradock.git

# Laravelの格納場所を用意
$ mkdir src
```

###Laradockの設定ファイルを用意
```
$ cd laradock
$ cp env-example .env
```

###.envファイルを編集
```
# Laravel自体のソースコード(srcディレクトリ) とパスを一致させます。
(記事投稿時点で8行目) APP_CODE_PATH_HOST=../src/

# プロジェクトのデータの管理場所を指定 （ここ後ほど出てくるので重要）
(記事投稿時点で17行目) DATA_PATH_HOST=../.laradock/data

# Dockerのコンテナ名を変更 （コンテナ・イメージの名前が紐づくので、このプロジェクトだと認識できる名前にする）
(記事投稿時点で36行目) COMPOSE_PROJECT_NAME={このプロジェクト名}

# MySQLのバージョンを指定
(記事投稿時点で242~245行目)
MYSQL_VERSION=5.7
MYSQL_DATABASE=｛このプロジェクトのDB名｝
MYSQL_USER=｛このプロジェクトのユーザー名｝
MYSQL_PASSWORD=｛このプロジェクトのPW名｝
```

###Dockerでイメージとコンテナの作成
laradockディレクトリ内でdocker-compose upする。（Dockerの操作はlaradockディレクトリ内で実行する）
nginx, mysql, phpmyadminを指定して実行。（左記に紐づくコンテナ・イメージも自動的に生成される、また初回は数十分時間がかかると見積もってください。）

```
$ docker-compose up -d nginx mysql phpmyadmin
```

###Laravelのインストール
```
# workspaceコンテナにログイン ※rootユーザーだと実行されるがエラーにもなるのでlaradockユーザーでログイン
$ docker-compose exec --user=laradock workspace bash

# 記事投稿時点で最新のLTSである5.5系をインストール
$ composer create-project --prefer-dist laravel/laravel ./ 5.5.*
```

Laravelのインストールが完了するとsrcディレクトリにLaravelのプロジェクトが作成される。

###Laravelの設定
srcディレクトリの.envファイルを編集。
**※laradockディレクトリの.envファイルと間違えないように注意**
以下のSQL設定を変更。これはlaradock/.envに設定されたものと合わせるように。
でないとDBと接続されない。

```
DB_HOST=mysql
DB_DATABASE=｛このプロジェクトのDB名｝
DB_USERNAME=｛このプロジェクトのユーザー名｝
DB_PASSWORD=｛このプロジェクトのPW名｝
```

Laravelの開発画面が表示されているか確認
[localhost:80](http://localhost:80)
成功していれば、おなじみのLaravelのTOPページが表示されます。

###DBのテーブル作成と接続確認
上記の作業でworkspaceコンテナに入っているが、そのままマイグレーションを行い、DBのテーブル作成と接続を確認する。

```
$ php artisan migrate
```

phpMyAdmin（[localhost:8080](http://localhost:8080)）にて問題なくマイグレーションできていることを確認できれば第１段階完了

workspaceコンテナを出る

```
$ exit
```

###ここまでの作業で上手くいかない場合によくある原因

- コマンドを実行するディレクトリの場所が適切でない。
- 元々ローカルにXAMPP・MAMPなどで築いていた開発環境のポート番号とかぶっている。
- .envファイルを変更内容を保存していない。


#第２段階：２個目のプロジェクトを作成する
基本的には1個目のプロジェクトをそのままコピペすればいい。

```
Laradockの開発フォルダ
  └── project1 ←これをコピーして
          ├── laradock
          └── src
　↓↓↓

Laradockの開発フォルダ
  ├── project1
  |       ├── laradock
  |       └── src
  └── project2 ←ここにペーストする
          ├── laradock
          └── src
```

###プロジェクトごとにユニークな値は設定変更する
#####laradockディレクトリ内の.envファイルを編集
```
# Dockerのコンテナ名を変更
(記事投稿時点で36行目) COMPOSE_PROJECT_NAME={このプロジェクト名}

# MySQLのバージョンを指定
(記事投稿時点で243~245行目)
MYSQL_DATABASE=｛このプロジェクトのDB名｝
MYSQL_USER=｛このプロジェクトのユーザー名｝
MYSQL_PASSWORD=｛このプロジェクトのPW名｝
```

#####srcディレクトリ内の.envファイルを編集
```
DB_HOST=mysql
DB_DATABASE=｛このプロジェクトのDB名｝
DB_USERNAME=｛このプロジェクトのユーザー名｝
DB_PASSWORD=｛このプロジェクトのPW名｝
```

###コピー元のデータを削除する
[こちら](https://qiita.com/SLEAZOIDS/items/f7e545d8e3721c1b2710)の記事を参考にしました。
ローカルの ~/.laradock/data/mysqlを削除する。

```
Laradockの開発フォルダ
  ├── project1
  |       ├── laradock
  |       └── src
  └── project2
          ├── .laradock（隠しフォルダ）
          |       └── data
          |             └── mysql ←これを削除
          ├── laradock
          └── src
```


第１段階でlaradockディレクトリ内の.envファイルを

```
DATA_PATH_HOST=../.laradock/data
```

としたが、こちらにデータが残っていることが保存されていることがよく分かる。

###コンテナ作成→DBにてテーブル作成まで
```
# コンテナを作成
$ docker-compose up -d nginx mysql phpmyadmin

# workspaceコンテナにログイン
$ docker-compose exec --user=laradock workspace bash

# project1にてsrcフォルダの中身を編集していない人はskip
# 既にLaravelはあるが、結構編集してしまっている場合はsrcフォルダの中身を削除してLaravelインストール
$ composer create-project --prefer-dist laravel/laravel ./ 5.5.*

# マイグレーションしてテーブル作成
$ php artisan migrate
```

３つ目以降のプロジェクトを作成する場合も第２段階の手順と同様

#第３段階：複数プロジェクトを実際に運用する（プロジェクトの切り替えを行う）
当たり前だが、基本的な手順は以下の通りである。

1. 進行中のプロジェクトを止める
2. 新たに作業したい別プロジェクトを動かす

###進行中のプロジェクトを止める
```
# どこのプロジェクトでもいいが、laradockディレクトリ上で起動しているコンテナを停止させる
$ docker-compose stop
```

###新たに作業したい別プロジェクトを動かす
```
# 新たに作業したいプロジェクトのlaradockフォルダ上でコンテナ起動
$ docker-compose up -d nginx mysql phpmyadmin
```

#おまけ

- Qiita初投稿かつ綺麗な方法ではないので、少し緊張しました。
- 時間があるときにVue.jsを組み込んだ環境構築についても記事投稿できれば、と思います。
- あまりないと思いますが、新しくプロジェクトを作成する際、Dockerネットワークの数が上限の30に達しており、エラーになってしまいました。ネットワークも削除してきれいな運用を心がけましょう。
- 誤りある場合などはお手柔らかにご指摘ください。