Laradockのセットアップで行うべきこと

## はじめに

この記事では、`Laradock`で開発環境をセットアップするにあたり最低限知っておいてほしいことを共有します。

**▼注意**

* あくまでも筆者の経験則からなるものです。
* 将来`Laradock`のバージョンアップにより対応しない内容もあるかもしれません。

## Laradockとは

`Laravel`向けの`docker-compose`プロジェクトです。
様々なミドルウェア類が用意されており、昨今のモダンなWEBアプリケーション開発に必要なものが全て詰まっていると言っても過言ではありません。

Laradockでの開発を行うにあたり公式のドキュメントが一番情報が多いです。
 → [Laradock公式ページはこちら](http://laradock.io/)

## Laradockを取得する

`Laradock`はGitHubをGitリポジトリとして利用しております。
公式ページの「Quick Overview」に以下のようにある通り、基本的にはmasterブランチを取得すると良いでしょう。

```
1 - Clone Laradock inside your PHP project:
--------------------------------------------------
git clone https://github.com/Laradock/laradock.git
--------------------------------------------------
```

### 1.Laradockの設定ファイルをコピーする

取得した`Laradock`のルートディレクトリには、`env-example`というファイルがあります。
Laradockではこのファイルを元に`.env`というファイルを同じディレクトリに作成する必要があります。

つまり以下のコマンド相当の操作を行います。

```bash:env-exampleをコピーして.envを作成する
$ cp env-example .env
```

### 2.【注意】すぐに`docker-compose up -d nginx mysql`を実行してはいけない

公式ページでは以下のコマンドを実行すればコンテナが動くとありますが実行しないように注意しましょう。

```bash:公式ページの通りに動かしてはいけない
$ docker-compose up -d nginx mysql
```

この例のコマンドによって`mysql`コンテナが動くことになります。
この`mysql`コンテナのデフォルト設定が曲者で、2020/03/05現在においてデフォルトの指定バージョンが`latest`ということでMySQL8がインストールされます。
MySQL8はデフォルトの認証方式が`caching_sha2_password`に代わっておりますので以下のどちらかの方法を選択してください。

* MySQL8の認証方式を`mysql_native_password`に変更する
* MySQL5.7を利用する

認証方式を変更する場合は以下の優秀な記事が参考になります。

[MySQL8.0に変えたら起こるアレ](https://qiita.com/HorikawaTokiya/items/529cb47e738d89e655b6)(@HorikawaTokiya殿の記事)

設定するファイルについては後述します。

### 3.作成した.envファイルを編集する

手順1で作成した`.env`ファイルを各々の環境向けに設定します。

####▼ホストとDockerで共有するフォルダの設定

```bash:.env（ホストとDockerで共有するフォルダの設定）
# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../src

# Point to where the `APP_CODE_PATH_HOST` should be in the container
APP_CODE_PATH_CONTAINER=/var/www
```

`APP_CODE_PATH_HOST`環境変数にホストマシン側のディレクトリを指定します。
この例では`Laradock`プロジェクト内の`src`ディレクトリを共有します。
（`APP_CODE_PATH_HOST`で指定したディレクトリが存在しない場合は作成されます。）

`APP_CODE_PATH_CONTAINER`環境変数はデフォルト（`/var/www`）のままで良いでしょう。
`Laradock`の`nginx`コンテナは`/var/www`を前提作られておりますが、必要があれば編集してください。

---

####▼ホスト側でのミドルウェア類のデータ置き場設定

MySQLやRedisなど、永続化するデータはコンテナ内にはおけません。

デフォルトでは`~/.laradock/data`と設定されておりますが、将来別の`Laradock`をセットアップすることもありますので置き場は変えましょう。
今回は`.test_app`という名前で保存先を作成します。

```bash:.env（永続化データの保存先設定）
# Choose storage path on your machine. For all storage systems
DATA_PATH_HOST=~/.test_app/data
```

---

####▼作成されるdocker-composeにプロジェクト名をつける

`Laradock`で動作させるコンテナには、デフォルトで`laradock_`というプレフィックスが付きます。
複数の`Laradock`を利用することを想定し、プレフィックスを別名で用意します。
今回は`test_app`という名前で保存先を作成します。

```bash:.env（docker-composeで動作するコンテナ名のプレフィックスを変更）
# Define the prefix of container names. This is useful if you have multiple projects that use laradock to have seperate containers per project.
COMPOSE_PROJECT_NAME=test_app
```

---

####▼PHPのバージョンを指定する

表題の通りです。
以下の場所に利用したいPHPのバージョンを指定してください。

```bash:.env（PHPのバージョンを指定する）
### PHP Version ###########################################

# Select a PHP version of the Workspace and PHP-FPM containers (Does not apply to HHVM).
# Accepted values: 7.4 - 7.3 - 7.2 - 7.1 - 7.0 - 5.6
PHP_VERSION=7.4
```

---

####▼利用する各コンテナ毎の設定を確認しよう

`Laradock`には様々なコンテナを動作させる設定が存在します。
よく利用する`workspace` `php-fpm` `mysql`コンテナを例に確認します。

なお、MySQLのバージョンを5.7にする場合はこのファイルで設定します。
デフォルトの認証方式を変更する場合は以下のどちらかの方法で設定します。

* `MYSQL_ENTRYPOINT_INITDB`環境変数のディレクトリに設定内容のSQLファイルを置く
* Laradock内の`mysql/my.cnf`に設定を追加する

```bash:.env（各コンテナの設定）
### WORKSPACE #############################################
# …
# 省略
# …
WORKSPACE_INSTALL_XDEBUG=false # xdebugを利用する場合はtrue
# …
# 省略
# …

### PHP_FPM ###############################################
# …
# 省略
# …
PHP_FPM_INSTALL_XDEBUG=false # xdebugを利用する場合はtrue
# …
# 省略
# …

### NGINX #################################################

NGINX_HOST_HTTP_PORT=80 # httpの場合のポート番号（デフォルトはウェルノウンポートが設定済み）
NGINX_HOST_HTTPS_PORT=443 # httpsの場合のポート番号（デフォルトはウェルノウンポートが設定済み）
# …
# 省略
# …

### MYSQL #################################################

MYSQL_VERSION=5.7 # 動かすMySQLのバージョン番号を指定すること
MYSQL_DATABASE=default # イメージ作成時に作成されるデータベース名
MYSQL_USER=default # デフォルトで作成されるユーザ名
MYSQL_PASSWORD=secret # デフォルトで作成されるユーザのパスワード
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root # rootのパスワード
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d # コンテナ初回作成時に動かしたいSQLファイルの置き場

# …
# 省略
# …

```

## 4.【Docker Toolboxで動かす場合】docker-compose.ymlファイルを編集する

Docker Toolboxで`mysql`サービスを動かす場合、`docker-compose.yml`ファイルを編集する必要があります。
`command: --innodb-use-native-aio=0`という1行を追加しましょう。


```yml:docker-compose.yml
### MySQL ################################################
  mysql:
    build:
      context: ./mysql
      args:
        - MYSQL_VERSION=${MYSQL_VERSION}
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - TZ=${WORKSPACE_TIMEZONE}
    volumes:
      - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
      - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
    # Docker Toolboxを使う場合は以下1行を追加する
    command: --innodb-use-native-aio=0
    ports:
      - "${MYSQL_PORT}:3306"
    networks:
      - backend
```

## 4.ようやくLaradockを動かす

`Laradock`の設定お疲れ様でした。
これで`Laradock`を安全に動かすことができるようになります。
必要なサービスを指定して起動させましょう。

```bash:起動
$ cd Laradockのディレクトリ
$ docker-compose up -d nginx mysql
```