DockerでLaravel環境を構築

# はじめに
業務でLaravelを使用するので環境構築してみました。

# 検証に使用した環境
ホストOS：MacOS Monterey 12.6
Docker：20.10.14
CentOS:7
PHP：7.4.30
Laravel：7.30.6

# DockerでCentOSを用意する
[こちら](https://qiita.com/kaburankattara/items/22e63d3861fc2f4f021e)のページを参考にCentOSを用意します。
httpdで構築したLaravelにアクセスし、ソースはホストと共有したいです。
そのため、ports、volumesに設定を加えてコンテナを立ち上げます。

最終的には以下の通り

```yaml
version: "3"
services:
  centos:
    build: ./docker
    ports:
      - 8081:80
    privileged: true
    volumes:
      - ./src:/var/www/html
      - /sys/fs/cgroup:/sys/fs/cgroup:rw
    working_dir: /var/www/html
```

# 必要なものをインストール
## yumのリポジトリを最新化＋追加
まず、yumのパッケージをアップデートし、PHPをインストールためにRemi Repositoryを追加します。

```shell
sh-4.2# yum -y update
sh-4.2# yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

## httpd、git、zip、unzipをインストール
httpdは、Webサーバに使用し、 git、zip、unzipは、Laravelのインストーラダウンロードやプロジェクト作成に必要のため、インストールします。

```shell
sh-4.2# yum -y install httpd git zip unzip 
```

## PHPと拡張機能をインストール
[ドキュメント](https://readouble.com/laravel/7.x/ja/installation.html)より、Laravel Homestead仮想マシンを使用しない場合、
以下のソフトウェアがインストールされている必要があります。

・PHP >= 7.2.5
・BCMath PHP拡張
・Ctype PHP拡張
・Fileinfo PHP extension
・JSON PHP拡張
・Mbstring PHP拡張
・OpenSSL PHP拡張
・PDO PHP拡張
・Tokenizer PHP拡張
・XML PHP拡張


PHPと拡張機能をインストールします。

```shell
sh-4.2# yum -y install php74 php74-php php74-php-bcmath php74-php-ctype php74-php-json php74-php-mbstring php74-php-openssl php74-php-tokenizer php74-php-xml
```

インストールしたphp74を「php」でコマンド実行できるようにシンボリックリンクを作成します。

```shell
sh-4.2# ln -s /usr/bin/php74 /usr/bin/php 
```

### インストール結果を確認
PHPのバージョンを確認します。

```shell
sh-4.2# php -v
PHP 7.4.30 (cli) (built: Jun  7 2022 08:38:19) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
```

次に組み込まれたモジュールを確認します。
「php -m」で一覧されます。
サーバー要件にあったPDOがありませんが、PHP 5.1.0から標準で導入されています。

```shell
sh-4.2# php -m
[PHP Modules]
bcmath
・・・
ctype
・・・
fileinfo
・・・
json
・・・
mbstring
・・・
openssl
・・・
tokenizer
・・・
xml
・・・
[Zend Modules]
```


## Composerをインストール
Composerのインストーラーをダウンロードします。
インストーラーはPHPで作られてるため、念のため拡張子をつけておきます。

```shell
sh-4.2# php -r "copy('https://getcomposer.org/installer', 'installer.php');"
sh-4.2# ls
installer.php
```

インストーラーを実行します。

```shell
sh-4.2# php installer.php
All settings correct for using Composer
Downloading...

Composer (version 2.2.18) successfully installed to: /var/www/html/composer.phar
Use it: php composer.phar
```

実行が成功すれば、インストーラーは不要のためファイルを削除します。

```shell
sh-4.2# php -r "unlink('installer.php');"
```

スクリプトの実効結果として、「composer.phar」が出力されます。
composerコマンドとして実行出来るように「/usr/local/bin」に移動します。

```shell
sh-4.2# mv composer.phar /usr/local/bin/composer
```

# Laravelの環境を構築
## Laravelのインストーラをダウンロード
Composerを使用し、Laravelインストーラをダウンロードします。

```shell
sh-4.2# composer global require laravel/installer
```

## Laravelのプロジェクトを作成
次にプロジェクトを作成します。
「composer create-project --prefer-dist laravel/laravel プロジェクト名 バージョン番号」で作成できます。
今回はLaravel7でhogeプロジェクトを作成します。

```shell
sh-4.2# composer create-project --prefer-dist laravel/laravel hoge 7
```

作成が出来ればプロジェクトディレクトリに移動し、バージョンを確認します。
artisanコマンドはプロジェクトディレクトリ内でのみ使用できます。

(こちら)[https://laravelversions.com/ja/7]でバージョンを比較できます。

```shell
sh-4.2# cd hoge/
sh-4.2# php artisan -V
Laravel Framework 7.30.6
```

# httpdを設定
次にhttpdを設定します。

## 自動起動を設定
httpdが自動起動するように設定します。

```shell
sh-4.2# systemctl enable httpd
```
## httpd.confを修正
Laravelプロジェクトには「PJディレクトリ/public」内に.htaccessがあります。
AllowOverRideがNoneのままだと.htaccessでの設定の書き換えが効かなくなります。
そのため、httpd.confを修正し、「/var/www/html」へのAllowOverRideをAllに修正します。

```shell
sh-4.2# vi /etc/httpd/conf/httpd.conf 
<Directory "/var/www/html">
　　・・・

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride All

　　・・・
</Directory>
```

## 再起動
httpd.confを修正出来たらリスタートします。

```shell
sh-4.2# systemctl restart httpd
```

## ステータスを確認
リスタートが出来たらステータスを確認し、httpdがアクティブになっていることを確認します。

```shell
sh-4.2# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-09-27 05:17:06 UTC; 42s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 585 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /docker/64d1ffc8d42daf603a7b36e84832ab1cf52cb5690ac8b7158f92ce692e9f2f77/system.slice/httpd.service
           ├─585 /usr/sbin/httpd -DFOREGROUND
           ├─586 /usr/sbin/httpd -DFOREGROUND
           ├─587 /usr/sbin/httpd -DFOREGROUND
           ├─588 /usr/sbin/httpd -DFOREGROUND
           ├─589 /usr/sbin/httpd -DFOREGROUND
           └─590 /usr/sbin/httpd -DFOREGROUND

Sep 27 05:17:06 64d1ffc8d42d systemd[1]: Starting The Apache HTTP Server...
Sep 27 05:17:06 64d1ffc8d42d httpd[585]: AH00558: httpd: Could not reliably ...e
Sep 27 05:17:06 64d1ffc8d42d systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
```

# 環境構築の最後に
環境構築が完了したら、最後にyumのキャッシュをクリアしておきます。

```shell
sh-4.2# yum clean all
```

# Laravelの動作を確認
## Laravelのデフォルトページを表示
「http://localhost:8080/hoge/public 」にアクセスします。
Laravelのデフォルトページが表示されていれば成功です。

## 追加ページの表示を確認
Laravelでは、「PJディレクトリ/routes/web.php」でURLを管理出来ます。
「hello」を返すRouteを追加し、httpd.confへの修正が適用されていることを確認します。

```src/hoge/routes/web.php
Route::get('hello', function () {
    return 'hello';
});
```

「http://localhost:8080/hoge/public/hello」にアクセスします。
helloが表示されていれば成功です。


# 参考文献

https://readouble.com/laravel/7.x/ja/installation.html

https://laravelversions.com/ja