LaradockでLaravel環境構築【手順書】

# はじめに
LaradockでLaravel環境を作る手順書です。
単純に動かすだけの手順でなく、下記点を含んでいます。

* Laradockで２つ目の環境を構築する時に困らないための設定事項
* 設定しておくと開発時に多少楽になるための設定事項
* 嵌った点の備忘録

## 前提環境
* docker-composeが使用できること
    * Windowsの場合Windows10 Proであること
        * Windows10 Homeである場合、Linuxを立ち上げてその中で作業する必要があります(下記は参考例)。
            * 旧：[Windows 10 HomeのWSL2でdocker-composeを使う](https://qiita.com/sonoha/items/33f1bc3b12f0803ceca7#_reference-d47bab4f6a3d15d0a55a)(2020/05以前)
            * 新：[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)
    * docker-composeがインストールされていること
* ターミナルを使用できること
    * Windowsの場合gitbashやPowerShell推奨(command promptは見づらい・文字化けの危険があるため)
* 海外のCDNサーバにブロックされていたりしないこと
    * 短期間に環境を作りまくったせいか一部サーバに一時的にブロックされたことがあります
    * この場合ネットワークを変えることで解決したりします(ポケットwifi等)
* 2018年以前に取得したLaradockを使用しないこと
    * Laradockの使用しているdocker-compose.ymlがv2である可能性があります

## 完成形
### サーバ構成
* nginx
    * + php-fpm
* mysql
* redis
* APサーバ(workspace)

### ディレクトリ構成
Laradockとプロジェクトディレクトリ(laravel)を同階層に置く想定です。
(プロジェクトディレクトリ下にLaradockを置きたくないので、Laradockの設定を変える作業が入ります)

```
my_project
├── laravel
│   ├── app
│   ├── bootstrap
│   ├── config
│   └ ...
└── laradock
    ├── adminer
    ├── aerospike
    └ ...
```

# 手順
1. Laradock取得
2. Laradockの設定ファイル修正
3. Laradockビルド・アクセス
4. Laravelインストール・yarnインストール
5. Laravel設定ファイル修正
6. ブラウザアクセス

## 1.Laradock取得

適当な場所にプロジェクト用ディレクトリを作成し、Laradockをダウンロード

```bash
$ mkdir ~/my_project
$ cd ~/my_project
$ git clone https://github.com/laradock/laradock.git
```

## 2.Laradockの設定ファイル修正
* 設定ファイルの作成
    * .env作成
        * サーバ構成の基本となるファイルです
    * createdb.sql作成
        * テーブル構築の初期設定をしてくれるファイルです

```bash
$ cd ./laradock
$ cp -a ./env-example ./.env
$ cp -a ./mysql/docker-entrypoint-initdb.d/createdb.sql.example ./mysql/docker-entrypoint-initdb.d/createdb.sql
```

* 下記ファイルを修正

```diff:.env
//document rootをlaravelにすることで、以降/laravel/を省略
- APP_CODE_PATH_HOST=../
+ APP_CODE_PATH_HOST=../laravel/

- APP_CODE_PATH_CONTAINER=/var/www/
+ APP_CODE_PATH_CONTAINER=/var/www/laravel/

//mysql等のデータ本体の置き場所。これを修正しておかないと別プロジェクト作成時に競合する。
- DATA_PATH_HOST=~/.laradock/data
+ DATA_PATH_HOST=~/.laradock/my_project/data

//コンテナ区別用prefix。これを修正しておかないと別プロジェクト作成時に競合する。
- COMPOSE_PROJECT_NAME=laradock
+ COMPOSE_PROJECT_NAME=my_project-laradock

//任意のバージョンに変更
- PHP_VERSION=7.2
+ PHP_VERSION=7.3

//laravelがmysql8.0を使うにはユーザ設定に追加で修正が必要なため5系を指定
- MYSQL_VERSION=latest
+ MYSQL_VERSION=5.7
```


```diff:/nginx/sites/default.conf

//他のプロジェクトと区別しやすいよう、ドメイン名を設定している(必須ではない)
- server_name localhost;
+ server_name dev.my_project.com;

//laravelディレクトリを作ったための対応
- root /var/www/public;
+ root /var/www/laravel/public;
```

```diff:/mysql/docker-entrypoint-initdb.d/createdb.sql

//プロジェクト用DB作成
- #CREATE DATABASE IF NOT EXISTS `dev_db_1` COLLATE 'utf8_general_ci' ;
- #GRANT ALL ON `dev_db_1`.* TO 'default'@'%' ;
+ CREATE DATABASE IF NOT EXISTS `project_db` COLLATE 'utf8_general_ci' ;
+ GRANT ALL ON `project_db`.* TO 'default'@'%' ;

// テスト用DB作成(ユーザは使いまわす想定)
- #CREATE DATABASE IF NOT EXISTS `dev_db_2` COLLATE 'utf8_general_ci' ;
- #GRANT ALL ON `dev_db_2`.* TO 'default'@'%' ;
+ CREATE DATABASE IF NOT EXISTS `test` COLLATE 'utf8_general_ci' ;
+ GRANT ALL ON `test`.* TO 'default'@'%' ;
```

## 3. Laradockビルド・アクセス
下記コマンドを実行し、サーバを構築・ビルド

```bash
$ cd ~/my_project/laradock
$ docker-compose build workspace nginx mysql redis
$ docker-compose up -d nginx mysql redis
```

立ち上がったら下記コマンドでworkspaceサーバへアクセス
(立ち上げに失敗したら、docker-compose logsコマンド等で状態確認して対応)

```bash
$ docker-compose exec --user=laradock workspace bash
```

## 4. Laravelインストール・yarnインストール

workspaceサーバ内で下記コマンド実行し、laravel, jsをセットアップ

```bash
laradock@~~~~:/var/www$ composer create-project laravel/laravel --prefer-dist
laradock@~~~~:/var/www$ cd laravel
laradock@~~~~:/var/www/laravel$ yarn install
```

## 5. Laravel設定ファイル修正

DBアクセスが通るよう.envを修正

```diff:.env
- DB_HOST=127.0.0.1
+ DB_HOST=mysql
- DB_DATABASE=default
+ DB_DATABASE=project_db
- DB_USERNAME=homestead
+ DB_USERNAME=default
```

## 6. ブラウザアクセス

workspaceの作業を終了し、ホストPCからdockerのwebサーバにアクセスする

### hostsの修正
#### Windowsの場合

メモ帳を管理者で実行し、下記ファイルを修正

```diff:C\Windows\System32\drivers\etc\hosts
+ 127.0.0.1       dev.my_project.com
```

#### macの場合
```diff:/private/etc/hosts
+ 127.0.0.1       dev.my_project.com
```

----

### ブラウザアクセス
ブラウザを開き、http://dev.my_project.com へアクセス
Laravelが表示されていれば完了です！ :smiley: 


----
# おまけ
## ありがちな失敗
### サーバ立ち上げに失敗してExit 1が出ている
```text
$ docker-compose ps
                   Name                                 Command               State                                                                       Ports
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh            Up       2375/tcp, 2376/tcp               
laradock_mysql_1              docker-entrypoint.sh mysqld      Up       0.0.0.0:3306->3306/tcp, 33060/tcp
laradock_nginx_1              /bin/bash /opt/startup.sh        Exit 1                                    
laradock_php-fpm_1            docker-php-entrypoint php-fpm    Up       9000/tcp                         
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, 0.0.0.0:3000->3000/tcp, 0.0.0.0:3001->3001/tcp, 0.0.0.0:4200->4200/tcp, 0.0.0.0:8001->8000/tcp, 0.0.0.0:8080->8080/tcp
```

上記の場合nginxが死んでいる。
docker-compose logsコマンドで失敗原因を確認しましょう。

```bash
$ docker-compose logs nginx
```

### nginxの立ち上げに失敗する
```
adduser: group 'www-data' in use
ERROR: Service 'nginx' failed to build: The command '/bin/sh -c apk update     && apk upgrade     && apk add --no-cache openssl     && apk add --no-cache bash     && adduser -D -H -u 1000 -s /bin/bash www-data' returned a non-zero code: 1
```

というエラーが発生した場合、
https://github.com/laradock/laradock/pull/2162/commits/8417ed2710e3491f1e74b796e032844d38ea8216
を参考に修正を行ってください。

### メモリ不足でdockerが立ち上がらない
* chrome等ブラウザを閉じる
* dockerの設定から割り当てるメモリ量を調整する

### docker-compose buildに失敗する
```
npm ERR! code EAI_AGAIN
npm ERR! errno EAI_AGAIN
```
上記のようなエラーが発生した場合、時間をおいて再ビルドすれば直ることがあります。

### docker-compose up時にmysqlが起動しない
既にLaradockでプロジェクトを立ち上げたことがある場合、
そのプロジェクトとDATA_PATH_HOSTの場所被った場合立ち上げに失敗します。

DATA_PATH_HOSTを変えビルドしなおし(docker-compose build --no-cache mysql)をしたり、
既存のDATA_PATH_HOSTの中身を削除したりしてみてください。
(削除して大丈夫かはご自身でご判断ください)

### docker-compose upが全体的に失敗する
過去にdocker等で仮想イメージを作ったことがある場合、
既存のものとポートが被ったりすることが多々あります。

workspace, nginx, mysql, redisのポートをずらしたりdockerを再起動したりビルドしなおしたり色々試してください。
＊特に2018年までのLaradockにはCOMPOSE_PROJECT_NAMEの設定が無いため、コンテナ名が被ります

### mysqlを誤って8.0で作成してしまった

Laravelは最新版でもmysql8.0標準の暗号化方法(caching_sha2_password)をサポートしていません。(2019/6/28現在)
mysql8.0を作成してしまい、そこで作ってしまったユーザでログインしたい場合、
下記のようなsqlによりパスワード設定を更新してください。

ユーザ:'default'を、パスワード:'secret'で更新

```sql
ALTER USER 'default' IDENTIFIED WITH mysql_native_password BY 'secret';
```

### ERROR: Pool overlaps with other one on this address spaceエラーが発生した場合
```:例
$ docker-compose up -d nginx mysql redis
Creating network "laradock_backend" with driver "bridge"
ERROR: Pool overlaps with other one on this address space
```

上記の例の場合、laradock_backendというネットワークが既に存在し、上書きできないというエラーとなります。
まず、下記コマンドでdockerのネットワークが確認します。

```bash
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
71c487abe...        bridge              bridge              local
7c9291603...        host                host                local
95dcdfd15...        laradock_default    bridge              local
b223d9550...        none                null                local
```

確かにlaradock_defaultが存在するため、この場合既存のlaradock_backendネットワークを削除すれば解決します。
下記コマンドで、使用していないネットワークを全て削除できます。
使用中であった場合削除されないため、
その場合は使用していると思われるlaradockにてdocker-compose downを行ってください。

```bash
$ docker network prune
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
laradock_default
```


## Q.A
### php5.4は使えないのか？
使えません。5.6以上となります。

### Windows10 homeでは使えないのか？
現在のところ使えません。
どうしても使いたい人はWSL2でググると道があります。

### DBにつながるか確認したい

workspace内で下記コマンド打てばテーブル作成処理が走るので、試してみるといいと思います。

```
$ laradock@~~~~:/var/www$ cd /var/www/laravel/
$ laradock@~~~~:/var/www/laravel$ php artisan migrate
```

成功後は下記コマンドでだいたい元通りにできます

```
laradock@~~~~:/var/www/laravel$ php artisan migrate:rollback
```