はじめに
こんにちは、hdk-tです。
皆さんは、Laravelの実行環境をコンテナで構築する場合どのようにしていますか?
私は最近まで、PHPの実行環境を構築する際は以下のプロセスを実行するコンテナを自前で構築していました。
- Nginx(Webサーバ)
- PHP-FPM(PHPの実行)
(ちなみにコレです↓↓)
しかし、以下の問題があります。
- Laravelをバージョンアップする度に、PHP-FPM、(ついでに)Nginxをアップデートする必要があり、面倒である
- Dockerのベストプラクティスである 「1コンテナ・1プロセス」に違反している
※ そもそも、無理して1コンテナにしなくても良いのではというツッコミがありそうですが、現在運用しているサービスにて、ロードバランサー配下にスケールしたコンテナを配置しているため、スケールさせるコンテナ数が増えると管理が面倒なのと、リソースを節約したいという理由から1コンテナにしています。
そこで、1つのプロセスでWebサーバとPHP実行を完結させられる方法がないか調べていたところ、FrankenPHPにたどり着いたので、その特徴と環境構築手順をまとめてみました。
FrankenPHPとは
FrankenPHPは、Go言語で書かれたモダンなPHPアプリケーションサーバです。
WebサーバーとPHP実行環境を包括しており、それらを1プロセスで実行することが可能です。
CaddyサーバーというGo言語で書かれたWebサーバーをベースにしており、それにPHPの実行環境を組み込む形で実装されているようです。
以下の特徴があります。
高速な実行速度
Webサーバプロセスが直接PHPを呼び出すことが可能なため、従来の構成 (Nginx + PHP-FPM) で発生していたプロセス間の通信がないことに加えて、Worker Modeにより高速な実行が可能。
Caddyサーバーが内包されている
Caddyのメリットである以下の恩恵がそのまま受けられる
- 高速なパフォーマンス
- HTTPSの完全自動化
- シンプルな記述の設定ファイル
Mercureに対応している
PHPでSSE(Server-Sent Events)を実装するために必要なMercureが使用できる
環境構築してみる
今回は、FrankenPHP × Laravel13 の構成で、ローカル開発やロードバランサー配下での利用を想定したDockerfileを作成してみます。
Dockerfile
# NOTE: Laravel13はphp8.5まで対応している
FROM dunglas/frankenphp:1-php8.5
WORKDIR /app
# Alias setting
RUN echo -e "\nalias ll='ls -aFl'\n"> ~/.bashrc
# Environment
ENV TZ=Japan
ENV DEBIAN_FRONTEND=noninteractive
# NOTE: HTTPで動作させるのに必要な設定
ENV SERVER_NAME=http://
ENV CADDY_GLOBAL_OPTIONS="auto_https off"
# Install basic middleware
RUN apt-get update && apt-get install -y \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
git \
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
&& apt-get install -y nodejs \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP middleware
RUN install-php-extensions \
pcntl \
intl \
zip \
bcmath \
gd \
pdo_mysql \
redis \
opcache
# Install composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
コンテナビルド
docker build ./ -t frankenphp-laravel
コンテナ実行
docker run -it --name frankenphp-laravel-container -p 80:80 frankenphp-laravel
動作確認
/app配下がルートディレクトリに設定されています。
docker exec -it frankenphp-laravel-container sh
rm -rf ./public
composer create-project laravel/laravel .
この状態で、http://localhost にアクセスするとLaravelのウェルカムページが表示されます。
※ Docker Compose などで、別途権限の設定が必要です
さいごに
これまでは、古典的な方法でコンテナを構築していたので、これからは環境構築やアップデート対応に無駄足を取られなくて済みそうです。
ただ、新しい技術ということもあり、運用実績などの参考文献は少ないですね。
個人サービスや小規模サービスであれば選択肢には入りそうです。