Laravel6 Laradockを使ってDocker環境構築を初めからやってみる

### はじめに
Laravelを学習して１ヶ月程度の初学者です。
自分自身もそうでしたが、学習開始時の最初のハードルが環境構築だと思います。
本記事では、これからLaravelを学習される方向けにlaradockを使ったDocker環境構築を解説します。

### 対象読者の方
ゼロからLaravelを勉強したい
やるからには最新版（Laravel6.0~)がいい
この機会にDocker環境構築にも挑戦してみたい

### 前提
macでDockerが既にインストールされている。
Dockerインストールはこちらの記事が分かりやすいです。
[DockerをMacにインストールする](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)

### Laradockとは？
LaravelでのDocker環境構築パッケージです。
mysql・nginx・php-fpm等、開発に必要なファイルが一式用意されているので
手軽にDocker開発環境の構築ができます。

公式 https://laradock.io/


### 目指すゴール
LaradockによるDocker環境でLaravelのTopページを表示させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481666/b5706106-25f9-81a7-944a-66c761d175c8.png)


### 実装の流れ
1 開発用のディレクトリを作成
2 git cloneでディレクトリにlaradockを導入
3 laradockの.envファイルを作成
4 workspaceコンテナを起動し、ログインする
5 Laravelプロジェクトを作成する
6 laradockの.envファイルを編集する
7 Laravelプロジェクトの.envファイルを編集する
8 laradockでコンテナ立ち上げ→ブラウザで表示確認


### 1 開発用のディレクトリを作成 

```
# ターミナル画面
$ mkdir laravel-project

#ディレクトリが作成されていることを確認
$ ls
  laravel-project

# 開発用ディレクトリに移動
$ cd laravel-project
```

### 2 git cloneでディレクトリにlaradockを導入
```
[laravel-project] $ git clone https://github.com/LaraDock/laradock.git

# laradockが導入されていることを確認
[laravel-project]$ ls
  laradock

#laradockディレクトリに移動
[laravel-project]$ cd laradock

[laradock] $
```

### 3 laradockの.envファイルを作成
laradockディレクトリで以下コマンドを実行します。

```
[laradock] cp env-example .env
```

[解説]
・.envファイルは「laradock」ディレクトリ内の「env-example」ファイルをコピーして作成します。

### ４ workspaceコンテナを起動し、ログインする
**1) workspaceコンテナを起動**

laradockディレクトリで以下コマンドを実行します。
（初めて環境構築するときは少し時間がかかります）
...doneという表示が出れば無事 workspaceコンテナの起動完了です。

```
[laradock] docker-compose up -d workspace
Starting laradock_docker-in-docker_1 ... done
Starting laradock_workspace_1        ... done
```

**2) workspaceコンテナにログイン**
以下コマンドを実行し、 workspaceコンテナにログインします。

```
[laradock] 
docker-compose exec --user=laradock workspace bash

# 以下のように表示されれば、workspaceにログインできています。
/var/www $
```

[解説]
・ workspaceコンテナについて
　macで言う所のターミナルです。
　プロジェクト作成、controller/model作成、migration等の
　Laravel関連のコマンドは基本的にworkspaceコンテナで実行します。

### 5 Laravelプロジェクトを作成する
**1)プロジェクト作成のコマンドを実行**
workspaceコンテナ内で以下コマンドを実行し、Laravelプロジェクトを作成します。
アプリの名前は「myapp」としています。
（少し時間がかかります）

```
/var/www $ composer create-project --prefer-dist "laravel/laravel=6.0.*" myapp
```

**2) 一旦、workspaceコンテナからログアウト**

```
#以下のような表示が出れば、プロジェクト作成完了
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
> @php artisan key:generate --ansi
Application key set successfully.

# 以下コマンドで一旦、ログアウトします。
/var/www $ exit
```

**3) workspaceコンテナも一旦、停止しておく**
laradockディレクトリで以下コマンドを実行します。

```
[laradock] $ docker-compose stop
Stopping laradock_workspace_1        ... done
Stopping laradock_docker-in-docker_1 ... done
```

**4) Laravelプロジェクトが作成されていることを確認する**
念の為、サンプルプロジェクトが作成されているか確認しておきます。

```
[laradock] cd ../
[laravel-project] ls
laradock	myapp
```

### 6 laradockの.envファイルを編集する
現段階でプロジェクト作成は完了しましたが、LaravelのTopページを表示するためには、
あともう少し設定変更の作業が残っています。

まずはlaradockの.envファイル編集です。

laradockディレクトリで以下コマンドを実行します。

```
[laravel-project] cd laradock
[laradock] vi .env
```
vimエディタを使って以下3つの設定を変更します。
(1)APP_CODE_PATH_HOST   (2)  DATA_PATH_HOST  (3)  MYSQL_VERSION

```laradock.env:
#変更前
APP_CODE_PATH_HOST=../
#以下に変更する
APP_CODE_PATH_HOST=../myapp
......

#変更前
DATA_PATH_HOST=~/.laradock/data
#以下に変更する
DATA_PATH_HOST= .laradock/data

・・・・・・

・・・・・・　（下にスクロール）

### MYSQL #################################################
#変更前
MYSQL_VERSION=latest

#以下に変更する
MYSQL_VERSION=5.7

#上記変更したらescを押す→ :wq(保存して終了）でvimエディタを終了します。

:wq
```

[補足]
Mysqlですが最新版は不具合情報もあるので、本記事ではVersion5.7にしています。

### 7 Laravelプロジェクト(myapp)の.envファイルを編集する
今度はLaravelプロジェクト側の.envファイルを編集します。
mysqlの設定をlaradockに合わせます。

＊.envファイルはlaradockとLaravelプロジェクトの２つあり混同しやすいので
　注意が必要です。

```
# myappディレクトリに移動
[laradock] cd ../
[laravel-project] cd myapp

# .envファイルを開く
[myapp] vi .env

# mysqlの設定を変更
[ 変更前 ]
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=default
DB_USERNAME=default
DB_PASSWORD=secret

# Esc→ 保存してvimエディタを終了
:wq
```

### 8 laradockでコンテナ立ち上げ→ブラウザで表示確認
必要な設定変更が一通り完了しました。
laradockディレクトリでコンテナを立ち上げTopページが表示できるか確認します。

```
#laradockディレクトリに移動
[myapp] $ cd ../
[laravel-project] $ cd laradock

# コンテナ立ち上げ
$ docker-compose up -d nginx mysql 
Starting laradock_docker-in-docker_1 ... done
Starting laradock_mysql_1            ... done
Starting laradock_workspace_1        ... done
Starting laradock_php-fpm_1          ... done
Starting laradock_nginx_1            ... done
```
ここまで出来たらブラウザで表示を確認します。

ブラウザから http://localhost/ にアクセスしてください。

以下のようにTopページが表示されれば、LaradockによるDocker環境構築完了です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481666/8bacf842-faac-f259-a22b-f6fae22c7461.png)


### 補足
コンテナを停止するときには以下コマンドを実行してください。

```
[laradock] $ docker-compose stop
Stopping laradock_nginx_1            ... done
Stopping laradock_php-fpm_1          ... done
Stopping laradock_workspace_1        ... done
Stopping laradock_docker-in-docker_1 ... done
Stopping laradock_mysql_1            ... done
```
起動中のコンテナを確認したいときは以下コマンドを実行してください。

```
#コンテナ起動中の場合 （表示例）
$ docker ps

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                      NAMES
b5cddea64a82        laradock_nginx       "/bin/bash /opt/star…"   16 minutes ago      Up 2 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
b3bd47a6c08c        laradock_php-fpm     "docker-php-entrypoi…"   16 minutes ago      Up 3 seconds        9000/tcp                                   laradock_php-fpm_1
203846af807f        laradock_workspace   "/sbin/my_init"          16 minutes ago      Up 4 seconds        0.0.0.0:2222->22/tcp                       laradock_workspace_1
1fc915c04e06        docker:dind          "dockerd-entrypoint.…"   16 minutes ago      Up 5 seconds        2375-2376/tcp                              laradock_docker-in-docker_1
7858263ce0c5        laradock_mysql       "docker-entrypoint.s…"   16 minutes ago      Up 5 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp          laradock_mysql_1


# コンテナが起動していない場合

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```