LaradockをMacで構築するまでの道のり

勉強を兼ねてLaradockの構築方法も載っていたので実際に自分のMacにて構築してみたときの話です。
なかなかスムーズに行かなかったので、構築するときに苦労したところを踏まえつつ「LaradockをMacで構築するまでの道のり」を書いていきます。

## 「Docker Desktop for Mac」をMacにインストール
まずは、[Docker](https://docs.docker.com/docker-for-mac/install/ "Docker")の公式サイトにアクセスし、「Docker Desktop for Mac」をダウンロードします。
ダウンロードしたファイルを展開したら画面の指示に従いつつ、ターミナルにコマンドを打つ作業が終わったらインストールが完了します。
インストールが完了したら、Dockerを起動しておきます。

<img width="696" alt="Docker-icon" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425008/37ce12e5-16af-cea5-5b30-ba1e5405cd89.png">

## Gitのインストール
次に、GitをMacにインストールします。
「Xcode（Xcode Command Line Tools）」をすでにインストールしているようであれば、この作業は必要ないみたいです。
ターミナルに下記のコマンドを打ち込みます。

```console
git --version
```

これでGitのバージョンが表示されない場合は、[Gitの公式サイト](https://git-scm.com/downloads "Gitの公式サイト")からインストールの操作を行う必要があります。

## Laradockのダウンロード
LaradockをGitHubからダウンロードします。
下記の流れをターミナルで実行していきます。

```console
~ $ cd
~ $ mkdir laravel_docker
~ $ cd laravel_docker

~laravel_docker $ git clone https://github.com/LaraDock/laradock.git
```

上記の流れを解説します。
まず、`cd`でホームディレクトリに移動します。
そして、`mkdir`でホームディレクトリ直下に「laravel_docker」ディレクトリを作成して移動します。
最後に、`git clone`コマンドでGitHubからLaradockをダウンロードします。
「laravel_docker」ディレクトリの直下に「laradock」というディレクトリが生成されていたらOKです。

```console
~laravel_docker $ ls
laradock
```

## 設定ファイルの作成
.envファイル（設定ファイル）を作成する必要があります。
下記コマンドを実行してください。

```console
~laravel_docker $ cd laradock
~laradock $ cp env-example .env
```

「laradock」ディレクトリに移動します。
`cp`コマンドによって、「laradock」ディレクトリ内の「env-example」ファイルをコピーして.envファイルを作成します。

## コンテナを初期化
コンテナの初期化では、「nginx」や「MySQL」などの各コンテナに必要なファイルのダウンロードや設定が実行されます。

```console
~laradock $ docker-compose up -d nginx mysql workspace phpmyadmin
Creating laradock_docker-in-docker_1 ... done
Creating laradock_mysql_1            ... done
Creating laradock_phpmyadmin_1       ... done
Creating laradock_workspace_1        ... done
Creating laradock_php-fpm_1          ... done
Creating laradock_nginx_1            ... done
```

※ダウンロードには、かなり時間がかかります（數十分ぐらい）
ダウンロードが完了したら、**５つのコンテナ**と**docker:dind**（Docker上でDockerを動かすためのもの）が起動しているかを下記コマンドで確認しましょう。

```console
~laradock $ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                                      NAMES
276655db49e5        laradock_nginx        "/bin/bash /opt/star…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
3a50a897f3bc        laradock_mysql        "docker-entrypoint.s…"   2 minutes ago        Up About a minute   0.0.0.0:3306->3306/tcp, 33060/tcp          laradock_mysql_1
bb4938cdfafb        laradock_php-fpm      "docker-php-entrypoi…"   2 minutes ago        Up About a minute   9000/tcp                                   laradock_php-fpm_1
e5749c2cc1c8        laradock_workspace    "/sbin/my_init"          2 minutes ago        Up About a minute   0.0.0.0:2222->22/tcp                       laradock_workspace_1
de652a051701        docker:dind           "dockerd-entrypoint.…"   2 minutes ago        Up About a minute   2375/tcp                                   laradock_docker-in-docker_1
ae43ceba7f1a        laradock_phpmyadmin   "/docker-entrypoint.…"   2 minutes ago        Up About a minute   0.0.0.0:8080->80/tcp                       laradock_phpmyadmin_1
```

`docker container ls`コマンドでも、起動中のコンテナを確認することができます。

## Laravelプロジェクトの作成（一番苦労したところ）
Laravelプロジェクトを新規で作成して、LaravelのWelcome画面が表示されるところまでいきます。
このタスクが一番苦労したので、ボリュームが多いかと思われます。

### 「workspace」にLaravelプロジェクトを作成
コンテナの１つである「workspace」上に、Laravelプロジェクトを作成していきます。
下記コマンドを実行すると、「laradock」ユーザーにて「workspace」コンテナ（仮想環境）にログインすることができます。

```console
~laradock $ docker-compose exec --user=laradock workspace /bin/bash
```

ログインすると、`/var/www`ディレクトリに入ります。
ユーザー名は下記のようになるはずです。

```console
laradock@e5749c2cc1c8:/var/www$
```
次に、「workspace」コンテナ上に下記コマンドでLaravelプロジェクトを新規で作成します。
例として、新規プロジェクトは「sample-app」と命名することにします。

```console
laradock@e5749c2cc1c8:/var/www$ composer create-project laravel/laravel sample-app --prefer-dist "5.5.*"
```

`--prefer-dist`を行うことで、「zip」形式でファイルをダウンロードするため、時間の短縮につながります。
新規プロジェクトを作成すると、Laravelのファイル一式が入った「sample-app」ディレクトリが作成されています。
「sample-app」ディレクトリが作成されてあることを確認したら、`exit`でいったんコンテナからログアウトします。

### .envファイルの編集
localhostに接続できるようにするために、.envファイルの２箇所を編集します。
**しかし、普通にテキストエディタで.envファイルを編集しても、その後にlocalhostに接続できない（LarabelのWelcome画面が表示されない）事態になります。**
なので、.envファイルはターミナルで`vi`コマンドを使って編集します。

`vi`コマンドの使い方については、以下の記事が大変参考になりました。
[viコマンド（vimコマンド）リファレンス - Qiita](https://qiita.com/TD3P/items/0510bee10bcfd88afeee "viコマンド（vimコマンド）リファレンス")

１点目は、`APP_CODE_PATH_HOST`の値を「sample-app」ディレクトリ用に変更します。

```
###########################################################
###################### General Setup ######################
###########################################################

### Paths #################################################

# Point to the path of your applications code on your host
# APP_CODE_PATH_HOST=../         # コメントアウトする
APP_CODE_PATH_HOST=../sample-app/ # 値を置き換える

（略）
```

２点目は、.envファイルの編集方法を調べているときに、MySQLのバージョンが8.0以上になっていると、セキュリティの関係でDockerがうまく動作しないという情報が落ちていました。
なので、「MYSQL」の部分も下記のように置き換えます。

```
### MYSQL #################################################

# MYSQL_VERSION=latest # 変更前（latest）
MYSQL_VERSION=5.7      # 変更後（5.7）
```

### コンテナの再起動
.envファイルの編集が無事に終わったら、コンテナを再起動します。
まず、下記コマンドでコンテナを停止させます。

```console
~laradock $ docker-compose stop
Stopping laradock_nginx_1            ... done
Stopping laradock_mysql_1            ... done
Stopping laradock_php-fpm_1          ... done
Stopping laradock_workspace_1        ... done
Stopping laradock_docker-in-docker_1 ... done
Stopping laradock_phpmyadmin_1       ... done
```

停止させたコンテナを、下記コマンドでもう一度起動させます。

```console
~laradock $ docker-compose up -d nginx mysql
Starting laradock_mysql_1            ... done
Starting laradock_docker-in-docker_1 ... done
Starting laradock_workspace_1        ... done
Starting laradock_php-fpm_1          ... done
Starting laradock_nginx_1            ... done
```

### Laradockを無事に構築できたか確認
全てのタスクが完了したら、[http://localhost/](http://localhost/ "http://localhost/") にアクセスします。
そうすると、以下の画像のようにLaravelのWelcome画面が正しく表示されます。

<img width="1680" alt="Laravel-Welcome-screen" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425008/2bb9cfd3-a25c-9d56-af3e-b3ca9b29c402.png">

これで、Docker上でLaravelにおける開発を進めていくことができます。