はじめに
KUSANAGI9 および KUSANAGI Runs on Docker(以下RoD) では、データベースとしてMariaDBを使用しています。MariaDBは、現在Oracleが所有しているMySQL 5.6系からフォークしたものですが、WordPressはMySQL 8以降のデータベースも使用できます。そこで、簡単にデータベースを変更できる RoD で、MySQLを使用したWordPress環境を構築しました。
MySQL と MariaDBの違い
MySQLの使用に関しては、MySQLとMariaDBの違いがあります。その中でも大きな違いは、データベースに対するユーザ認証に関するものです。
mariadb では、ユーザとパスワードの暗号化方式として mysql_native_password
をデフォルトで使用し、パスワードハッシュ方式に基づき認証します。
MariaDB [(none)]> SELECT User, Host, Plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User | Host | plugin |
+------------------+-----------+-----------------------+
| mariadb.sys | localhost | mysql_native_password |
| root | localhost | mysql_native_password |
| mysql | localhost | mysql_native_password |
| | localhost | |
| | alma8 | |
| CbBmaaTCfaaIBgaa | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
6 rows in set (0.005 sec)
一方、MySQL 8.0以降では、caching_sha2_password
というSHA256暗号に基づき認証し、mysql_native_password
は非推奨となりました。
mysql> SELECT User, Host, Plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User | Host | Plugin |
+------------------+-----------+-----------------------+
| MVFB2lF46j | % | caching_sha2_password |
| root | % | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)
MariaDBで caching_sha2_password するプラグインは用意されていますが、デフォルトではインストールされていないことがあります。
MySQL 8 環境への変更
kusanagi-docker コマンドは、MySQL 8 を使用することを考慮していません。そこで、新しくWordPress環境を用意し、MySQL 8 の環境に変更します。
RoD による WordPress環境の作成
まずは、以下のように WordPress 環境を作成します。
$ kusanagi-docker provision --wplang ja --fqdn wp.local wordpress
(中略)
$ cd wordpress
$ curl -Ik https://wp.local/
HTTP/2 200
server: nginx
date: Fri, 11 Oct 2024 02:24:56 GMT
content-type: text/html; charset=UTF-8
x-b-cache: BYPASS
vary: User-Agent
link: <https://wp.local/index.php?rest_route=/>; rel="https://api.w.org/"
x-xss-protection: "1; mode=block"
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
alt-svc: h3=":443"; ma=2592000
x-f-cache: BYPASS
x-signature: KUSANAGI
DBの変更
RoD では、DB用のイメージとして docker.io/mariadb:10.6.x
などのイメージを使用しています。DBとしてMySQLを使用するにあたり、docker.io/mysql:8.4.2
を使用しました。mariadb と MySQL 8.4 とのデータベースの非互換性を考慮して、/var/lib/mysql のボリュームを削除して、再作成します。
まずは、docker-compose 環境を停止します。
$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
wordpress_db mariadb:10.6.19-focal "docker-entrypoint.s…" db 7 days ago Up 44 hours
wordpress_ftp primestrategy/kusanagi-ftpd:1.0.11-r4 "/docker-entrypoint.…" ftp 7 days ago Up 44 hours
wordpress_httpd primestrategy/kusanagi-nginx:1.27.2-r0 "/docker-entrypoint.…" httpd 7 days ago Up 44 hours (healthy) 8443/udp, 0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp
wordpress_php primestrategy/kusanagi-php:8.1.29-r5 "/usr/local/bin/dock…" php 7 days ago Up 44 hours (healthy)
$ docker-compose down
[+] Running 6/6
? Container wordpress_ftp Removed 0.0s
? Container wordpress_db Removed 1.0s
? Container wordpress_php Removed 0.1s
? Container wordpress_httpd Removed 1.1s
? Network wordpress_default Removed 0.8s
データベースにマウントしている volume を削除します。
$ docker volume ls | grep wordpress
local wordpress_database
local wordpress_kusanagi
$ docker volume rm wordpress_database
docker-compose.yaml の db イメージを変更し、mysql:8.4.2
を指定します。
## MYSQL-
db:
container_name: wordpress_db
#image: mariadb:10.6.19-focal
image: mysql:8.4.2
restart: always
...
Dockerイメージの mariadb
と mysql
は、同じ環境変数名を使用してデータベース、ユーザ、パスワードを設定します。そのため、mariadb で指定した環境変数をそのまま使用できます。
wpcli の変更
次に、wpcli を実行するためのコンテナ、config へ caching_sha2_password プラグインをインストールする必要があります。wpcli という ディレクトリを作成し、以下のDockerファイルを作成します。
FROM --platform=$BUILDPLATFORM wordpress:cli-2.11.0-php8.3
LABEL maintainer="kusanagi@prime-strategy.co.jp"
USER root
RUN apk add --no-cache mariadb-connector-c
wordpress:cli イメージは、wpcli を実行する環境を提供します。そこに、caching_sha2_password プラグインを追加するために、mariadb-connector-c パッケージをインストールするのが上記Dockerfileです。ベースOSとしてalpine が使用されているため、apk コマンドを使用しています。
次に、docker-compose.yml を修正します。wordpress:cli のイメージではなく、wpcli ディレクトリ以下のDockerfileから作成したイメージを生成します。
config:?
container_name: wordpress_config?
restart: "no"?
#image: wordpress:cli-2.11.0-php8.3?
image: wpcli?
build: ./wpcli?
...
修正後、docker-compose up -d
コマンドを実行してdocker-compose 環境を起動します。
docker-compose up -d
[+] Running 1/1
! config Warning pull access denied for wpcli, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
[+] Building 0.1s (7/7) FINISHED docker:default
=> [config internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 201B 0.0s
=> [config internal] load metadata for docker.io/library/wordpress:cli-2.11.0-php8.3 0.0s
=> [config internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [config 1/2] FROM docker.io/library/wordpress:cli-2.11.0-php8.3 0.0s
=> CACHED [config 2/2] RUN apk add --no-cache mariadb-connector-c 0.0s
=> [config] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:f59ff9f8e8bdc3e157247d64b6cff40c9556610cf0087d736e955f219d728619 0.0s
=> => naming to docker.io/library/wpcli 0.0s
=> [config] resolving provenance for metadata file 0.0s
[+] Running 6/6
? Network wordpress_default Created 0.2s
? Volume "wordpress_database" Created 0.0s
? Container wordpress_config Started 0.5s
? Container wordpress_httpd Started 0.6s
? Container wordpress_db Started 0.6s
? Container wordpress_ftp Started 0.6s
? Container wordpress_php Started
DBデータのリストア
データベース用のボリュームを削除しているため、作成時に取得している dbdump ファイルから、データベースへ内容をリストアします。DBへの接続情報は、環境変数へ設定されているので、変数を使用した記述で問題ありません。
$ docker-compose cp dbdump php:/home/kusanagi/wordpress/
[+] Copying 1/0
? wordpress_php copy dbdump to wordpress_php:/home/kusanagi/wordpress/ Copied 0.0s
$ docker-compose run config sh
/var/www/html $ mysql -u$DBUSER -p$DBPASS $DBNAME < /home/kusanagi/wordpress/dbdump
これで、MySQL 8.4 でWordPressを起動されることが出来ます。
$ curl -Ik https://wp.local/
HTTP/2 200
server: nginx
date: Fri, 11 Oct 2024 05:52:01 GMT
content-type: text/html; charset=UTF-8
x-b-cache: BYPASS
vary: User-Agent
link: <https://wp.local/index.php?rest_route=/>; rel="https://api.w.org/"
x-xss-protection: "1; mode=block"
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
alt-svc: h3=":443"; ma=2592000
x-f-cache: BYPASS
x-signature: KUSANAGI
$ curl -sLk https://wp.local/ | head -10
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name='robots' content='max-image-preview:large' />
<title>WordPress</title>
<link rel="alternate" type="application/rss+xml" title="WordPress » フィード" href="https://wp.local/?feed=rss2" />
<link rel="alternate" type="application/rss+xml" title="WordPress » コメントフィード" href="https://wp.local/?feed=comments-rss2" />
<script>
MySQL 9 も使用できるのか
最近MySQL 9がリリースされました。そこで、ついでに動作確認してみましょう。手順はMySQL 8.4と一緒です。docker-compose 環境を停止して、docker-compose.yml を修正して、docker-compose 環境を開始します。
## MYSQL-
db:
container_name: wordpress_db
#image: mariadb:10.6.19-focal
image: mysql:9.0.1
restart: always
...
MySQL 8.4と同様に、データベースをリストアします。dbdump は先ほどコピーしたので、同じものを使用できます。
$ docker-compose run config sh
/var/www/html $ ls /home/kusanagi/wordpress/dbdump
/home/kusanagi/wordpress/dbdump
/var/www/html $ mysql -u$DBUSER -p$DBPASS $DBNAME < /home/kusanagi/wordpress/dbdump
/var/www/html $
curl で確認しても、問題ありませんでした。
$ curl -Ik https://wp.local/
HTTP/2 200
server: nginx
date: Fri, 11 Oct 2024 06:02:40 GMT
content-type: text/html; charset=UTF-8
x-b-cache: BYPASS
vary: User-Agent
link: <https://wp.local/index.php?rest_route=/>; rel="https://api.w.org/"
x-xss-protection: "1; mode=block"
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
alt-svc: h3=":443"; ma=2592000
x-f-cache: BYPASS
x-signature: KUSANAGI
$ curl -sLk https://wp.local/ | head -10
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name='robots' content='max-image-preview:large' />
<title>WordPress</title>
<link rel="alternate" type="application/rss+xml" title="WordPress » フィード" href="https://wp.local/?feed=rss2" />
<link rel="alternate" type="application/rss+xml" title="WordPress » コメントフィード" href="https://wp.local/?feed=comments-rss2" />
<script>
おわりに
WordPress では MySQL 8以上でも使用できます。今回は、RoDの環境で比較的簡単にMySQL 8.0以上で動作出来ました。
もちろん、KUSANAGIでもMySQL 8以上を使用可能です。KUSANAGI9で使用するkusanagi
コマンドでは、mariadb
という文字列を内部で使用するため、kusanagi
コマンドを使用してMySQL 8.0以上を使用するのは問題があります。しかしホスト内の MariaDB を削除し、MySQL 8.0以上の使用に問題はありません。また、外部のMySQL 8 およびその互換DBサービスを使用することは、今までと同様に可能です。
MariaDBとは異なる進化を続けるMySQLですが、KUSANAGIでも使用可能な選択肢として覚えてくださると幸いです。