podman で cakephp5を動かす

だいぶ佳境に入ってきましたが podman で cakephp5 を動かす続きです。php-fpm コンテナを作り、CakePHP5 をインストールします。CaddyServer は長くなるので次の記事にします。

目的の構成

一旦、今回 podman で建てようとしているコンテナとポートの構成を説明しておきます。

  • CaddyServer ホストポート:8080 > コンテナポート:80
  • php-fpm ホストポート:- > コンテナポート:9000
  • MariaDB ホストポート:3306 > コンテナポート:3306
  • ./html フォルダを作り CaddyServer と php-fpm からそれぞれリンクする

本来なら MariaDB のポートは、php-fpm からしかアクセスしないのでホスト側に露出しなくて良いのですが、ホスト側から触れたほうが便利なので便宜上開けてます。インターネット上のサーバに建てる際は開けないほうがいいでしょう。

Caddy と php-fpm コンテナは分けなくてもいいのかもしれませんが今回は分けています。

php-fpm の設定はちょっと面倒なのでちゃんと手順を追って示していきます。

手順

php-fpm コンテナ

php-fpm イメージのビルド

php のコンテナはイメージ持ってくるだけでは済まないので Dockerfile をつくります。

FROM php:8.3-fpm-bookworm
LABEL MAINTAINER="mnishi"
ARG UID=1000
ARG GID=1000

RUN apt-get update && \
    apt-get install -y git zip unzip vim libonig-dev libxml2-dev wget && \
    docker-php-ext-install intl pdo_mysql bcmath mbstring simplexml
RUN wget https://getcomposer.org/installer -O composer-installer.php && \
    php composer-installer.php --filename=composer --install-dir=/usr/local/bin && \
    composer self-update

RUN usermod  -u $UID www-data && \
    groupmod -g $GID www-data

WORKDIR /var/www

イメージは、Debian の方がまだ慣れているので 8.3-fpm-bookworm としました。

apt-get で必要なモジュールをインストールしてますが、vim は完全な好みなので入れなくていいです。wget も不要かもしれません。

docker-php-ext-install で CakePHP に必要なモジュールをインストールします。

/usr/local/bin に composer をインストールします。

ARG UID= とARG GID= は、ホスト側の実行ユーザーの uid、gid を渡すための環境変数です。もしかすると初期値はいらないかもしれません。

php-fpm コンテナの起動

ビルドする前に www-data ユーザをホストに作っておき、ログインユーザーのグループにも追加しておきます。

$ useradd -M www-data
$ usermod -aG www-data [ログインユーザー]

ビルドします。Dockerfile と同じフォルダで以下のコマンドを実行します。

$ buildah bud --build-arg UID=$(id -u www-data) --build-arg GID=$(id -g www-data) --tag my-php . 

一旦コンテナを起動して、設定ファイルを php-fpm フォルダに取り出します。(フォルダ名はなんでもいいです。)

$ mkdir php-fpm
$ podman run --name tmp-php -d localhost/my-php
$ podman cp tmp-php:/usr/local/etc/php/php.ini-production ./php-fpm
$ podman cp tmp-php:/usr/local/etc/php/php.ini-development ./php-fpm
$ podman cp tmp-php:/usr/local/etc/php/php-fpm.conf ./php-fpm
$ podman rm -f tmp-php

使わないかも(設定を変更しないかも)しれませんが、一応 php.ini と php-fpm.conf を取ってきます。

取ってきた設定ファイルを使用してコンテナを起動します。

podman run -d --name php \
    -v ./php-fpm/php/php-fpm.conf:/usr/local/etc/php/php-fpm.conf \
    -v ./php-fpm/php/php.ini-development:/usr/local/etc/php/php.ini \
    -v ./html:/usr/share/caddy \
    my-php

起動に失敗するようでしたら、-d を外してエラーを眺めてください。

php-fpm コンテナ内で CakePHP のインストール

ここまで全てがうまく行っていれば、コンテナの中に入って composer で CakePHP をデプロイできるはずです。

; ホスト側から
$ podman exec -it caddy-pod-php /bin/bash 

 ; コンテナの中に入った
# cd /usr/share/caddy
# composer create-project --prefer-dist cakephp/app:"5.*" app
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? yes
; root  で動かしているよと怒られるが無視する

.... いろいろログが流れる

Set Folder Permissions ? (Default to Y) [Y,n]? y
Permissions set on /usr/share/caddy/app/tmp/cache
Permissions set on /usr/share/caddy/app/tmp/cache/models
Permissions set on /usr/share/caddy/app/tmp/cache/persistent
Permissions set on /usr/share/caddy/app/tmp/cache/views
Permissions set on /usr/share/caddy/app/tmp/sessions
Permissions set on /usr/share/caddy/app/tmp/tests
Permissions set on /usr/share/caddy/app/tmp
Permissions set on /usr/share/caddy/app/logs
Updated Security.salt value in config/app_local.php

流行りのルートレス構成ではないので、怒られますがひとまずそのまま行きます。(慣れた所でもう一度ルートレス構成をやってみてもいいかもしれない。)

CakePHP のインストールで php モジュールが不足してエラーが出た場合は、exec でコンテナ内に入り docker-php-ext-install で不足モジュールをインストールして composer が動作するか確認します。
うまく行ったら、Docker ファイルに不足モジュールを追加しします。その後、イメージのビルドからやり直します。

参考

podman で nginx + php + mariadb を立ち上げてみる | zu-min.com