とりあえずLaradockで環境構築

## 対象者

とりあえずインフラとかDockerとか慣れてなくてよく分からないけど、手早くLaravelを動かせればいいやーって人向けです。

## Laradockとは

公式サイトには「**Laradockは、Dockerに基づく完全なPHP開発環境です。**」とあります。

> **Laradock is a full PHP development environment based on Docker.**

公式

https://laradock.io/

## 前提

- パソコンがある
- Wifiがある

※あとDockerのいんすとーるとかはやっといてくださーい、gitも要るよー。

## 手順

### 1. ローカルでディレクトリを作成

- 任意のディレクトリ作成

```
$ mkdir laradock
$ cd laradock/
```



### 2. LaradockのリポジトリをClone

GithubからLaradockのリポジトリをクローン

```
$ git clone https://github.com/Laradock/laradock.git laradock-practice
$ cd laradock-practice/
```

laradock-practiceの部分は、好きに変えてください。
デフォルトでは「laradock」というディレクトリになりますが、引数に名前を渡すとオリジナルのものができあがります。名前はつけておいたほうがいいっすね。

  

### 3. 各種設定 (Laradock)

- 設定ファイルのコピー作成

```
$ cp env-example .env
```

.env（設定ファイル）を開く

```
$ vi .env
```

以下の項目を探し、修正してください

修正前

```
APP_CODE_PATH_HOST=../
```

修正後

```
APP_CODE_PATH_HOST=../laradock-project
```

laradock-projectの部分はこれから作るLaravelプロジェクトの名前にしてください。
LaravelのWebサーバー上で同期するディレクトリを指定しています。
これをちゃんと指定してあげないとアクセス時404エラーになります。

※viコマンドはコマンドでファイルの編集ができます。編集したい箇所で「i」を入力するとインサートモードになり文字が打てるようになります。インサートモードを終了するには「esc」ボタンを入力します。その後、編集したファイルを保存し、終了するには「:」と「wq」を立て続けに入力してください。

  

修正前

```
MYSQL_VERSION=latest
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
```

修正後

```
MYSQL_VERSION=5.7（別に5.7じゃなくても）
MYSQL_DATABASE=このへんは
MYSQL_USER=じゆうに
MYSQL_PASSWORD=きめちゃってください
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
```

※詳しく調べていませんが、mysqlのverをlatestで最新にするとセキュリティ上の問題でうまく接続できないらしいです。僕はちなみに、5.7にしているのにうまく動かない時があり、なぜだろうと思っていたら「5.7t」と記述しており、5.7トンという重さを指定してしまっていたことがありました。

- laradock-practice/nginx/sites/default.confの変更

これはnginxに関する設定ファイルです。
nginx起動時に表示するファイルなどを指定できるのですが、パスの指定がうまくいっていない場合があるので、修正する必要があれば書き換えましょう。
着目してもらいたいのは一部分です。
以下のような修正前の状態になっていれば、修正してください。
laradock-projectの部分はそれぞれ作成されるLaravelプロジェクトの名前を指定してください。

修正前

```
root /var/www/public;
```

修正後

```
root /var/www/laradock-project/public;
```

  

### 4. コンテナ立ち上げ〜プロジェクトの作成

- コンテナの立ち上げ

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

docker-compose upコマンドはdocker-compose.ymlに書かれた情報をもとに処理を実行します（コンテナイメージの作成からコンテナの立ち上げなど。引数なしだと記述されている内容すべてが実行されるので、ひとまずDBサーバのmysqlとwebサーバのnginxを指定します。
※-dはデタッチモード（バックグラウンドで起動します）

- コンテナの起動確認

以下のように立ち上がっていれば大丈夫です。

```
$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                            NAMES
82e444c0ae67        laradock_nginx       "/bin/bash /opt/star…"   6 seconds ago       Up 4 seconds        0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
bd531621d6a3        laradock_php-fpm     "docker-php-entrypoi…"   7 seconds ago       Up 6 seconds        9000/tcp                                         laradock_php-fpm_1
1665d8a83f3b        laradock_workspace   "/sbin/my_init"          8 seconds ago       Up 7 seconds        0.0.0.0:2222->22/tcp                             laradock_workspace_1
d8b22e74c28f        docker:dind          "dockerd-entrypoint.…"   10 seconds ago      Up 8 seconds        2375-2376/tcp                                    laradock_docker-in-docker_1
7af2df7ebe17        laradock_mysql       "docker-entrypoint.s…"   10 seconds ago      Up 8 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp                laradock_mysql_1
```

- ワークスペースコンテナに入る

ワークスペースコンテナに入ります。exec、bashでそのコンテナに対してコマンドが叩けるようになります。

ワークスペースとはLaravelの開発を進めるにあたって必要なcomposerなどのツール類が用意された作業スペースみたいなところです。

デフォルトだとrootでワークスペースに入ることになるのですが、後ほどcomposerコマンドを実行した際に、怒られてしまうので、怒られるのが苦手な人は--user=laradockとかでlaradockユーザーとしてワークスペースに入ってください。

```
$ docker-compose exec --user=laradock workspace bash
.../var/www$
```

- Laravelプロジェクトの作成

以下のコマンドで、Laravelのプロジェクトがlaradockディレクトリと同じ階層の中に作成されます。
この実行内容だと最新verのLaravelでプロジェクトが作られます。ver指定したい場合は調べてください。

```
.../var/www$ composer create-project laravel/laravel laradock-project
...以下略
Application key set successfully.
```

- プロジェクト内へ移動

プロジェクト内に移動します。

```
.../var/www$ cd laradock-project/
```


### 5. 各種設定（Laravelプロジェクト）

- 設定ファイルの修正

```
.../var/www$ vi .env
```

以下のように修正

修正前

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```

修正後

```
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=このへんはさっきつくった
DB_USERNAME=Laradockの.envの内容と
DB_PASSWORD=合わせてください
```

.envの内容は先ほど作ったLaradockの方の内容と整合性が取れている必要がありますので合わせておいてください。

### 7. MySQLの確認

MySQLの設定がうまくいっているかを確認します。

- MySQLコンテナへ入る

Ctl + dでワークスペースコンテナを出て、MySQLコンテナに入ります。

```
$ docker-compose exec mysql bash
```

- MySQLへ接続

MySQLへ、接続します。defaultの部分は先ほど.envファイルで設定したユーザーネームを指定し、その後パスワードを聞かれるので、同じように.envで設定したパスワードを入力してください。うまくログインできればsqlコマンドが打てる画面に移り変わります。

```
# mysql -u default -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

- データベースの確認

うまく設定できていれば、.envで設定したデータベースが作られているはずです

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| default            |
+--------------------+
2 rows in set (0.02 sec)
```

- ユーザーの確認(rootで入った場合のみ行えます)

こちらも設定できていれば、.envで設定したユーザーが登録されていることが確認できますが、mysqlにroot権限で接続している必要があります。


```
mysql> select User from mysql.user;
+---------------+
| User          |
+---------------+
| default       |
| root          |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
5 rows in set (0.02 sec)
```

- マイグレーションチェック

マイグレーションを実行し、データベースの接続が上手くいっているかを確認します。
Laravelにおけるマイグレーションとはデータベースのバージョン管理機能のことです。

MySQL確認の延長ですが、一旦MySQLコンテナから抜け、ワークスペースコンテナに入り、プロジェクト内に移動して以下のコマンドを実行します。

データベース接続がうまくいっていればマイグレーションが実行されます。

```
$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
```

**ここまでの流れで上手くいかない場合**

- Laradock、Laravelプロジェクトの各.envファイルの整合性が取れていない可能性

  →.envファイルの設定がそれぞれ同じになっているかを確認し、合っていなければ合わせてください。

- ストレージデータの影響

  →laradockでDBを使用する際のストレージがデフォルトで、~/.laradock/dataに設定されています。~/.laradock/dataにmysqlというディレクトリが存在しているので一旦削除してやり直してみてください。

**補足**
デフォルトで~/.laradock/dataが設定されていると説明しましたが、これでは他にLaradockを使ってプロジェクトを作成した際に同じ場所を参照してしまうので変えた方がいいっぽいです。ここでは詳しく解説はしませんので詳細は調べてください。

- .envの書き換え等が反映されていない可能性

コンテナを立ち上げたまま、.env等の設定を書き換えただけでは内容が反映されません。
一度、コンテナを起動させ直しましょう。

再起動

```
$ docker-compose restart
```

ダメなら停止と削除〜起動

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

### 8. プロジェクトの起動確認

- localhostへアクセス

nginxのコンテナを立ち上がっている状態でlocalhostへアクセスします。うまくいっていれば、Laravelのトップページが表示されます。


![スクリーンショット 2020-02-08 19.51.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573625/92c7545b-3b2d-7cad-9a2b-fd7ddb30f382.png)


**上手くいかない場合**

- Laradockの.envファイルのAPP_CODE_PATH_HOSTの設定が正しくできていない

  →プロジェクトが存在するパスをちゃんと記述してあげてください。

- nginxのdefault.confのパス指定が上手くできていない

　→上記に手順を記載していますので、やり直してください。

- nginxコンテナが立ち上がっていない

　→docker psコマンドで確認し、立ち上がっていなければ、立ち上げてください。


#### ここまでくればとりあえずの環境構築は完了です！

#### あとは煮るなり焼くなり好きにしてください！