Laravel & Docker 環境構築 with Laradock

## はじめに
Laravelをdockerを使用して環境構築します。
vagrantを立ててコマンドを１つ１つ..ってやるのは非常に面倒(初学習者だとかなり時間がかかる)なので、[Laradock](http://laradock.io/)を使うとかなり環境構築の時間を省けます。


では、やっていきましょう。

## 前提
Dockerはインストールしておいてください。
https://docs.docker.com/docker-for-mac/install/

## 1. 作業ディレクトリ作成 & Laradockのクローン
```bash
$ mkdir laravel_app
$ cd laravel_app
$ mkdir hoge_project # Laravelが配置される場所
$ git clone https://github.com/LaraDock/laradock.git
```

## 2. 環境変数の変更
laradockにある環境変数のサンプルファイルをコピーして、Laravelのインストール先の設定と、nginxのポート番号を変更します。

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

```bash:.env
### Paths #################################################

# Point to the path of your applications code on your host

# APP_CODE_PATH_HOST=../
APP_CODE_PATH_HOST=../hoge_project/

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

# NGINX_HOST_HTTP_PORT=80
NGINX_HOST_HTTP_PORT=3000
```

## 3. Dockerコンテナの実行
```bash
$ docker-compose up -d nginx mysql redis
```
ネットワークの影響で多少差はありますが、最初だけ25分前後かかりました。

```ruby
Starting laradock_mysql_1            ... done
Starting laradock_redis_1            ... done
Starting laradock_docker-in-docker_1 ... done
Starting laradock_workspace_1        ... done
Starting laradock_php-fpm_1          ... done
Starting laradock_nginx_1            ... done
```
起動したらhttp://localhost:3000 にアクセスしてみましょう。
404エラーが表示されればOK。

## 4. Laravelのインストール

laradockのworkspaceにログインしてLaravelをインストールします。
  
```bash
$ docker-compose ps

           Name                          Command               State                      Ports
------------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh            Up       2375/tcp
laradock_mysql_1              docker-entrypoint.sh mysqld      Up       0.0.0.0:3306->3306/tcp
laradock_nginx_1              nginx                            Up       0.0.0.0:443->443/tcp, 0.0.0.0:3000->80/tcp
laradock_php-fpm_1            docker-php-entrypoint php-fpm    Up       9000/tcp
laradock_phpmyadmin_1         /run.sh supervisord -n           Exit 0
laradock_redis_1              docker-entrypoint.sh redis ...   Up       0.0.0.0:6379->6379/tcp
laradock_workspace_1          /sbin/my_init                    Up       0.0.0.0:2222->22/tcp
```

workspaceのNameを確認してログイン

```bash
$ docker exec -it laradock_workspace_1 /bin/bash
root@f19315fd6:/var/www#
```


```bash
$ composer create-project --prefer-dist laravel/laravel ./

Installing laravel/laravel (v5.6.21)
  - Installing laravel/laravel (v5.6.21): Downloading (100%)
Created project in ./
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 70 installs, 0 updates, 0 removals
  - Installing vlucas/phpdotenv (v2.5.0): Downloading (100%)
  - Installing symfony/css-selector (v4.1.1): Downloading (100%)
.
.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
> @php artisan key:generate
Application key [base64:/rBs0vBIauYkQPUhKOfad2JIk3ohMdBbeCVaFewlLQ+s=] set successfully.
```

## 5. アクセス
http://localhost:3000 に再度アクセスしてこれが表示されればOK！
![スクリーンショット 2018-07-05 10.23.27.png](https://qiita-image-store.s3.amazonaws.com/0/239829/9b367419-c9e2-5fe8-e2a5-627a57eefa4c.png)

## 6. MySQL接続設定
workspace上でマイグレーション実行

```bash
$ php artisan migrate
```

エラーが表示されなければ終了。

### PDOException::("SQLSTATE[HY000] [2002] Connection refused")の対処
laradockではなくlaravelプロジェクトのほうの`.env`の修正が必要だそう。 
(間違いやすいので注意) 

```bash:.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```
### SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client の対処

MySQLの認証方式の変更が必要だそう。

mysqlのコンテナIDをチェック。

```bash
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                        NAMES
eb9734566dad        laradock_mysql        "docker-entrypoint.s…"   33 minutes ago      Up 23 minutes       0.0.0.0:3306->3306/tcp                       laradock_mysql_1
```

mysqlにログインする。

```bash
$ docker exec -it eb9734566dad /bin/bash
root@eb9734566dad:/#

$ mysql -u root -p
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

ユーザーの認証方式をチェックする。

```ruby
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| default          | %         | caching_sha2_password |
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)
```

認証方式を`caching_sha2_password`から`mysql_native_password`に変更する。

```ruby
mysql> ALTER USER 'default'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';
Query OK, 0 rows affected (0.19 sec)
```

MySQLが接続時の認証方式のデフォルト値を変更する。

```bash:my.cnf
# mysqlを抜けた後
$ vim mysql/my.cnf
[mysqld]
default_authentication_plugin= mysql_native_password # 追加
```

マイグレーション実行

```bash
$ docker-compose exec workspace bash
$ 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
```

## おわりに
DB接続時のエラー対処を含めた記事が他になかったので、参考になれば幸いです。