KUSANAGI Runs on Docker で、MySQLを使用してみる

宮﨑悟

はじめに

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イメージの mariadbmysql は、同じ環境変数名を使用してデータベース、ユーザ、パスワードを設定します。そのため、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 &raquo; フィード" href="https://wp.local/?feed=rss2" />
<link rel="alternate" type="application/rss+xml" title="WordPress &raquo; コメントフィード" 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 &raquo; フィード" href="https://wp.local/?feed=rss2" />
<link rel="alternate" type="application/rss+xml" title="WordPress &raquo; コメントフィード" 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でも使用可能な選択肢として覚えてくださると幸いです。

<< 今どきのKUSANAGI RoD 環境の構築方法

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解