【複数プロジェクト対応】Laravel開発環境をDockerを使って用意する

# Laravel

http://laravel.jp/

## Vagrantを使った開発環境 Homestead

Vagrant仮想環境を使って開発をする場合はこちらを参照してください。
https://readouble.com/laravel/5.8/ja/homestead.html

## Dockerを使った開発環境 Laradock
今回のドキュメントはDockerを使った開発環境の構築を行います。
https://laradock.io/

## 複数プロジェクトに対応した構成でインストールする
仕事として使い始める方、趣味の延長でウェブサービスを作りたい方など、開発マシン上に複数のプロジェクトを作ることがあります。

上記の場合、プロジェクト毎にミドルウェアのバージョンが指定される場合があり、他のプロジェクトに影響させたくない場合は仮想環境を個別に用意することになります。

ここで示す例は個別に仮想環境を用意する方法の手順を示します。

##構築例

プロジェクトfugaとプロジェクトmogeを共存させ、仮想環境はそれぞれ独自で動くものとする。

```text:構成
─ Laravel # ここの名前はお好きに。Laravelプロジェクトを入れる的な。
　　　│
　　　├── fuga
　　　|   ├── app
　　　|   ├── data
　　　|   └── laradock
　　　│         ├── .env
　　　│         └── docker-compose.yml
　　　├── moge
　　　|   ├── app
　　　|   ├── data
　　　|   └── laradock
　　　│         ├── .env
　　　│         └── docker-compose.yml

```

## 注意点は複数プロジェクトでdockerコンテナがバッティングする
複数プロジェクトをdockerで立ち上げるとき、コンテナのバッティングが発生して作成に失敗するので、それを回避するためいくつかポイントがあります。


## 最初にプロジェクトfugaを作る

最初に作ったプロジェクトを、以降のプロジェクトの雛形にするため、注意深く作成しましょう。

まずプロジェクトをまとめるディレクトリ``fuga``を作成し、その中にlaradockを``git clone``します。

```bash
$ mkdir fuga;cd $_
$ git clone https://github.com/Laradock/laradock.git
```
この段階で以下の構成になります。

```text:構成
─ Laravel
　　　│
　　　├── fuga
　　　|   └── laradock
　　　│         ├── env-example
　　　│         └── docker-compose.yml
```
### docker-compose実行
``docker-compose.yml``に値を注入するため、`env-example`をコピーして`.env`を作り、`fuga`プロジェクト用の設定を行います。

```bash
$ cp env-example .env
$ vi .env
```
書き換える場所は以下の部分で。　最初の2行はfugaプロジェクト内を指すように変更して、PORTはプロジェクトごとにバッティングしないように利用するミドルウェアのPORTを変更します。

```text
APP_CODE_PATH_HOST=../app/
DATA_PATH_HOST=../data
COMPOSE_PROJECT_NAME=fugalaradock # ポイント！ 一意にしてコンテナ名のバッティングを防ぐ！
NGINX_HOST_HTTP_PORT=8099
NGINX_HOST_HTTPS_PORT=4499
APACHE_HOST_HTTP_PORT=8099
APACHE_HOST_HTTPS_PORT=4499
WORKSPACE_SSH_PORT=2299
MYSQL_PORT=3399
```
コンテナ立ち上げの準備ができました。　さっそく立ち上げてみましょう！
一番最初に実行したときはかなりの時間がかかるので、気長に待ちましょう( ´ー｀)y-~~

```
$ docker-compose up -d nginx mysql workspace
 :
 :
Creating fugalaradock_docker-in-docker_1 ... done
Creating fugalaradock_mysql_1            ... done
Creating fugalaradock_workspace_1        ... done
Creating fugalaradock_php-fpm_1          ... done
Creating fugalaradock_nginx_1            ... done
```
最後にエラーが出なかったら成功です。　ただしこの状態ではサーバ環境が揃っただけなので、``http://localhost:8099``でアクセスしても何も表示されません。

この段階で以下の構成になります。

```text:構成
─ Laravel
　　　│
　　　├── fuga
　　　|   ├── app  # .envのAPP_CODE_PATH_HOSTの設定により生成
                  # コンテナ内の /var/wwwの位置になる
　　　|   ├── data # .envのDATA_PATH_HOSTの設定により生成
　　　|   └── laradock
　　　│         ├── .env
　　　│         └── docker-compose.yml
```


## Laravelプロジェクトの雛形を生成する
この状態で開発（＆実行）環境はコンテナ内（ゲスト側）に生成されましたので、Laravelのプロジェクトを生成するためにコンテナ内へ入ります。

### 開発作業環境(workspace)
``docker ps``で**workspace**がついたコンテナを探します。

```bash
$ docker ps
A***********   fugalaradock_nginx
B***********   fugalaradock_php-fpm
C***********   fugalaradock_workspace  # <--- これ
D***********   fugalaradock_mysql
E***********   docker:dind
```
コンテナに入ります。

```bash
$ docker exec -it C*********** bash
root@C***********:/var/www#   # プロンプトが出てくればOK
```

composerを使ってLaravelプロジェクトを作成します。

```bash
# composer create-project laravel/laravel . # <-- ホスト側のfuga/app内に作る
 :
 :
Package manifest generated successfully.
> @php artisan key:generate --ansi
Application key set successfully.
```
これでLaravelの雛形が/var/www/app内に生成され``http://localhost:8099``で以下のページが表示されれば成功です。
![laravel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17025/edc41c90-f9ff-d58b-ca77-76446203cde4.png)

## 別プロジェクト(moge)を作る
注意する部分まで。

```bash
$ mkdir moge;cd $_
$ git clone https://github.com/Laradock/laradock.git
$ cp env-example .env
$ vi .env
```

``.env``の設定を他のプロジェクトと重ならないように変更しておきます。

```text
APP_CODE_PATH_HOST=../app/
DATA_PATH_HOST=../data
COMPOSE_PROJECT_NAME=mogelaradock # ポイント！ 一意にしてコンテナ名のバッティングを防ぐ！
NGINX_HOST_HTTP_PORT=8090
NGINX_HOST_HTTPS_PORT=4490
APACHE_HOST_HTTP_PORT=8090
APACHE_HOST_HTTPS_PORT=4490
WORKSPACE_SSH_PORT=2290
MYSQL_PORT=3390
```
あとはプロジェクトの雛形を生成して終わり！

```bash
$ docker ps
$ docker exec -it {containerID} bash
root@{containerID}:/var/www#
# composer create-project laravel:laravel .
```