podman で Caddy + CakePHP5 を動かす

前回の続きです。php-fpm コンテナに CakePHP5 をインストールできたのでいよいよ CaddyServer を入れます。

目的の構成

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

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

手順

Caddy コンテナ

Caddyfile を作成します。 / で CakePHP をホストする場合はシンプルです。

$ mkdir conf
$ vi conf/Caddyfile
:80 {
	# Set this path to your site's directory.
	root * /usr/share/caddy/app/webroot
	encode gzip

	# Enable the static file server.
	file_server

	# Another common task is to set up a reverse proxy:
	php_fastcgi localhost:9000

	# log
}

最初 /app などのサブディレクトリでホストしようとしましたが、参考リンクによるとサブディレクトリでホストするのは難しいらしいのでそうそうにあきらめました。

$ podman run --name caddy -p 8080:80/tcp \
  -v ./conf/Caddyfile:/etc/caddy/Caddyfile \
  -v ./html:/usr/share/caddy \
  caddy:latest

ここまでで MariaDB、Caddy、php−fpm の3つのコンテナが揃いました。podman 的には kubernetes の yaml ファイルにしろってことなので簡単に生成するために、podman-desktop で pod を作ります。

そのまま pod を yaml に吐き出したものを少し修正します。修正した結果はこんな感じです。

# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.4.4
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2024-04-29T05:49:28Z"
  labels:
    app: caddy-pod
  name: caddy-pod
spec:
  containers:
  - args:
    - mariadbd
    image: docker.io/library/mariadb:11.3
    name: maria
    ports:
    - containerPort: 3306
      hostPort: 3306
    - containerPort: 80
      hostPort: 8080
    resources: {}
    securityContext:
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: maria-data
  - image: docker.io/library/caddy:latest
    name: caddy
    resources: {}
    securityContext:
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE
    volumeMounts:
    - mountPath: /etc/caddy/Caddyfile
      name: caddy-file
    - mountPath: /usr/share/caddy
      name: html-caddy
  - args:
    - php-fpm
    image: localhost/my-php:latest
    name: php
    resources: {}
    securityContext:
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE
    volumeMounts:
    - mountPath: /usr/share/caddy
      name: html-fpm
    - mountPath: /usr/local/etc/php/php-fpm.conf
      name: fpm-conf
    - mountPath: /usr/local/etc/php/php.ini
      name: php-ini
  restartPolicy: Never
  volumes:
  - hostPath:
      path: /opt/ws/podman-caddy/maria/data
      type: Directory
    name: maria-data
  - hostPath:
      path: /opt/ws/podman-caddy/conf/Caddyfile
      type: File
    name: caddy-file
  - hostPath:
      path: /opt/ws/podman-caddy/html
      type: Directory
    name: html-caddy
  - hostPath:
      path: /opt/ws/podman-caddy/html
      type: Directory
    name: html-fpm
  - hostPath:
      path: /opt/ws/podman-caddy/php-fpm/php/php-fpm.conf
      type: File
    name: fpm-conf
  - hostPath:
      path: /opt/ws/podman-caddy/php-fpm/php/php.ini-development
      type: File
    name: php-ini
status: {}

この yaml ファイルで pod を起動してみます。

$ podman play kube caddy-pod.yaml

localhost:8080 にブラウザアクセスしてみます。

MariaDB との接続がまだできていませんが、動作するところまで到達しました。

参考

The “subfolder problem”, OR, “why can’t I reverse proxy my app into a subfolder?” – Wiki – Caddy Community