Docker-composeでLaravel、Nginx、MySQLのローカル開発環境を作る

# はじめに

以下のリンクをまとめて自分の使いやすいようにした。

・[【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)
・[Laravelの開発環境をDockerを使って構築する](https://qiita.com/ucan-lab/items/17c806973e69792ada99)

メイン参考リンク

・[DockerでLaravel環境を構築する①~webサーバーの立ち上げ~](https://qiita.com/wjtnk/items/9d6a56a05bff2068cd2c)

最終完成リンク

・[Docker に Composer をインストールするベストプラクティス（と解説）](https://qiita.com/yatsubashi/items/02bbbebbfe7e5a5976bc)
・[Dockerでいい感じにPHP(Laravel)のローカル開発環境を作る](https://qiita.com/igayamaguchi/items/aec8f2b15b203946a2c4)

# 完成図
gitでクローンされる中身

```
.
├── .env
├── docker
│   ├── nginx
│   │   └── default.conf
│   └── php
│       └── Dockerfile
├── docker-compose.yml
└── src
    └── index.php
```

# 使い方

1.`git clone https://github.com/yCroma/Laravel-env.git アプリ名`
2.`.env`ファイルでアプリ名の設定とデータベースの設定を済ませる
(以降はアプリ名が`test`の場合を想定して書く)
3.`docker-compose up -d --build`でコンテナを作成する


## Laravelの設定

```
# コンテナに入る
$ docker exec -it test-app bash

# アプリの作成(今回は`test`という名前で作成)
# composer create-project --prefer-dist laravel/laravel test "6.*"

# アプリのディレクトリに移動
# cd test

# 一応.envのコピーとアプリケーションキーの準備
# cp .env.example .env
# php artisan key:generate

# 権限の設定
# chmod 777 -R storage
# chmod 777 -R bootstrap/cache

# .envの設定
# vi .env
```

```:.env
DB_CONNECTION=mysql
DB_HOST=mysql         ← 修正
DB_PORT=3306
DB_DATABASE=homestead ← 修正
DB_USERNAME=homestead ← 修正
DB_PASSWORD=secret    ← 修正
```

```
# コンテナから出る
# exit
```

## Nginxの設定

`default.conf`のドキュメントルートを修正。アプリ名が`test`の場合は以下のようになる。

```
server {
    listen 80;

    root  /var/www/html/test/public;     # 修正
    index index.php index.html index.htm;
    charset utf-8;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
  
    location / {
        root  /var/www/html/test/public; # 修正
        try_files $uri $uri/index.php;
    }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   app:9000;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO $fastcgi_path_info;
    }

}
```

## docker-compose.ymlの設定

別に設定しなくてもいいですが、すると少し幸せになるのでやります。`app`の所の環境変数を変更して、入った時にすぐに作業ができるようにしておきましょう。

```docker-compose.yml
app:

    working_dir: /var/www/html/test # アプリケーション名の追加

```

composeファイルを編集したので、コンテナの立て直しと再起動。

```
$ docker-compose up -d
$ docker-compose restart
```

最後にマイグレーションまでできたら完璧。

```
$ docker exec -it test-app bash

# コンテナ内
# php artisan migrate
```

## 高速化
アプリケーションのインストール、マイグレーションまで終わった後に重いと感じると思います。これはマウントの都合上仕方がないので、高速化の方法を示しておきます。手始めに、`docker-compose.yml`のコメントアウトを外してください。

```docker-compose.yml
      - vendor-volume:/var/www/html/${APP_NAME}/vendor
      - storage-volume:/var/www/html/${APP_NAME}/storage
      
volumes: 
  db-store:
  vendor-volume:
  storage-volume:
```

次に、この処理を適応するためにコンテナを立ち上げなおします。

```
$ docker-compose up -d
```

そうすると、`vendor`の保存先が変わります。フォルダを用意しなおしてあげましょう。

```
$ mkdir -p storage/framework/cache/data
$ mkdir -p storage/framework/sessions 
$ mkdir -p storage/framework/views  
$ chmod 777 -R storage 

# 上のコマンドを試しても動かなかったら
$ composer install
$ composer update
```

# おまけ

## DBへの接続法

GUIアプリが使えるなら

```Name: docker-laravel(任意)
Host: 127.0.0.1
Port: 3306
User: homestead
Password: secret
Database: homestead
```

コンテナから入るなら。

```
$ docker exec -it test-mysql bash -c 'mysql -uroot -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}'
```

## 完全な消し方。
```
$ docker-compose down --volumes --rmi all
```

## 注意点と大事なこと

(いずれ、DBはトップレベルボリュームに修正するのですが、伝えたいこと)
`.env`ファイルを`test`のままで作っている場合、データベースがトップレベルボリュームされることになる。その場合、保存先が気になったことはないだろうか？簡単に調べることができる。今回は、初期のままでは`test-mysql`がコンテナ名となるため以下のコマンドで確認できる。

```
$ docker inspect test-mysql

"Mounts":[
  "Source": "/var/lib/docker/volumes/test_db-store/_data"
]
```

また、これはボリュームを削除する時に消えてしまう。それが嫌な場合は、ディレクトリにマウントすると良いだろう
# おわりに
今度はNodeのコンテナも追加して、そこも分けれるようにしよう。

# 参考

・[cloneしたリポジトリを別リポジトリとしてリモートにpushする](https://qiita.com/SR_midori/items/52730907c1cddeb78b4d)
・[ComposerでPlease provide a valid cache pathとなったときの対応方法](https://qiita.com/ponsuke0531/items/f0b68546068ac8922665)