DockerでのLAMP環境構築手順(Amazon Linux 2/PHP8.1(Laravel9)) ⑦Laravel 9 系のインストール(全8回)

# はじめに

かくかくしかじかで、Docker で Amazon Linux 2 ベースの LAMP 環境を構築する機会がありましたので、手順についてアウトプットします。
![スクリーンショット 2022-11-30 23.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/930bcd24-38e9-316e-bebd-cef83aea5924.png)

全 8 回を予定しています。

[① 作成する環境の確認](https://qiita.com/ryamate/items/47183e1ffd4843ef18fa)
[② Apache の導入](https://qiita.com/ryamate/items/e5ca19aece61717b6a01)
[③ PHP 8.1 系のインストール](https://qiita.com/ryamate/items/7a38eb11d64d504a7a22)
[④ Composer のインストール](https://qiita.com/ryamate/items/a8bbd003c6c2abceedc9)
[⑤ timezone, locale の設定](https://qiita.com/ryamate/items/d148bcdbdb27c5b80ad8)
[⑥ docker-compose.yml の作成 & MySQL の導入](https://qiita.com/ryamate/items/ac52b152757141f443e3)
**⑦ Laravel 9 系のインストール**
[⑧ Apache の設定ファイルの追加](https://qiita.com/ryamate/items/18747f5241df487ea497)

今回は、 **⑦ Laravel 9 系のインストール** についてです。

## 環境

以下の Docker 環境を構築します。

- Amazon Linux 2
- Apache 2.4
- MySQL 8.0.28
- PHP 8.1.x
- Laravel 9.x

## 目次

[1. php.ini の作成・編集](#1-phpini-の作成編集)
[2. Dockerfile の編集](#2-dockerfile-の編集)
[3. Docker イメージとコンテナの再作成](#3-docker-イメージとコンテナの再作成)
[4. Laravel 9 系のインストール](#4-laravel-9-系のインストール)
[5. ブラウザの確認](#5-ブラウザの確認)

# 1. php.ini の作成・編集

php.ini を作成・編集します。
php.ini は、PHP の起動時に読み込まれる設定ファイルです。

https://www.php.net/manual/ja/configuration.file.php

```ini:infra/docker/php/php.ini
zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /dev/stderr
default_charset = UTF-8

[Date]
date.timezone = "Asia/Tokyo"

[mysqlnd]
mysqlnd.collect_memory_statistics = on

[Assertion]
zend.assertions = 1

[mbstring]
mbstring.language = Japanese
```

以下の php.ini を参考に、というかそのまま使用させていただきました。

https://github.com/ucan-lab/docker-laravel-apache

https://qiita.com/ucan-lab/items/38cd04cee1f3f9e024b9

各設定の説明については以下の記事で確認できます。

https://qiita.com/ucan-lab/items/0d74378e1b9ba81699a9

# 2. Dockerfile の編集

Dockerfile の編集し、編集した内容の確認をします。

## 2-1. Dockerfile の編集

Dockerfile を編集します。

```docker:infra/docker/php/Dockerfile
FROM amazonlinux:2

# timezone environment
ENV TZ=Asia/Tokyo \
  # locale
  LANG=ja_JP.UTF-8 \
  LANGUAGE=ja_JP:ja \
  LC_ALL=ja_JP.UTF-8

RUN yum update -y \
  && yum install -y \
  glibc-langpack-ja \
  zip \
  unzip \
  vim \
  httpd

RUN amazon-linux-extras install -y epel
RUN yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

RUN yum clean metadata \
  && yum install -y \
  php81 \
  php81-php \
  php81-php-mbstring \
  php81-php-pdo \
  php81-php-xml \
  php81-php-fpm \
  php81-php-mysqlnd \
  php81-php-gd

RUN alternatives --install /usr/bin/php php /usr/bin/php81 1

# composer のインストール
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1

# ファイルのコピー
COPY ./infra/docker/php/php.ini /etc/opt/remi/php81/php.ini

CMD [ "apachectl", "-D", "FOREGROUND" ]

WORKDIR /work/backend
```

## 2-2. 編集した内容の確認

```docker
  zip \
  unzip \
```
Laravel をインストールするために必要な機能（`zip`, `unzip`）のインストールします。

```docker
# ファイルのコピー
COPY ./infra/docker/php/php.ini /etc/opt/remi/php81/php.ini
```
PHPの設定ファイル **php.ini** のコピーについて追記しました。

**php.ini** ファイルの場所については、以下の手順で確認できます。
```docker
# r_yamate @ mbp in ~/Documents/code/advent-calendar on git:backend x [21:46:09]
$ docker compose exec web /bin/bash
bash-4.2# php --ini
Configuration File (php.ini) Path: /etc/opt/remi/php81
Loaded Configuration File:         /etc/opt/remi/php81/php.ini
Scan for additional .ini files in: /etc/opt/remi/php81/php.d
Additional .ini files parsed:      /etc/opt/remi/php81/php.d/20-bz2.ini,
/etc/opt/remi/php81/php.d/20-calendar.ini,
/etc/opt/remi/php81/php.d/20-ctype.ini,
/etc/opt/remi/php81/php.d/20-curl.ini,
/etc/opt/remi/php81/php.d/20-dom.ini,
/etc/opt/remi/php81/php.d/20-exif.ini,
/etc/opt/remi/php81/php.d/20-fileinfo.ini,
/etc/opt/remi/php81/php.d/20-ftp.ini,
/etc/opt/remi/php81/php.d/20-gd.ini,
/etc/opt/remi/php81/php.d/20-gettext.ini,
/etc/opt/remi/php81/php.d/20-iconv.ini,
/etc/opt/remi/php81/php.d/20-mbstring.ini,
/etc/opt/remi/php81/php.d/20-mysqlnd.ini,
/etc/opt/remi/php81/php.d/20-pdo.ini,
/etc/opt/remi/php81/php.d/20-phar.ini,
/etc/opt/remi/php81/php.d/20-simplexml.ini,
/etc/opt/remi/php81/php.d/20-sockets.ini,
/etc/opt/remi/php81/php.d/20-sodium.ini,
/etc/opt/remi/php81/php.d/20-sqlite3.ini,
/etc/opt/remi/php81/php.d/20-tokenizer.ini,
/etc/opt/remi/php81/php.d/20-xml.ini,
/etc/opt/remi/php81/php.d/20-xmlwriter.ini,
/etc/opt/remi/php81/php.d/20-xsl.ini,
/etc/opt/remi/php81/php.d/30-mysqli.ini,
/etc/opt/remi/php81/php.d/30-pdo_mysql.ini,
/etc/opt/remi/php81/php.d/30-pdo_sqlite.ini,
/etc/opt/remi/php81/php.d/30-xmlreader.ini
```

```docker
WORKDIR /work/backend
```
`WORKDIR` を追記して、コマンドを実行する作業ディレクトリに **/work/backend** ディレクトリを指定します。

# 3. Docker イメージとコンテナの再作成

Docker コンテナを削除し、 Docker イメージを作り直して、 Docker コンテナを作成・起動します。

```bash
docker compose down
docker compose up -d --build
```

# 4. Laravel 9 系のインストール

以下のコマンドで、 Laravel をインストールします。

```bash
docker compose exec web composer create-project --prefer-dist "laravel/laravel" .
```

```bash:参考：バージョンを指定してインストールする場合
docker compose exec web composer create-project --prefer-dist "laravel/laravel=9.*" .
```

- 実行時イメージ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/949f84f3-d5eb-9ac0-1d79-3ff481390000.png)    

<details><summary>参考：実行時ログ（zip, unzip がない場合のエラー）</summary>

```bash
# r_yamate @ mbp in ~/Documents/code/advent-calendar [14:00:36] 
$ docker compose exec web composer create-project --prefer-dist "laravel/laravel" .
Creating a "laravel/laravel" project at "./"
Info from https://repo.packagist.org: #StandWithUkraine
Installing laravel/laravel (v9.3.10)
    Failed to download laravel/laravel from dist: The zip extension and unzip/7z commands are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source

In GitDownloader.php line 82:
                                                            
  git was not found in your PATH, skipping source download  
                                                            

create-project [-s|--stability STABILITY] [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--repository REPOSITORY] [--repository-url REPOSITORY-URL] [--add-repository] [--dev] [--no-dev] [--no-custom-installers] [--no-scripts] [--no-progress] [--no-secure-http] [--keep-vcs] [--remove-vcs] [--no-install] [--no-audit] [--audit-format AUDIT-FORMAT] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--ask] [--] [<package> [<directory> [<version>]]]
```

</details>

**backend/** ディレクトリ以下に Laravel のディレクトリ、ファイルが作成されました。

```bash
# r_yamate @ mbp in ~/Documents/code/advent-calendar on git:backend x [22:24:37]
$ tree -L 2
.
├── README.md
├── backend
│   ├── README.md
│   ├── app
│   ├── artisan
│   ├── bootstrap
│   ├── composer.json
│   ├── composer.lock
│   ├── config
│   ├── database
│   ├── lang
│   ├── package.json
│   ├── phpunit.xml
│   ├── postcss.config.js
│   ├── public
│   ├── resources
│   ├── routes
│   ├── storage
│   ├── tailwind.config.js
│   ├── tests
│   ├── vendor
│   └── vite.config.js
├── docker-compose.yml
└── infra
    └── docker

14 directories, 11 files
```

Laravelのバージョンを確認します。

```bash
# r_yamate @ mbp in ~/Documents/code/advent-calendar [17:03:05] 
$ docker compose exec web php artisan -V         
Laravel Framework 9.39.0
```

# 5. ブラウザの確認

ブラウザで、[http://localhost:8080/index.php](http://localhost:8080/index.php) にアクセスして、表示を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/040b0a05-1936-9319-91f6-4507a3c3fa99.png)

現時点では、 404 Not Found が表示されます。

[http://localhost:8080/](http://localhost:8080/) にアクセスすると、Apache のテストページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/1232b891-bb21-91d7-202a-8abccae0f869.png)

現時点では、Laravel のページは表示されませんでした。
これは Apache の mod_rewrite モジュールを有効化していないためです。

# おわりに

今回は、 **⑦ Laravel 9 系のインストール** についての手順でした。
次回は、 **[⑧ Apache の設定ファイルの追加](https://qiita.com/ryamate/items/18747f5241df487ea497)** の手順です。

ありがとうございました。

## 参考にしたサイト

https://github.com/ucan-lab/docker-laravel-apache

https://qiita.com/ucan-lab/items/38cd04cee1f3f9e024b9

https://qiita.com/ucan-lab/items/0d74378e1b9ba81699a9