Laradockを利用した環境構築

## Laradockとは？
LaradockはオープンソースのLaravel開発環境でDocker上で動作するものです。

VirtualBoxと比較して、高速に起動・停止することができるというメリットがあります。

## 前提条件

- Dockerがインストールされていること
- Gitがインストールされていること

また、今回は以下のDockerイメージを利用します。

- nginx(webサーバ）
- php-fpm（PHPの実行環境）
- MySQL（データベース）
- workspace（Laravelの開発環境がまとまっているもの）
- phpMyAdmin（DBクライアント）


## Laradockのダウンロード

```
$ cd
$ mkdir laravel_docker
$ git clone https://github.com/Laradock/laradock.git
```
作成したディレクトリ配下にlaradockが作成されます。

## .envファイルの設定

.envで設定した値が、Docker起動時の設定ファイルdocker-compose.ymlに変数として使われているため、
.envファイルをコピーして編集します。

```
$ cd laradock
$ cp env-example .env
```

MySQLのバージョンは5.7に変更しました。なぜかlatestでは上手くいきませんでした。
.envを編集します。

```
### MYSQL #################################################

MYSQL_VERSION=5.7
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
```

## docker-compose upでコンテナを起動する
docker-compose.ymlで定義した内容でサービスを開始します。
初回起動時はダウンロードしてくるためかなりの時間を要します。
２回目以降は数秒で起動しますね。

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

完了すると、コンテナは起動状態となります。
`docker ps`コマンドで確認すると、STATUSがUpとなっているでしょう。

## Laravelプロジェクトの作成

Laravelプロジェクトはworkspace上で作成するので、workspaceのコンテナの中に入ります。

```
$ docker-compose exec --user=laradock workspace bash
```

今回はLaravelのバージョンは5.5とします。
testappの部分は任意のプロジェクト名を設定してください。

```
$ composer create-project laravel/laravel testapp --prefer-dist "5.5.*"
```

作成が完了したら、laradockディレクトリの.envファイルを書き換えます。

```
APP_CODE_PATH_HOST=../testapp
```

設定の変更を反映させるために、コンテナを再起動します。

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

再起動後に、ブラウザで
http://localhost
にアクセスして、Laravelのwelcome画面が表示されれば上手くいっています。

![2018-11-21 0.31のイメージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/166768/2b4cbbd0-63df-e630-8a35-848f3d0fda11.jpeg)

## PhpStormでプロジェクトを作成する

次は、PhpStormでプロジェクトを作成してみます。
任意に作成したlaravel_dockerフォルダ配下にtestappのプロジェクトフォルダが作成されていて、
こちらのファイルは、Dockerのworkspace上のファイルと同期されています。

![2018-11-21 0.11のイメージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/166768/f1ca6d3b-7057-e813-8861-2cc1e78c7533.jpeg)

Locationの項目は、testappのフォルダを選択すればおっけいです。

また、Filter packagesでlaravel/laravelを選択して、Createします。

## migrationを行う

表示はできたので、次は、マイグレーションを行ってみます。

Laravelにはプロジェクト作成時に、/database/migrations/配下にユーザー認証用のマイグレーションファイルがあるので、workspaceに入り、コマンドを実行します。

```
$ docker-compose exec --user=laradock workspace bash
$ php artisan migrate

In Connection.php line 664:
SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = myapp and table_name = migrations) 
```
ここで、僕はこういったエラーが出ました。
DBの接続に失敗しています。
下記の記事に書かれていたのですが、
MySQLのバージョンがlatestの場合に上手くいかないことがあるそうです。

https://qiita.com/akokubu/items/c79bb7128d7b16a20a22

一度データベースを作成してしまうと、初期化されないようなので、下記のコマンドで一度mysqlのイメージを入れ直すことで上手くいきました。

```
$ docker-compose down
$ rm -rf ~/.laradock/data/mysql
$ docker rmi laradock_mysql -f
$ docker rmi mysql -f
$ docker-compose build mysql
```

再起動後にもう一度マイグレーションを実行します。

```
$ docker-compose exec --user=laradock workspace bash
laradock@d2d62adadd06:/var/www$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
```

今度は上手くいきました。


## データベースに接続する

Laravelのデータベース設定は/config/database.phpに書かれていますが、変数はlaravelプロジェクト配下の.envファイルに書きます。

```
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```
このような感じで設定すると良いと思います。

Data Sources and Driversのウィンドウを開き、MySQLを選択。

.envで設定した値を入れます。
![2018-11-21 0.22のイメージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/166768/2dd83cb5-66ed-1056-d470-21ddc15bad6c.jpeg)

Test Connectionで Successfulが出たらOKです。