[Docker]Dockerを触ってみたついでにLaradockも試してみた話

# はじめに
ふと思い立って、おもしろそうだったのでDockerを入れてみました。
ついでにLaradockも試してみた。標準的なログイン画面を実装するところまでやってます。
今回はローカル環境を汚したくなかったのでVM上にDockerを入れてそこでコンテナを立ち上げています。

# 環境

|項目|内容|
|:-----|:-----|
|マシン|VirtualBox + vagrant上にCentOS7.4を準備|
|CentOS|CentOS Linux release 7.4.1708 (Core)|
|Docker|Docker version 18.06.0-ce, build 0ffa825|
|docker-compose|docker-compose version 1.17.1, build 6d101fb|

# 手順

## VMの準備

```bash:local_console
mkdir docker-sample
cd docker-sample

vagrant box add centos/7
vagrant init centos/7
vim Vagrantfile
```

```diff:Vagrantfile
- # config.vm.network "private_network", ip: "192.168.33.10"
+   config.vm.network "private_network", ip: "192.168.33.10"
```

```bash:local_console
vagrant up
```

## Dockerの準備

```bash:centos_console
sudo su
# 必須パッケージインストール
yum install -y yum-utils device-mapper-persistent-data lvm2
# リポジトリ追加
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yumパッケージインデックスの更新
yum makecache fast
# 最新版のインストール
yum install docker-ce
# サービス起動
systemctl start docker
# 念のためバージョンチェック
docker -v

# 自動起動
systemctl enable docker
# 毎回sudoしなくていいように権限を変更
groupadd docker
usermod -aG docker $USER
# 2018-08-13 追記：
gpasswd -a $USER docker
```

[**参考：CentOS7にDockerをインストールする**](https://qiita.com/inakadegaebal/items/be9fecce813cebec5986)
この段階ですでにDockerは利用可能になりました。
今回はLaravel用のコンテナ、 `laradock` を入れたかったので更に作業を続けます。

## docker-composeの準備

```bash:centos_console
curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > docker-compose
mv docker-compose /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

[**参考：CentOS7.3にDocker Composeまでインストール**](https://qiita.com/sawadashota/items/2bed41598d825d488701)
私の場合、ここで一旦VMを再起動する必要がありました。

```bash:local_console
vagrant halt
vagrant up --provision
```

```bash:centos_console
# 念のためにバージョンチェック
docker-compose -v
```

## laradockのクローン

```bash:centos_console
sudo yum install git
git clone https://github.com/LaraDock/laradock.git
cd laradock

# docker-conposeの環境ファイルを準備
cp env-example .env

# 立ち上げ
docker-compose up -d nginx mysql
# dockerイメージにvagrantとしてログインする
# NG : 
# docker-compose exec workspace --user:vagrant bash
# OK :
docker-compose exec --user {uid} workspace bash
# 参考：uidの調べ方
whoami
# > vagrant
id vagrant
# > 1000
```

ご指摘いただいた[**webazarashi**](https://qiita.com/webazarashi) さん、ありがとうございました！

## サンプルプロジェクトの作成・設定

```bash:workspace_console
# ワークスペース内にLaravelサンプルアプリを作成する
composer -V
composer create-project laravel/laravel sample
```

ドキュメントルートの設定を行う。
今回はLaravelのenvファイルではなく、laradockのenvファイルを編集する点に注意

```bash:centos_console
cd laradock
vim .env
```

```diff:laradock/.env
- APP_CODE_PATH_HOST=../
+ APP_CODE_PATH_HOST=../sample
```

```bash:centos_console
# 一度コンテナを再起動する
docker-compose stop
docker-compose up -d nginx workspace mysql
```

## 試しに接続してみる
ローカル側のブラウザから試しにつないでみましょう。
`http://192.168.33.10` と叩けばつながるはず。

## DBの設定を行う
普段だったらここで `php artisan migrate` を叩きたいところなんですが、DBの設定を変えないとうまく通りません。

+ [**【Docker】MySQL8.0系を使う時に発生する問題について**](http://blog.websandbag.com/entry/2018/05/17/121730)
+ [**LaradockでMySQLがどうしても立ち上がらない人あつまれー！**](https://qiita.com/lara_bell/items/d4bd1340a5cc7dfcfcb4)
+ [**MySQL8.0 認証方式を変更する**](https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917)

…話を統合すると、

+ docker側のenvファイルとプロジェクト側のenvファイルをMySQLのコンテナに合わせる必要がある
+ MySQL8.x系はユーザー認証方法が変わっており、設定を変更しないとmigrateできない

ということみたいです。
ちなみにMySQLのコンテナバージョンを落とそうとしたらエラーでうまくできませんでした。
ので、今回はMySQLは8.xのままで構築します。
それぞれ対応していきます。

ちなみに：その時のエラー

>   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknownto the client (SQL: select * from information_schema.tables where table_schema = blog and table_name = migrations)


```bash:centos_console
docker-compose exec mysql bash
```

```sql:mysql_console
/* MySQLにログイン */
mysql -u root -p

/* ユーザーリスト取得 */
SELECT user, host, plugin FROM mysql.user;
/*
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| default          | %         | caching_sha2_password | → mysql_native_password へ
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
*/
/* 認証方式の変更 */
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'root'@'*' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

/* 標準で使用するDBを作成する */
CREATE DATABASE sample_db;
SHOW databases;

exit
```

```bash:centos_console
vim sample/.env
```

```diff:sample/.env
  DB_CONNECTION=mysql
- DB_HOST=127.0.0.1
+ DB_HOST=mysql
  DB_PORT=3306
- DB_DATABASE=homestead
+ DB_DATABASE=sample_db
- DB_USERNAME=homestead
+ DB_USERNAME=root
- DB_PASSWORD=secret
+ DB_PASSWORD=root
```

## 一度コンテナを再起動

```bash:centos_console
docker-compose stop
docker-compose up -d nginx mysql workspace
```

## マイグレーション実行

```bash:centos_console
docker-conpose exec workspace bash
```

```bash:workspace_console
php artisan make:auth
php artisan migrate
```

…できた！これでひとまず環境はできました。