こんにちは、UOZUです!
先日、クラウドサーバー上でWordPressの検証やベンチマークを行いましたが、今回は「AppRun」を使ってWordPressを構築してみたいと思います。
AppRunとは
まず、「AppRunとは何なのか」という点ですが、AppRunはコンテナレジストリを利用してアプリケーションを実行できる、さくらのクラウドのアプリケーション実行基盤です。
一般的なミドルウェアとコンテナイメージの違い
一般的なミドルウェアの利用方法として、たとえばWordPressを構築する場合は、Linux環境にNginx、PHP、データベースなどをインストールする構成が想定されます。
ただし、先日のWordPressの記事で紹介したように、AlmaLinux 9の構成では、OS標準で提供されているミドルウェアの中から一定のバージョンを選択する必要があります。これは、通常ミドルウェアがOSのライブラリに依存しているためです。


この場合、特定バージョンのミドルウェアを導入するには、別途ソースからインストールする必要があったり、バージョンを変更する際にミドルウェアのアンインストールと再インストールが必要になったりするため、手軽にミドルウェアを切り替えることが難しくなります。
一方、コンテナイメージは、ミドルウェア本体と依存するライブラリをまとめてパッケージ化したものです。

そのため、OS環境に強く依存せず、仮想化された実行環境として、さまざまなバージョンのミドルウェアを選択しやすくなります。
さらにAppRunでは、サーバーOS自体を意識することなく、さくらのクラウド上でコンテナアプリケーションを実行できます。

どこまでコンテナ化するのか
上記の図では、Webサーバー、WordPress(PHP)、データベースをすべてAppRun上で動かす構成を想定しています。
ただし、AppRunの仕様上、使用可能なディスク容量(一時領域)が256MiBまでである点や、そのままでは永続データとして扱えない点があります。そのため、今回はデータベースをAppRun上ではなく、仮想サーバー上に構築することにしました。

また、WebサーバーとWordPressについては、「Apache+WordPress」をまとめたコンテナイメージとして、以下のようなシンプルな構成で作成してみます。

AppRun稼働まで
データベースサーバの準備
まずは、事前にデータベースサーバーを作成し、WordPress用のデータベースとデータベースユーザーを作成しておきます。
今回は、仮想サーバーにAlmaLinux 10を利用し、MariaDB 10.11(OS標準)をインストールしました。
# dnf install mariadb-server
# systemctl enable --now mariadb
# mariadb-secure-installation
~省略
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
~省略
Thanks for using MariaDB!
# mariadb -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 13
Server version: 10.11.15-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE wordpress;
Query OK, 1 row affected (0.000 sec)
MariaDB [(none)]> CREATE USER 'wordpress'@'%' IDENTIFIED BY 'tokyo999';
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> GRANT ALL ON wordpress.* TO 'wordpress'@'%';
Query OK, 0 rows affected (0.001 sec)
# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 80 0.0.0.0:3306 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 80 [::]:3306 [::]:*
LISTEN 0 128 [::]:22 [::]:*
また、外部からデータベースへ接続できるよう、MySQL用のポートも開放しておきます。
# firewall-cmd --add-service=mysql
success
# firewall-cmd --list-all
public (default, active)
target: default
ingress-priority: 0
egress-priority: 0
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client mysql ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
コンテナレジストリの準備
続いて、WordPressをAppRunで稼働させるための下準備を行います。
さくらのクラウドのコンテナレジストリで任意のレジストリ名を登録し、あわせて利用するユーザーも追加しておきます。


Dockerコンテナイメージの準備
Docker操作用のPCからWordPressのコンテナイメージをダウンロードし、さくらのクラウドのコンテナレジストリへアップロード(push)します。
# docker pull --platform linux/amd64 wordpress:php8.3-apache
php8.3-apache: Pulling from library/wordpress
Digest: sha256:054e611334390d547c732a38b41b8f42feeb8606a29f0a934deba44e0f17b196
Status: Downloaded newer image for wordpress:php8.3-apache
docker.io/library/wordpress:php8.3-apache
# docker tag wordpress:php8.3-apache uozu-■■.sakuracr.jp/wordpress:php8.3-apache
# docker login uozu-■■.sakuracr.jp
Username: uozu
Password:
WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/
Login Succeeded
# docker push uozu-wp.sakuracr.jp/wordpress:php8.3-apache
The push refers to repository [uozu-■■.sakuracr.jp/wordpress]
a8d3cad6bb32: Pushed
cac4a54c06df: Pushed
d0d4ea2c39f4: Pushed
4f4fb700ef54: Pushed
23ebae80caf3: Pushed
3531af2bc2a9: Pushed
a923b3cdaa21: Pushed
f7417fc69aeb: Pushed
c32b51c9e3e9: Pushed
899cbc2fdb85: Pushed
~省略
c9acb28d1f70: Pushed
fdcfa2b8fc35: Pushed
php8.3-apache: digest: sha256:265d01913f22c3ad4d1ef23e9c7590aeb36a928034462da47c2a129edd40a743 size: 5536
i Info → Not all multiplatform-content is present and only the available single-platform image was pushed
sha256:054e611334390d547c732a38b41b8f42feeb8606a29f0a934deba44e0f17b196 -> sha256:265d01913f22c3ad4d1ef23e9c7590aeb36a928034462da47c2a129edd40a743
コンテナレジストリへの登録が完了したら、次にAppRunでアプリケーションを作成していきます。
AppRunのアプリケーション作成
アプリケーション名を入力し、登録済みのコンテナイメージを指定します。


また、環境変数には以下の内容を入力します。

「作成する」ボタンをクリックし、しばらく待ってみたところ……残念ながら、デプロイに失敗しました。

Dockerを修正して再構築
どうやら、wordpress:php8.3-apache のデフォルト設定のままでは、AppRun上で正常に起動しないようです。
原因を調査するため、ログを有効化して内容を確認していきます。

ログを確認しながら、以下のようなDockerfileを作成したところ、正常にデプロイでき、WordPressの画面表示まで確認できました。
# vi Dockerfile
# cat Dockerfile
FROM wordpress:php8.3-apache
RUN set -eux; \
groupadd -g 951 apprun || true; \
useradd -u 951 -g 951 -d /var/www/html -s /usr/sbin/nologin apprun || true; \
a2enmod rewrite; \
sed -ri 's/^Listen 80$/Listen 8080/' /etc/apache2/ports.conf; \
sed -ri 's/<VirtualHost \*:80>/<VirtualHost *:8080>/' /etc/apache2/sites-available/000-default.conf; \
rm -rf /var/www/html/*; \
cp -a /usr/src/wordpress/. /var/www/html/; \
cp /usr/src/wordpress/wp-config-docker.php /var/www/html/wp-config.php; \
mkdir -p /var/run/apache2 /var/lock/apache2 /var/log/apache2; \
chown -R 951:951 /var/www/html /var/run/apache2 /var/lock/apache2 /var/log/apache2; \
printf '%s\n' \
'<Directory /var/www/html>' \
' Options FollowSymLinks' \
' AllowOverride All' \
' Require all granted' \
'</Directory>' \
> /etc/apache2/conf-available/wordpress-apprun.conf; \
a2enconf wordpress-apprun
ENV APACHE_RUN_USER=apprun
ENV APACHE_RUN_GROUP=apprun
WORKDIR /var/www/html
USER 951:951
EXPOSE 8080
ENTRYPOINT []
CMD ["apache2-foreground"]
# docker build --platform linux/amd64 -t wp-apprun:20260501-01 .
[+] Building 5.5s (7/7) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.14kB 0.0s
=> [internal] load metadata for docker.io/library/wordpress:php8.3-apache 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [1/3] FROM docker.io/library/wordpress:php8.3-apache@sha256:054e611334390d547c732a38b41b8f42feeb8606a29f0a934deba44e0f1 0.1s
=> => resolve docker.io/library/wordpress:php8.3-apache@sha256:054e611334390d547c732a38b41b8f42feeb8606a29f0a934deba44e0f17b196 0.0s
=> [2/3] RUN set -eux; groupadd -g 951 apprun || true; useradd -u 951 -g 951 -d /var/www/html -s /usr/sbin/nologin apprun 1.3s
=> [3/3] WORKDIR /var/www/html 0.1s
=> exporting to image 3.9s
=> => exporting layers 3.0s
=> => exporting manifest sha256:7fdf2d46412654766bec267c14504c8670f902e4c35aab31245b5ee0d4e6f9a3 0.0s
=> => exporting config sha256:d4ae30f9c17e2df4c03d99121d1bf13140fe920212cfb51d49331f82fe7512cf 0.0s
=> => exporting attestation manifest sha256:1281f6b79910e3400b9b53236662f6f8707ac9b9b5ab618947094230910b45e6 0.0s
=> => exporting manifest list sha256:f5ddd8a6840b7ba1cc2e9b39d696083b8779fa2df4a74a220f2eeaf3efebd1ab 0.1s
=> => naming to docker.io/library/wp-apprun:20260501-01 0.0s
=> => unpacking to docker.io/library/wp-apprun:20260501-01
# docker tag wp-apprun:20260501-01 uozu-wp.sakuracr.jp/wp-apprun:20260501-01
[root@uozu wordpress-apprun]# docker push uozu-wp.sakuracr.jp/wp-apprun:20260501-01
The push refers to repository [uozu-■■.sakuracr.jp/wp-apprun]
c32b51c9e3e9: Layer already exists
c9acb28d1f70: Layer already exists
~省略
4f4fb700ef54: Layer already exists
d0d4ea2c39f4: Layer already exists
a5f587e05427: Layer already exists
899cbc2fdb85: Layer already exists
130ffc73f3a1: Layer already exists
a8d3cad6bb32: Layer already exists
20260501-01: digest: sha256:f5ddd8a6840b7ba1cc2e9b39d696083b8779fa2df4a74a220f2eeaf3efebd1ab size: 856


さいごに
今回は、さくらのクラウド AppRunを利用して、WordPressをコンテナアプリケーションとして稼働させる手順を検証しました。
WordPressをそのままコンテナ化するだけでは正常に起動しない場面もありましたが、ログを確認しながらDockerfileを調整することで、AppRun上でもWordPressを表示できることが確認できました。
一方で、WordPressはデータベースや永続データの扱いが重要になるため、AppRun単体ですべてを完結させるのではなく、今回のようにデータベースを仮想サーバー側に分ける構成も有効です。
AppRunは、サーバーOSの管理を意識せずにコンテナアプリケーションを実行できるため、Webアプリケーションの公開や検証環境の構築などに活用しやすいサービスだと感じました。
今後も、さくらのクラウドの各サービスを組み合わせた構成について検証していきたいと思います。




