Dockerを使用したlaravel環境構築

## 前提
・ Dockerを使用してlaravelの環境構築を行いたい方
・ laravelの標準のログイン、管理画面も使用したい人
・ Dockerはインストール済み
・ 他コマンド実行に必要なものは必要に応じてインストールしてください

## 構成
```html
laravelソースを格納するのフォルダ(名前は任意でOK)
  ├── docker-compose.yml
  ├── docker
  │   ├── php
  │   │    ├── Dockerfile
  │   │    └── php.ini
  │   └── nginx
  │        └── default.conf
  └── src
      └──  Laravelのプロジェクトファイル
```

## docker-compose.ymlの中身
docker-compose.ymlは複数のコンテナを同時に動かすためのツールである、Docker Composeを利用するために使用するYMLファイルです
```docker-compose.yml
version: '3'

services:
  php:
    build: ./docker/php
    volumes:
      - ./src:/var/www

  nginx:
    image: nginx
    ports:
      - 8000:8000
    volumes:
      - ./src:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mysqlDataBase(任意のデータベース名)
      MYSQL_USER: mysql(任意のデータベースのログインユーザー名)
      MYSQL_PASSWORD: mysql(任意のデータベースのログインパスワード)
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306

  node:
    image: node:12.13-alpine
    tty: true
    volumes:
      - ./src:/var/www
    working_dir: /var/www
```
## Dockerfileの中身
DockerfileとはDocker上で動作させるコンテナの構成情報を記述するためのファイルです
```Dockerfile
FROM php:7.4-fpm-alpine

RUN docker-php-ext-install pdo pdo_mysql
```
## php.iniの中身

```php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

## default.confの中身
default.confはngninxの設定情報を記述するためのファイルです
```default.conf
server {
  listen 8000;
    index index.php index.html;
    root /var/www/Laravelのプロジェクト名/public;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
    }

  location ~ \.php$ {

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }
```
## 環境構築の手順
はじめに任意の場所にlaravelのファイルを格納するフォルダをローカルに作成する
```
~/ $ mkdir laravelソースを格納するのフォルダ名
```
docker-compose.ymlファイルを作成して、中身は冒頭で紹介したdocker-compose.ymlの内容をコピペする

```
~/laravelソースを格納するのフォルダ名 $ touch docker-compose.yml
```

Dockerfileとphp.iniを作成して、中身は冒頭で紹介したそれぞれのファイルの内容をコピペする
```
~/laravelソースを格納するのフォルダ名 /docker/php $ touch Dockerfile
~/laravelソースを格納するのフォルダ名 /docker/php $ touch php.ini
```

defalt.confファイルを作成して、中身は冒頭で紹介したdefault.confの内容をコピペする
```
~/laravelソースを格納するのフォルダ名/nginx $ touch default.conf
```
docker-compose.ymlファイルがあるディレクトリ内で下記コマンドを実行してdockerを起動させる

```
~/laravelソースを格納するのフォルダ名 $ docker-compose up -d

Creating php                ... done
Creating db-host            ... done
Creating Laravelのプロジェクト名_node ... done
Creating nginx              ... done
```
phpのコンテナ内に入る
```
~/laravelソースを格納するのフォルダ名 $ docker-compose exec php bash
```
phpコンテナ内でLaravelプロジェクトを作成する
```
root@7eb4359bf51c:/var/www# laravel new Laravelプロジェクト名(任意)
```
Laravelのプロジェクトが入っているか確認する
バージョンが出力されればOKです
```
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan --version
Laravel Framework 8.27.0
```

phpコンテナを抜ける
```
root@7eb4359bf51c:/var/www# exit
```
これでlaravelソースを格納するのフォルダ名/src内にLaravelのプロジェクトファイルが作成され、
http://localhost/ にアクセスするとlaravelのページが表示されます

## MySQLの設定
MySQLコンテナに入る
```
~/laravelソースを格納するのフォルダ名 $ docker-compose exec db bash
```

MySQLコンテナ内でMySQLにログイン
```
root@630fbaf32806:/# mysql -u root -proot
```
今回のプロジェクトで使用するデータベースを作成する
データベース名はdocker-compose.ymlで指定した、MYSQL_DATABASEで作成します。
これを合わせないとデータベースを使用する際、エラーが発生します。
```
mysql> mysql> CREATE DATABASE mysqlDataBase(任意のデータベース名);

Query OK, 1 row affected (0.01 sec) 
```
Laravelのプロジェクトファイル内の.envファイルを下記に修正する
```.env
DB_CONNECTION=mysql
DB_HOST=db　# db(docker-compose.ymlに記載したDBのサービス名)
DB_PORT=3306
DB_DATABASE=mysqlDataBase(任意のデータベース名)
DB_USERNAME=mysql(任意のデータベースのログインユーザー名)
DB_PASSWORD=mysql(任意のデータベースのログインパスワード)
```
phpコンテナに入る
```
~/laravelソースを格納するのフォルダ名 $ docker-compose exec php bash
```
phpコンテナ内でマイグレーションを実行する
```
root@7eb4359bf51c:/var/www# cd Laravelプロジェクト名(任意)
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan migrate

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.04 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.02 seconds)
```
マイグレーションが無事に実行されれば成功です。
nodeコンテナに入る
```
~/laravelソースを格納するのフォルダ名 $ docker-compose exec node sh

/var/www
```
これでlaravelの環境構築は完了になります。

## 会員登録・ログイン機能追加
phpコンテナ内でパッケージのインストール
```
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# composer require laravel/ui:3.* --dev
```
バージョンエラーが起きたら3.*の数字を変えて再度実施すればいける。

パッケージがインストールできたら、フロントエンドのスカフォールドをインストールします。
```
// 基本的なスカフォールドを生成
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan ui bootstrap
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan ui vue
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan ui react
 
// ログイン／ユーザー登録スカフォールドを生成 
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan ui bootstrap --auth
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan ui vue --auth
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan ui react --auth
```
これらはすべてきちんとインストールしてください。

完了後、http://localhost/ にアクセスするとヘッダーにログイン、会員登録のリンクが表示されます。
そこからアクセスすると各ページに飛びます。
デザインが当たってなかったら以下で解決できます。
```
Node.jsとNPMのインストール状況確認（なければインストールして下さい）
~/laravelソースを格納するのフォルダ名/src $ node -v
~/laravelソースを格納するのフォルダ名/src $ npm -v
```
Laravelをインストールすると、package.jsonがあり、PHPの代わりにNodeの依存パッケージが定義されている所が異なるので以下のコマンドで、依存パッケージをインストールしてください。
```
~/laravelソースを格納するのフォルダ名/src $ npm install
```
Mixの実行
```
Laravelに含まれるpackage.jsonファイル上のNPMスクリプトの一つをMixの実行で起動してください。
~/laravelソースを格納するのフォルダ名/src $ npm run dev
```
完了後、再度アクセスするとデザインがあたった状態になります。

## 管理画面構築
phpコンテナ内で以下実行
```
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# composer require encore/laravel-admin

次にasset、configファイルを移動させます。
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"

最後に下記コマンドを実行することでインストールが完了です。
root@7eb4359bf51c:/var/www/Laravelプロジェクト名(任意)# php artisan admin:install
```
http://localhost:8000/admin にアクセスすれば管理画面にアクセスできます。
ログイン画面が表示されればOKです！
初期ログイン情報はid,passwordともに「admin」で入れます。

以上で環境構築完了です。