Docker で AL2023 にPHP7.3.1をインストールして FuelPHP を動かしてみた

# はじめに
### 経緯
新しい職場で FuelPHP を使っているらしく、さらにクラウドを AWS に移行するみたいなので、ローカル環境用に AmazonLinux2023 のイメージを引っ張ってきて、 FuelPHP の wellcom ページが動くところまで構築してみた。
AmazonLinux2023 で FulePHP 動かす記事があまりなかったので、自分の備忘録も兼ねて解説用の記事を残しておく。

### サンプルプロジェクト
https://github.com/armedcivil/AL2023_FuelPHP1.8

### 前提
docker-compose を使っているので、Docker が入っていること。
また、wellcom ページが表示されるところまでを目標としているので、DB については一切触れていない。

# Container (サービス)について
サンプルプロジェクトの docker-compose.yml を見てもらえれば分かると思うが、一応どういう立て付けでサービス定義しているか説明しておく。
```
docker-compose.yml
┝ app    #php,php-fpm,fuelphp を入れるアプリケーションサーバー
└ nginx  #http のリクエストを受け取って php-fpm と通信するサーバー
```

# 各種ファイルの説明
### docker-compose.yml
nginx が立ち上がるときに app サービスの php-fpm が起きている必要があるので、depends_on を設定している。
ports の設定は、cgi-fcgi コマンドを使ってホスト PC から php-fpm 単体で動作確認するために解放しただけで、nginx サービスのコンテナからアクセスするだけなら不要。
```
version: '3'
services:
  app:
    build: ./docker/app
    volumes:
      - ./:/var/www
    ports:
      - 9000:9000
  nginx:
    build: ./docker/nginx
    ports:
      - 9090:80
    volumes:
      - ./docker/nginx:/etc/nginx/conf.d
    depends_on:
      - app
```

### docker/app/Dockerfile
まず、PHP について、そもそも AmazonLinux2023 用のライブラリのリポジトリでは、PHP 8.1, 8.2 のみであり、それ以前のバージョンに関しては、remi レポジトリから取得するか自分でビルドする必要がある。今回は、自分でビルドしている。PHP をビルドする際、--with-openssl オプションをつけているのは、PHP のパッケージマネージャーである composer をインストールするためにつけている。
次に --with-openssl で必要になる openssl について、AmazonLinux2023 には元々 openssl3 が入っているが、下位互換がないため 1.1.1 を自分でビルドしてインストールしている。
```
FROM public.ecr.aws/amazonlinux/amazonlinux:2023.4.20240611.0

ENV PHP_VERSION=7.3.1

RUN dnf -y update
RUN dnf install -y tar gzip make gcc wget libxml2-devel bzip2-devel curl-devel readline-devel libxslt-devel less vim procps-ng perl-core

RUN wget https://www.openssl.org/source/openssl-1.1.1u.tar.gz
RUN tar -xzvf openssl-1.1.1u.tar.gz
WORKDIR /openssl-1.1.1u
RUN mkdir -p /root/lib/openssl
RUN ./config --prefix=/root/lib/openssl
RUN make
RUN make install
RUN echo "/root/lib/openssl/lib/" >> /etc/ld.so.conf.d/openssl-1.1.1u.conf
RUN ldconfig

WORKDIR /
RUN wget https://www.php.net/distributions/php-$PHP_VERSION.tar.gz
RUN tar -xzvf php-$PHP_VERSION.tar.gz 
RUN mv php-$PHP_VERSION php
WORKDIR /php
RUN ./configure --with-bz2 --enable-calendar --with-curl --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-mysqli --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd  --enable-pcntl --with-pdo-mysql --disable-posix --with-readline --enable-sockets --enable-wddx --with-xmlrpc --with-xsl --with-zlib --enable-fpm --with-openssl=/root/lib/openssl/
RUN make install
COPY php-fpm.conf /usr/local/etc/php-fpm.conf
COPY www.conf /usr/local/etc/php-fpm.d/www.conf

WORKDIR /

RUN wget 'https://getcomposer.org/installer' -O 'composer-setup.php'
RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer

WORKDIR /var/www

CMD [ "php-fpm" ]
```
### Nginx
nginx については、特別なことはしていないため、サンプルプロジェクトを参照されたし。

### FuelPHP
サンプルプロジェクトには何も入れていない。
今回、PHP 7.3.1 を入れているので FuelPHP は 1.8 以降のみ対応している。
FuelPHP のインストール方法は例として以下の通り。
```
docker-compose exec -it app /bin/bash
wget https://fuelphp.com/files/download/36 -O fuelphp-1.8.zip
unzip fuelphp-1.8.zip
mv fuelphp-1.8/ fuelphp/       ;<- Important!!
rm fuelphp-1.8.zip
exit
```

# 終わりに