SailでDocker上にLaravel環境構築 for Mac

## これなんの記事なん？
23卒研修に向けてlaravel用いるしMacでDockerの環境作ったことないしやってみるかぁと思ったらSailとかいうめちゃくちゃ便利そうなのがあったから簡単にlaravelの環境つくちゃお！ってやつ


## Dockerってなんぞ？
まず簡単にDockerについて説明。
Dockerとは？と聞くとだいたい「コンテナ型の仮想環境」とか訳のわからんことを言われて「あぁ？」っておもいません？僕は思いました。
なので概念としての大枠の理解は以下の3点だけ押さえてもらえれば大丈夫です。

**・Dockerはアプリやソフトをコンテナとして分離させるもの**

**・DockerはLinuxサーバ上で動く**

**・コンテナ1つに1つのソフトが入っている隔離された環境**


学校の教室を想像してください
* 教室はサーバです。
* 教室の中には5人組、7人組、3人組などのそれぞれ仲良しグループがあると思います。そのグループにはlaravel,MySQL,APIなど名前がついています。このグループがコンテナです。
* 生徒はグループ（コンテナ）を構成する設定です。
* 教室の黒板や備品は共用のものです。これがOSになります。
* 生徒は1日の授業が終わると教室から退室します。そのためリソースの利用は一時的です。

まぁ自分なりに解釈してみたときにこんな感じの認識だったので、わかりづらって人だったりちげえよ！ってことがあったらごめんなさい。

## Docker使うメリットってなんなん？
そもそもメリットは何やねん！って話ですが、個人的に大きく3つほどあります。

### 1. インフラのコード化
コードさえ見ればどのような環境の設定なのかがわかります。
仮想マシンとの大きな違いですね！優しい！！！！気がする

### 2. 環境の違いが出ない
Dockerfile,docker-compose.ymlファイルというものに設定を記述してそれを配布することで人によって環境の違いなどが出ることなく、全く同じコンテナの環境で開発ができます。最高。まぁ実際の実務では苦労することもあるけど。。。

### 3. ローカルが汚れない
個人的にはこれが一番でかいです！
コンテナごとに環境を作るので自分のPCのローカル環境が汚れません！
npm installみたいな土足でづかづか人の家に入ってくる礼儀知らずに困りません！！

## laravel Sail
ここからsailについてですが、下記は公式の引用です。

https://readouble.com/laravel/9.x/ja/sail.html

> Laravel Sail（セイル、帆、帆船）は、LaravelのデフォルトのDocker開発環境を操作するための軽量コマンドラインインターフェイスです。 Sailは、Dockerの経験がなくても、PHP、MySQL、Redisを使用してLaravelアプリケーションを構築するための優れた出発点を提供します。

> 既存のLaravelアプリケーションでSailを使うことに興味を持っている場合は、Composerパッケージマネージャを使用してSailをインストールできます。

Dockerについて雑に書きましたが、実はlaravel Sailは「こいつ使えばDockerの知識とかなくてもDocker上にlaravelの環境作れんでー」というチートみたいやつ。

上記はlaravel9の公式のドキュメントですが、laravel8だと環境構築でsailが最初に記載されてるから公式も推してたんかな？知らんけど。

## やっと環境構築

### Dockerのインストール
自分は既にダウンロードしてしまっていますが、ない人は入れてください。
ダウンロードしたら利用規約でてくるので適当に受け入れて終わり、簡単

https://www.docker.com/products/docker-desktop/


### laravelのプロジェクト作成
下記のコマンドでプロジェクトを作ればもろもろ入れてくれる
`laravel-sail-test`のとこは好きな名前でええです

``` terminal:ターミナル
curl -s https://laravel.build/laravel-sail-test | bash
```

こんな感じなったら終わり！
![スクリーンショット 2022-12-10 14.35.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953393/f1939c09-f4a4-43ee-4181-a72e02706425.png)

### sail立ち上げ
さっき作ったプロジェクトに移動して、下記のコマンドでsailを立ち上げ

``` terminal:ターミナル
./vendor/bin/sail up -d
```
下記みたいなエラー出たら
``` terminal:ターミナル
Docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection
```
これでresolv.confファイルを開いて
``` terminal:ターミナル
sudo nano /etc/resolv.conf
```
nameseverってなってるとこを`8.8.8.8`に修正して再度`./vendor/bin/sail up -d`を実行！


Docker Desktopで確認すると、、、
無事コンテナが立ち上がってた
![スクリーンショット 2022-12-10 15.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953393/4c9479e2-50ba-56e4-6a0c-66d54a7659c5.png)

`http://localhost/`にアクセスすると、laravelのトップページが表示できました！
![スクリーンショット 2022-12-10 15.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953393/561b1ee3-f80c-ebc8-c7aa-d8642b2abd89.png)

下記のコマンドを打てば、コンテナを削除できます
``` terminal:ターミナル
./vendor/bin/sail down
```

![スクリーンショット 2022-12-10 15.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953393/20110e09-cb4f-69ad-1461-1996ea1b8f94.png)

## おわり
実質2回コマンド打てばDocker上にlaravelの環境ができました！
実際はdocker-compose.ymlファイルの編集などしてカスタムする必要はあるとはいえ、業務でDockerfileとdocker-compose.ymlでNuxt.jsのコンテナを作成した時は見よう見まねなのにエラー出しまくってたので簡単すぎてびっくりしました。
手軽にDocker環境を試せるので触ったことのない人はぜひどうぞ！

@Michinosuke：企画してくれてありがとう！！
他の同期の記事もみんな面白くて知らない事ばかりで勉強になってます！

明日の[アイレット株式会社 22新卒 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/iret-22)の記事は@thachさんです！