【環境構築メモ】docker × Laravel 開発環境構築（Laradock使用）

## はじめに
Laravelでの開発環境を構築する際の手順をまとめました。
今回は、**laradock**を使ってみたかったので、laradockを使用して環境構築します。

※ laradockとは？　http://laradock.io/
>1. Laravel(PHP)のプロジェクトをDocker上で動作させるためのワンダフルな環境
>2. Dockerを用いてlaravelの環境を作るために必要なものがほぼ全てパッケージ化されている
>3. PHP, nginx, MySQLやミドルウェア等、Laravelの実行に必要な環境が整っている。

## 前提環境
- Windows 10 Professional
- PHP7.3
- Dockerインストール済み
- gitインストール済み

## ゴール
- Laradockを使用して、Laravelの開発環境を構築する。  
- 開発環境としては、以下のような構成にします。
  - Laravel（Webアプリケーションフレームワーク）
  - mysql（DB）
  - nginx（Webサーバ）
  
## 手順
### 1. プロジェクトディレクトリを作成
- 任意の場所にプロジェクトディレクトリを作成します。どこでもOK。  
```
$ mkdir todo-list
```

### 2. プロジェクトディレクトリに移動し、laradockをプロジェクトディレクトリ直下にclone
- Githubからlaradockをcloneしてきます。cloneが終わると、プロジェクトディレクトリ直下に「laradock」というディレクトリが作成されます。
```$ git clone https://github.com/laradock/laradock.git```

- clone直後のプロジェクトディレクトリ階層: laradockディレクトリ下に色々入ってます


### 3. laradockディレクトリに移動し、「.env」ファイルを作成、編集 
- laradockディレクトリ直下の「env-example」ファイルをリネームして作成する
  - .envファイル = 環境設定ファイル
  - 設定ファイルのサンプルをベースに置き換える為、設定ファイルをコピーしておく。  
```
$ cd laradock/
$ cp env-example .env
```

### 3-1. envファイルの設定
- .envファイル内の値を編集していきます。

### 【設定詳細】  
I. envファイル内の「**APP_CODE_PATH_HOST**」の値を変更

```.env
  5 ### Paths #################################################
  6
  7 # Point to the path of your applications code on your host
  8 APP_CODE_PATH_HOST=../todo-app
  9
```
↑上記記述で、「todo-list/todo-app/」下の階層がアプリケーションのコードを格納するディレクトリとみなされるようになる。

- 2020年11月時点では.envファイルに書いてあるPHPのバージョンは「7.3」でした。
  - PHP_VERSION=7.3
  
- mysqlは「その時点の最新版」
  - MYSQL_VERSION=latest

### 4. docker-composeでコンテナを立ち上げる：nginx と mysqlを立ち上げ
- laradockディレクトリに移動し、コマンドを実行。コンテナを起動します。
```$ docker-compose up -d nginx mysql```
**※初回起動は時間がかなり！！かかります。気長に待ちましょう。10分以上は間違いなくかかる！**

- docker-compose up でエラーが出たら、下記参考URLの内容を参照ください。
https://qiita.com/blueray777/items/44e25dc04ed1ab5c4cc8  
  ・Laradockのdocker-compose upで出会ったエラー達

- コンテナの確認

```
$ docker-compose ps -a
           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              /docker-entrypoint.sh /bin ...   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:81->81/tcp
laradock_php-fpm_1            docker-php-entrypoint php-fpm    Up      9000/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

```

### 5. Laravelプロジェクトの作成
- コンテナ起動後は、コンテナ内に入ってLaravelプロジェクトを生成します。
laradockはworkspaceという全ての操作が可能なコンテナが用意されるので、ここから操作していきます。

- コンテナ内に入る（laradockユーザー/rootユーザー）
```$ winpty docker-compose exec --user=laradock workspace bash
$ winpty docker-compose exec --user=root workspace bash
```

- Laradockに入れた時の表示
```laradock@fb36cc3540cd:/var/www$
```

- Laravelプロジェクトのダウンロード
  - コンテナに入ったら/var/www配下にいますので、composerを使用してプロジェクトを生成します。  
```
laradock@fb36cc3540cd:/var/www$ composer create-project laravel/laravel todo-app
```
**※ダウンロードに時間かかる**

### 6. プロジェクトの生成確認
- http://localhost/ にブランチからアクセス確認
  - Laravelのデフォルト画面が出ることを確認

- 404 Not Foundが表示された場合
  - 3-1. envファイルの設定 で、.envファイルの「**APP_CODE_PATH_HOST**」のみ変更しましたが、「**APP_CODE_PATH_CONTAINER**」のパスも変更する必要がありました。（共有ディレクトリのマウント設定）
 
```
  5 ### Paths #################################################
  6
  7 # Point to the path of your applications code on your host
  8 APP_CODE_PATH_HOST=../todo-app
  9
 10 # Point to where the `APP_CODE_PATH_HOST` should be in the container
 11 APP_CODE_PATH_CONTAINER=/var/www/todo-app
```

- nginxのroot変更
  - nginxの設定を変更します。ドキュメントルートを変更（13行目：root 以下のパスを変更）  
  
```
$ vi nginx/sites/default.conf

  1 server {
  2
  3     listen 80 default_server;
  4     listen [::]:80 default_server ipv6only=on;
  5
  6     # For https
  7     # listen 443 ssl default_server;
  8     # listen [::]:443 ssl default_server ipv6only=on;
  9     # ssl_certificate /etc/nginx/ssl/default.crt;
 10     # ssl_certificate_key /etc/nginx/ssl/default.key;
 11
 12     server_name localhost;
 13     root /var/www/todo-app/public;
 14     index index.php index.html index.htm;
```
- envファイル変更後は、コンテナを再起動してください。  
```
$ docker-compose stop
$ docker-compose up -d nginx mysql
```

### まとめ
- ここまでで、laradock環境で構築したLaravelの初期画面表示ができるようになりました。
プロジェクトディレクトリの階層はこんな感じです。

```
  todo-list/
      | todo-app/
      └ laradock/
```
todo-appディレクトリ配下には、Laravelの各種ソースが格納されています。
dockerの知識や、Nginx等のインフラ知識がなくても、ここまではすんなりとこれるのではないかと思います。次の記事では、今回構築したLaravel開発環境をベースに、簡単なWebアプリケーションを構築して実行してみたいと思います。

### 次回！
- DB設定
- テーブルを作成、データ投入→ DBのデータを画面（ビュー）で一覧表示させてみる。

### 参考にしたサイト
Laravelで簡単なページを作成するまで　https://qiita.com/tasogarei/items/1e0a3577a9fae7e519ba