WindowsでLaravel Sail 環境構築【Laravel9】

Laravel sail初心者が書いています。
おかしな点などありましたらご指摘いただけると助かります。

環境 :
Windows10 home
Docker Desktop 4.12.0
Laravel 9

## Laravel Sailとは
Laravel Sailは、「Dockerを使ったLaravelプロジェクトの開発環境構築や操作等」を、より簡単に行うための仕組み。

## 事前に必要なもの
WindowsでLaravel sailを使用するためには事前に以下の３つをインストールする必要が有る。
* Docker Desktop
* WSL2
* Ubuntu

以下、大雑把な用語説明です。

**Dockerとは**
コンテナという仕組みを使って開発環境等の構築・共有が出来るソフト。

**Docker Desktopとは**
元々Linux用のソフトである「Docker」をWindowsやMacでもGUI付きで使えるようにしたもの。Windowsで使用するためにはDocker Desktopの他にWSL2等も必要。

**WSL2とは**
Windows上でLinuxを動作させるための実行環境。あくまで実行環境なので、実際にLinuxとして使うためにはUbuntu等のLinuxのディストリビューションも必要。

**Ubuntuとは**
Linuxのディストリビューション。WSL2をインストールした上でMicroSoft StoreからUbuntu等のLinuxのディストリビューションをインストールすると、アプリケーションを使うような感覚でWindows上でLinuxが使える。


**※2023/08.23追記**
コマンド１つでWSL2とUbuntuが同時にインストールできるようになってました。
詳しくは以下の公式ページや解説サイト様を参照願います。

https://learn.microsoft.com/ja-jp/windows/wsl/install

https://chigusa-web.com/blog/wsl2-win11/

Docker Desktopのイントール

https://chigusa-web.com/blog/windows%E3%81%ABdocker%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6python%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89/


## Laravel ＋ Laravel Sail インストール
LaravelとLaravel Sailのインストール & 起動は、基本的に２回のコマンド入力だけで出来てしまう。まずは [公式](https://readouble.com/laravel/9.x/ja/installation.html) に書いてあるように下記コマンドを実行するが、この際に注意点が２つある。
```
curl -s https://laravel.build/任意のプロジェクト名 | bash
```
#### 注意点1：コマンド入力はWSL2 Linuxで行う

 [公式](https://readouble.com/laravel/9.x/ja/installation.html) にも書かれているが、コマンドの実行はWSL2上のLinuxディストリビューションで行う必要がある。なので、インストールしておいたUbuntuを立ち上げてそこで実行する。
なお、WindowsのコマンドプロンプトやGit bashを使用した場合は下記のエラーが出る。
```
bash: line 35: sudo: command not found
```
35行目にsudoコマンドが有るとのエラー。
sudoコマンドはWindowsのコマンドプロンプトやGit bashでは使用不可。ちなみに、コマンド内のURL [https://laravel.build/example-app](https://laravel.build/example-app) を直接ブラウザで開くと実行内容が見れるので、エラーメッセージ通り35行目にsudoがあることが確認できる。

#### 注意点2：ディレクトリは /mnt を避ける

Ubuntuに入ってみると `/mnt/c` というディレクトリが有るのがわかる。
この `/mnt/c` はホストPCのCドライブをマウントしている（Windowsのショートカットフォルダのようなイメージ）。そのため、ファイルの編集がしやすい `/mnt/c` 以下にLaravelプロジェクトを作成したほうが良いのではないかと思っていた。しかし、この領域にプロジェクトを作成してしまうと、異なるOS同士をデータが行き来することになり、特にLaravel等のファイル数の多いプログラムの場合は動作が重くなってしまう。

なので、 `/mnt/c` 以下ではなく `/home` 以下のディレクトリ等で上記の`curl -s https://laravel.build/任意のプロジェクト名 | bash` コマンドを実行したほうが良い。

なお、`/home` 以下のディレクトリにあるファイルであってもホストPCのExplorerで操作したりエディタで編集したり出来る。そのあたり含めて下記の記事様がわかりやすく説明してくださってます。

https://www.aska-ltd.jp/jp/blog/197

#### コマンド実行

上記の注意点２点を踏まえ、上述したコマンド `curl -s https://laravel.build/任意のプロジェクト名 | bash` を実行する。初回だと処理に数分～数十分ほど時間がかかる。実行終了間際にはパスワードの入力を求められる。
```
Please provide your password so we can make some final adjustments to your application's permissions.    
[sudo] password for username:  
```
パスワードを入力しエンター。
問題なく完了したら以下コマンドを実行。

```
cd 任意のプロジェクト名 && ./vendor/bin/sail up -d
```
こちらも初回は少し時間がかかる。なお、このコマンド内の`./vendor/bin/sail up -d`でdockerのimageやコンテナを作成・起動している。`-d`はバックグラウンドで実行するためのオプション。imageやコンテナの設定については、１つ前のコマンドで作成されたプロジェクトフォルダ直下のdocker-compose.ymlに書かれている。

#### 動作確認
コンテナが起動している状態でブラウザで [http://localhost/](http://localhost/) にアクセスすると下記のようなLaravelデフォルト画面が表示されるはず。
![cap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985396/2cbc7687-e16d-9efd-394b-82f8c11f9f50.png)


## エイリアスを登録する

これも [公式](https://readouble.com/laravel/9.x/ja/sail.html#configuring-a-shell-alias) に書いてある内容。
Laravel Sailのコマンドに関するスクリプトは `プロジェクト名/vendor/bin/` 内のsailというファイルに書かれているが、dockerやLaravelプロジェクトを操作するのに毎回 `./vendor/bin/sail` を入力するのは面倒なので、「sail」と入力すれば `./vendor/bin/sail` と同じ意味になるようにエイリアス（ショートカットやユーザー辞書のようなもの）を登録する。

#### .bashrcファイル編集・反映
エイリアスは.bashrcというファイルを編集することで登録できる。Ubuntuでホームディレクトリ `/home/ユーザー名` に移動すると.bashrcがあるので `nano .bashrc` コマンド等でファイルを開き、最下部等に下記コードを追加し上書き保存する。

```
alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'
```
編集が終わったら下記コマンドを実行して.bashrcの変更をシステムに反映させる。
```
source ~/.bashrc
```
反映後はsailコマンドが使えるので、例えばコンテナ起動であれば `sail up -d` で実行できる。


## docker-compose.ymlを編集する
コンテナの追加や削除を行いたい場合はdocker-compose.ymlを編集する。編集前に`sail down`コマンドで一旦コンテナを削除し、編集後に`sail up -d`でコンテナを作成し直すと編集内容が反映される。

#### phpMyAdmin追加
今回はphpMyAdminを追加すため以下の記述を追加した。

```yml
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        ports:
            - 8080:80
        environment:
            MYSQL_USERNAME: '${DB_USERNAME}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            PMA_HOST: mysql
        networks:
            - sail
```
コンテナを作成し直した後に [http://localhost:8080/](http://localhost:8080/) にアクセスするとphpmyadminのログイン画面が表示される。idとパスワードにはenvファイルに記載されている値が設定される。
```
DB_USERNAME=sail
DB_PASSWORD=password
```
#### 不要コンテナ削除
また、デフォルトで入っているredisやselenium等のコンテナも今のところ不要なのでコメントアウトにした。なお、この際にservicesの一番上にあるlaravel.test（デフォルト名）内の「depends_on」という項目も適宜修正する必要がある。
```yml
depends_on:
     - mysql
     # - redis
     # - meilisearch
     - mailhog
     # - selenium
```
depends_onは依存関係を表している。例えば、laravel.testコンテナのdepends_onにmsqlと書いた場合、コンテナの起動順序が mysql → laravel.test となる。

一般的なdocker-compose.ymlの内容については下記の記事にも書かせて頂いてます。

https://qiita.com/monji586/items/f41695201c46ed23ff53#docker-composeyml%E3%81%AE%E5%86%85%E5%AE%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6