Laravel公式のLaravel sailで「Laravel」+「phpMyAdmin」をサクッと環境構築

この記事は シーエー・アドバンス Advent Calendar 2021 2日目の記事です。
前回の記事は @toubaruさんの 「[macOS Catalina に Frida をインストールする](https://qiita.com/toubaru/items/61f3e9583a69419dc82a)」 でした。
明日の記事は @Jeyさんです。

普段、脆弱性診断のクロール業務をしています。
開発研修として、Laravelでの開発があり、今回はDockerの知識があまりない人でも
Laravel公式が出しているsailというものを使って環境構築できるようにまとめてみました。
Laravel Sailでは現時点では未サポートのPhpMyAdminを研修では使ったりもするため（Dockerの知識がちょっと必要）追加で記載しています。


#概要
Laravel公式から出ているsailが、最近Dockerの知識がない初心者でも環境構築が楽にできる
とLaravelやPHP勉強会で耳にしたので気になったので試してみました。
また、社内研修で素のPHPでサイト作成後、Laravelでのサイト作成もあるため、
今後Dockerの知識がない人でもサクッと簡単に環境構築できるかと思い、試してことをまとめてみました。


#動作検証環境
- Mac Book Pro16(Intel)
    - OS catalina（バージョン10.15.7）
    - Docker Desktop（バージョン3.5.2）
    
#準備
Docker Desktop導入がまだの人はインストールしてください。

#これまでのLaravel導入手段まとめ

これまで、Laravel導入手段はLaravel非公式のもので様々な方法がありました。
PHPバージョン8以降から、Laravel公式からLaravel Sailが登場し、手軽にLaradockの環境構築ができるようになりました。

- Docker系
    - [Laravel Sail](https://readouble.com/laravel/8.x/ja/sail.html)
        - `curl`コマンドでLaradock環境を構築できる。
            - PHPのバージョンはデフォルトだと`8.0`
            - [現在Sailが使用できるPHPバージョン](https://readouble.com/laravel/8.x/ja/sail.html#sail-php-versions)は、 `8.1`、 `8.0` 、 `7.4`の3つ。
        - `curl`コマンドに`with -mysql`等、引数を追加することでサービスの指定もできる。
            - 指定可能なサービスは下記9つ。
                - mysql
                - pgsql
                - mariadb
                - redis
                - memcached
                - meilisearch
                - minio
                - selenium
                - mailhog
        - サービス指定しない場合のデフォルトで導入されるサービスは下記5つ
            - mysql
            - redis
            - meilisearch
            - mailhog
            - selenium
    - [Laradock](https://laradock.io/)
        - [Laradock - github](https://github.com/Laradock/laradock)
        - 全部入りのLaravel Docker環境
        - Laravel非公式
        - 設定ファイルをいじることで独自の好きな環境を作れる
        
    - [Vessel](https://vessel.shippingdocker.com)
        - PHP バージョンは7.4で止まってそう
            - PHP 7.4
            - MySQL 5.7
            - Redis (latest)
            - NodeJS (latest), with NPM, Yarn, & Gulp
        - `docker`コマンドや`docker-compose`コマンドも使えるけれど、vesselコマンドでも動くらしい。[参考：VesselでLaravelのDocker環境をサクッと作る - Qiita記事](https://qiita.com/avosalmon/items/68fbbdee3756b9b72fb9) 
    - [docker-laravel](https://github.com/ucan-lab/docker-laravel)
        - ucanさんという方が作成したLaravel開発環境
        - 最低限のLaravel開発環境が作成できる
        - [Qiitaに手順の解説あり](https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4)
        
- ローカル系
    - [PHPとComposerをローカルインストール - Laravel日本語ドキュメント](https://readouble.com/laravel/8.x/ja/installation.html#installation-via-composer)
    
# Laravel Sailで環境構築

1.Docker Desktop導入が完了したら、ターミナルを開き、作成したい任意の場所に移動します。
　（今回はデスクトップに作成します。$の後からコマンド入力してください）

```vim:Terminal
$ cd /Users/[自分のPC名]/Desktop
```
#### 確認方法：

```vim:Terminal
$ pwd

#`pwd`コマンド実施後、下記のように返ってきたらOK。
/Users/[自分のPC名]/Desktop
[自分のPC名] Desktop
```


2.下記`curl`コマンドを叩く。今回は`example-app`という名前で作成してます。

```vim:Terminal
$ curl -s "https://laravel.build/example-app" | bash
```

3.`example-app`に移動し、下記コマンドでSailの開始する

```docker:Terminal
$ cd example-app
$ ./vendor/bin/sail up -d
```

4.Sail開始後、localhostにアクセスし、Laravelの画面が表示されたらLaravel導入成功。

http://localhost/


5.下記コマンドで一旦、Sail停止します。

```docker:Terminal
$ ./vendor/bin/sail stop
```

※[Bashエイリアスの設定](https://readouble.com/laravel/8.x/ja/sail.html)
上記コマンドを短縮したい場合は、エイリアス設定しておくと`sail up`、`sail stop`と`sail`コマンドで操作ができる。

```vim:Terminal
$ alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail'
```

*Docker起動の度に、上記エイリアス設定しないと`Sail`コマンドが使えないので注意。*
Dockerで永続的にエイリアス設定する方法をご存知の方がいれば、コメントで教えていただけると嬉しいです。

6.初回起動時に`.env.example`ファイルが作成されているかと思うので、自分の環境様様に`.env`としてコピーします

```vim:Terminal
$ .env.example .env
```

7.上記⑥でコピーした`.env`ファイルの5行目（`APP_URL=`）の下にLaravelのポート番号を追記する

```yml:.env
APP_PORT=8777
```

8.上記手順③、④を再度実施し、Laravel sail起動後、`http://localhost:8777/` へアクセスし、Laravelの画面が表示されたら設定完了です。

http://localhost:8777/


#phpMyAndmiｎを追加する

>Sailは単なるDockerであるため、Sailに関するほぼすべてを自由にカスタマイズできます。

- 公式でPhpMyAndminはサポートしてない。
- 公式に上記の記載があったので、通常のDockerでPhpMyAdminを使用する時と同じ様に`docker-compose.yml`ファイルに追記していきます。

1. Sailを起動している場合、`./vendor/bin/sail stop`か`sail stop`で一旦Sailを停止します。
2. `docker-compose.yml`のmysqlの下あたりにPhpMyAdminを追記する。（インデント等も同じになるよう記載してください）

```dockerfile:docker-compose.yml
phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
            - mysql:mysql
        ports:
            - 8888:80
        environment:
            MYSQL_USERNAME: '${DB_USERNAME}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            PMA_HOST: mysql
        networks:
            - sail
```
3.PhpMyAdminでログインする際に、データベースのログイン情報が必要なので、データベース情報を追記します。

```dockerfile:.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=8888
# []内は自分が作成したデータベース名を記述する
DB_DATABASE=[example-app]
# []内は自分が作成したデータベースのユーザー名を入力する
DB_USERNAME=[username]
# []内は自分が作成したUserのパスワード入力する
DB_PASSWORD=[password]
```

4.`http://localhost:8888/index.php`にアクセスし、データベースのログイン情報を入力しPhpMyAdminにログインできれば完了です。

http://localhost:8888/index.php


# 最終確認

最後にphpMyAndminとLaravel画面が表示されるか確認し、それぞれのページが表示されれば環境構築終了。

- Laravel

http://localhost:8777/

- phpMyAndmin

http://localhost:8888/index.php

この後のLaravelを使ってのサイト作成は通常のLaravelと基本的には同じです。


# BurpSuite等のプロキシツールでLaravelアプリの通信を取得したい場合

上記、Laravelで設定したlocalhostのポート番号`8777`で通信取得できます。

# まとめ
Laravel公式がサポートしている範囲内であれば、Sailを使ったLaravelの環境構築を爆速で行えるということが分かりました。
Intel Macを持っている初心者の人であれば、curlコマンドを叩くだけでLaravelの環境構築ができてしまうので
Laravelの環境構築でつまずくことは、大分減りそうかな。と思いました。

公式がサポートしていないサービスを使いたい等、自分でSailに追加してオリジナルで環境構築を行う場合は、
.ymlファイルやDB作成時の記載方法等のDocker知識がないと厳しそうかなと感じました。

来年1月にはLTSバージョンが出るらしいので、その時にまた適宜修正したいと考えています。