Laradockでプロジェクトを作ってphp artisan migrateするまで

## はじめに
### Laradockとは？
Laravelを用いたサーバーをDockerで立てるためだけに集中してプロジェクトで、必要なコンテナ群と環境をまとめられています。便利。
[公式サイト https://laradock.io/](https://laradock.io/)
nginxやmysqlはもちろん、php-worker等のように必要そうなコンテナが入っており、それぞれのバージョンなども一つの管理ファイルで行えるような仕組みになっています。すごい。

なお、私はLaradockではなくHomestead + Vagrantで開発を継続する方針に決めました。
深い理由はないのですが、結局のところ環境設定も多く必要になりそうなので、それであれば、一つの仮想マシンで丁寧にいじろうかなと思ったためです。

## 準備
### 環境について
Macbook Pro
macOS Sierra (ver10.12.6)

### 必要な物をインストール
何かしらの方法でDockerをインストールしなければなりません。
私の場合はHomebrewを使ったので、その手順を記します。
#### Homebrewを導入する
公式サイトに記述されているインストールコマンドを打ちます。
[公式サイト https://brew.sh/](https://brew.sh/)

```sh
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

#### Dockerをインストール
Homebrew-caskを用いてインストールします。

```sh
brew cask install docker
```

インストールが完了したら、一度Dockerを起動してください。
ツールバーのDockerをクリックした際に下の画像のように、
**<font color="LimeGreen">●</font>Docker Desktop is running**
となるまで、表示される手順に従い進めてください。
<img width="245" alt="Screen Shot 2019-03-29 at 13.02.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/45094/7c8dd1ec-5323-d7db-8169-cda1d0ccf4da.png">
ターミナルで`docker-compose`コマンドが使えればOKです。

### Laradockを入手
Laradockのgitリポジトリからクローンします。
私はホームディレクトリ以下にProjects/Webというフォルダを作って、そこにデータを格納しています。

```
cd Projects/Web
git clone https://github.com/laradock/laradock.git laradock
```
ここまでで、必要な物は揃ったはずです。

##メインパート
### laradockの.envファイルを用意する
クローンされたlaradockフォルダの中には`env-example`というファイルがあります。
laradockの環境設定を司るファイルなので、これをコピーして利用します

```sh
cd laradock
cp env-example .env
```
コピーしたファイルの頭にドット(.)がついていることに注意です。

#### workspaceにログインまでしてみる。
一旦起動して見ます。

```sh
docker-compose up -d nginx mysql workspace
```
... <font color="LimeGreen">done</font>
みたいなのがいっぱい出てくると思います。
ちゃんと起動しているか確認したいときは以下のコマンドを打ちましょう。ステータスが見られます。

```
docker-compose ps
```

起動確認ができたら、workspaceコンテナにbashでログインしてみます。

```shに
docker-compose exec --user=laradock workspace bash
```
下の感じに表示されればOKです。~は人によって違うと思います。多分。

```
laradock@~~~~: /var/www$
```
この/var/wwwは、デフォルトの.envの設定だとlaradockフォルダの一つ上の階層にマップされています。私の場合だと~/Projects/Webにあたります。

#### Laravelプロジェクトを作る。
/var/wwwで以下のコマンドを打ちます。プロジェクト名は一旦laravel-appとしています。
少し時間がかかると思うので休憩です。

```sh
composer create-project --prefer-dist laravel/laravel laravel-app
```
ここまでで、dockerで立ち上げた環境にlaravelのプロジェクトを用意するところまでできました。

#### nginxのルーティングを設定する。
上記までだと、http://localhost にアクセスしても404 not foundだと思います。
理由はnginxでのルーティングが正しく設定されていないためです。
設定のため、以下のコマンドで一旦コンテナを落とします。
まだworkspaceにログインしている場合は、`exit`と打つか、`Ctrl+D`でログアウトします。

```sh
docker-compose down
```
設定ファイルは、laradock/nginx/sitesにあります。
laravel用のサンプル設定があるので、コピーして使いましょう。

```sh
cd nginx/sites
mv default.conf default.conf.bak
cp laravel.conf.example default.conf
```
コピーしただけでは、ルーティングができていないので、以下のように編集します。12~16行目あたりにあります。
"Laravelプロジェクトを作る。"で作成した名前`laravel-app`に変更します。

```
- root /var/www/laravel/public;
+ root /var/www/laravel-app/public;
```
ここまで設定できたら、一度コンテナをリビルドして、起動します。
--buildオプションをつけるだけで問題ないとはずです。

```sh
docker-compose up -d --build nginx mysql workspace
```
起動が完了したら
http://localhost
にアクセスして見てください。以下の画面が表示されれば、問題ありません。
<img width="1041" alt="Screen Shot 2019-03-29 at 14.09.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/45094/1b6acf8a-6020-7c9a-44f6-f167ad1228c8.png">

### php artisan migrateするまで
php artisan migrateするためには、workspaceコンテナからmysqlコンテナにアクセスしなければなりません。laradockはこの辺りを解決してくれているので、大きな変更は必要ありませんが、以下を設定する必要があります。
設定変更の前に、一旦dockerのコンテナを全て落としておきましょう。

```sh
docker-compose down
```
#### laravel-app/.envファイルの設定を変更
laravelのプロジェクトは.envファイルに設定が記載されているので、mysqlの接続先を変更する必要があります。**laradockの.envではありません。**注意してください。
デフォルトだと、DB設定は以下のようになっていると思います。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```
以下のように変更します。

```
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```
DB_HOSTはlaradockが接続先を解決してくれるはずなので、mysqlだけで問題ないです。
また、この設定はlaradock/.envの設定に基づいているので、必要があれば各自変更してください。
laravelの環境設定はここまでで完了です。

#### laradockのmysqlの設定
ネイティブ認証プラグインを利用するので、以下の設定を行います。
設定ファイルは`laradock/mysql`にある`my.cnf`です。
テキストエディタで開いて、一番下の行に

```
default_authentication_plugin=mysql_native_password
```
と追記します。

ここまでできたら、一度、mysqlコンテナをリビルドしておきましょう。
また、一部キャッシュの影響？でうまく設定が反映されない場合があるので、`~/.laradock/data`
を削除しておくことを推奨します。
私はここで詰まった経験があるので...


```sh
rm -rf ~/.laravel/data
docker-compose build mysql
```

ここまでで、mysqlの設定はできました。

#### php artisan migrateする
あとは各コンテナを起動してプロジェクトディレクトリでmigrateするだけです。
起動とログインをして、

```sh
docker-compose up -d nginx mysql workspace
docker-compose exec --user=laradock workspace bash
```
作成したプロジェクトディレクトリに移動し、migrateコマンドを実行。

```sh
cd laravel-app
php artisan migrate
```
これで完了です。

## その他
今回データベース名などはlaradock準拠にしていますが、homesteadなどから移行した場合などは、laradockの設定を変えた方が都合が良い場合があると思います。
また、php-worker等を利用したい場合も、ある程度コンテナ間のコネクションはlaradockが吸収してくれますが、細かい設定は自分でする必要があると思うので、laradock/.envや、各コンテナの設定ファイルにはよく目を通しておいた方が良いと思います。