Laravel11の開発環境をDockerで構築する方法

久々にLaravelを使う(前回使ったのは6系だったな？）ので、備忘録を残します！
今回はDockerを使って環境を構築してみたいと思います！

# 環境
- WSL2
- Laravelは11系を使用
- PHPは8.2系にアップデート済み
- DockerはDocker Desktop for Windowsを利用

PHPが7系で8系にアップデートしたい方はこちらを参考にしてください

https://qiita.com/curacao/items/b4d4e645489294fb1f57

# Laravelプロジェクトの作成
まずはcomposerを使ってLaravelプロジェクトの作成を行います。
開発を行うディレクトリに移動して次のコマンドを実行します。
```
composer create-project laravel/laravel hoge-app
```
※WSL環境で開発を行う場合、プロジェクト作成の場所は結構大事になってきます！ **推奨は`~/`以下です！**
理由に関してはこちらの記事を参照

https://qiita.com/curacao/items/84b5858378c1db1c41c2

## Laravel Sailのインストール
Laravel Sailとは、Laravelの開発環境をDockerを利用して簡単にセットアップできるツールです。
これを入れる事により、DockerでLaravelを動かすために必要なものを全て入れてくれて、Dockerの知識がなくても簡単にLaravelの開発環境を準備することができます。

インストールするために作成したプロジェクトに`cd hoge-app`で移動します。
その後、Laravel Sailをインストールします。
```
php artisan sail:install
```
↑のコマンドを実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/62718649-637a-dae4-667a-9daabc698952.png)
> Which services would you like to install?

と聞かれるので該当するものを選びましょう！今回は`mysql`を選択しました！

## プロジェクトを起動してみる
Laravel sailのインストールが無事完了すると次のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/60c24761-f150-7c05-504a-ca8a850ee315.png)
> ./vendor/bin/sail up
> ./vendor/bin/sail artisan migrate

ここにあるように、これらのコマンドを実行します。

まずはプロジェクトの立ち上げるために
```
./vendor/bin/sail up
```
を実行します。
このコマンドでDockerコンテナが立ち上がらり、Laravelの開発に必要になるWebサーバーやデータベースなどのサービスが実行されます！

問題がなければDocker Desktopの方でも該当プロジェクトのstatusがRunnningとなり起動していることを確認できると思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/b84c8428-c2c2-6f8d-21f9-1752e3890626.png)

## マイグレーションを実行
次にマイグレーションを実行するために
```
./vendor/bin/sail artisan migrate
```
を実行します！
先ほどコマンドを実行した画面はログがでているので、新しくターミナルを開きそこで実行してください。

## ポートの変更
これで通常localhostにアクセスするとLaravelの画面が表示すると思うのですが、私の場合WSLでApacheなどのwebサーバーがすでにあるため、localhostにアクセスしてもこのプロジェクトが表示されることがありません。
なので、このプロジェクトのポート番号を設定してあげる必要があります。

具体的には
- docker-compose.yml
- .env
の２つのファイルで設定を追加します

### docker-compose.ymlの変更
こちらのファイルの`services.laravel.test.ports`の項目を探し任意のポート番号に変更します
デフォルトでは
`'${APP_PORT:-80}:80'`となっていると思うので、この`-80`の部分を任意の数値に変えます

``` docker-compose.yml
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.3
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.3/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-8888}:80'
```

### .envに追加
.envには新たにポートの設定を追加します。
docker-compose.ymlで設定したポート番号と同じ番号を設定してください！
``` .env
APP_PORT=8888
```

### コンテナの再起動
ここまで設定したらSailコンテナを再起動する必要があります！
コンテナの停止と起動は
```
./vendor/bin/sail down
./vendor/bin/sail up
```
でしたね！
ここではこれまでの順序通りにやっていたとしてもう少し詳しく説明します。
先ほど`./vendor/bin/sail up`で開いていたターミナルを開き、`Ctrl + c`で実行を中断させましょう。
そうすると
> Gracefully stopping... (press Ctrl+C again to force)
[+] Stopping 2/2
 ✔ Container hoge-app-laravel.test-1  Stopped                                                                                                                                                       0.8s 
 ✔ Container hoge-app-mysql-1         Stopped 

 となるはずです。
 
 次にコンテナを停止させます。
```
./vendor/bin/sail down
```
でSailコンテナを完全に停止させます。

> ./vendor/bin/sail down
[+] Running 3/3
 ✔ Container hoge-app-laravel.test-1  Removed                                                                                                                                                       0.0s 
 ✔ Container hoge-app-mysql-1         Removed                                                                                                                                                       0.0s 
 ✔ Network hoge-app              Removed 

 となったら完了です。

 その後、再度コンテナを起動します
 ```
 ./vendor/bin/sail up
 ```
 
 を実行します。
 補足ですが、
 ```
 ./vendor/bin/sail up -d
 ```
 のように末尾に`-d`を付けることにより、バックグラウンドで実行(デタッチモード)することも可能です！
 ログなどを見たい場合には`-d`を付けないで実行し、ターミナルをそのまま他の作業でも使いたい場合には`-d`をつけて実行するといいと思います！

 その後、`localhost:8888`にアクセスしてLaravelの画面が表示されたら無事作業完了です！

 
# `./vendor/bin/sail`って打つの面倒くさい
ここまで作業してきて思った方いるでしょう、そう、`./vendor/bin/sail`って毎度入力するの面倒くさい・・・
そんな方に朗報です、エイリアスを登録しましょう！
ご自身の環境に合わせて`.bashrc`や`.zshrc`などに次のエイリアスを登録します
```
alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'
```
これを追加すると、今まで`./vendor/bin/sail up`と入力していたのが、`sail up`で完結します！
`.zshrc`などを更新したら`source ~/.zshrc`をして再読み込みをするのをお忘れなく！

# 終わりに
初Dockerだったのですが、ここまで簡単に構築できてびっくりです。
逆に、Dockerの設定を自分で全くしていないので、これを自分で設定しなければならないとなると、ちょっと怖いですね！
今後の課題ということで、やりながら覚えていきます！

# 参考サイト
[Laravel11系インストール](https://readouble.com/laravel/11.x/ja/installation.html)
[Laravel Sail](https://laravel.com/docs/11.x/sail)