昨今、PHP 等の脆弱性で大騒ぎになりましたが、ここは基本、サイト全体がコンテナ化されているので、基本対応は新しいイメージを pull するだけ。お気軽かんたん (^^)v
…だったのですが、そのときに気づきました。
最初にコンテナ化の作業を始めたときに、最新版だった MariaDB も、今や WordPress から警告が出るほど古いバージョンになっていることに… orz
そのときにえっ?!ってなった話。
コンテナ内の MariaDB のアップグレードってどうするの?
このサイトは、Debian の公式イメージに Apache をインストールしたものと、WordPress の公式イメージの PHP-FPM 、さらに MariaDB の公式イメージで動作しております。
HTML と MariaDB のデータファイルは、ホストのファイルシステムとマウントして永続化しているので、HTML などのテキストデータはいいのですが、MariaDB のデータファイルは基本バイナリデータです。
通常、MariaDB をパッケージインストールしてある場合、アップグレードの際は、インストールスクリプトの中で mariadb-upgrade ツールを起動させ、移行してくれるのですが、これ、 docker イメージではどうするの?というところで、はたと止まってしまいました。
一応
- コンテナをまるごとバックアップ
- phpMyAdmin を起動してデータをエクスポート
- 新しいバージョンの MariaDB のコンテナイメージを作成
- phpMyAdmin を起動してデータをインポート
というコンテナ化したときと同じ手法で、手順を作ればできますが…できるはずですが…これはできればやりたくない d(^^;A
とは言いつつも、他に方法が思いつかず、その手順を考えていたとき…
MARIADB_AUTO_UPGRADE ってなに?
MariaDB の公式イメージには MARIADB_AUTO_UPGRADE というオプションがあるという記載を見つけました。
なんとこのオプションを有効にすると、コンテナ起動時に mariadb-upgrade を実行してくれるというではありませんか!
具体的にどうするかというと…
mariaDB:
image: mariadb:${DB_VERSION}
container_name: mariaDB
volumes:
- ./data/db:/var/lib/mysql
restart: always
environment:
MARIADB_DATABASE: ${DB_NAME}
MARIADB_USER: ${DB_USER}
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
TZ: Asia/Tokyo
MARIADB_AUTO_UPGRADE: '1'
上記は docker-compose.yml ファイル内の MariaDB のコンテナを記述した部分なんですが、environment セクションの最後に MARIADB_AUTO_UPGRADE を設定する一行を追加します。
各変数は別途 .env ファイル内に設定してあって、元の DB_VERSION の値は 10.10 でした。
バージョンアップグレード実践!
ここから、コンテナを全て落としてバックアップ。それから .env ファイル中の DB_VERSION の値をまず 10.11 に修正して pull してから、全コンテナを起動して、まずは MariaDB 10 系の LTS(Long-Term Support) バージョンで、今( 2026 年 11 月現在)、公式に公開されている LTS でもっとも古い 10.11 にバージョンアップしました。
ちょっと、ドキドキしましたが、これは 10 系から 10 系へのアップグレードなので難なく完了。
気をよしくて、次は 11 系の LTS 11.4 へ。。。トラブルとしたらここと思ってはいたのですが、11.4 を pull して立ち上げてサイトにアクセスすると、案の定、データベースに繋がらないというエラーが表示されて…
…時間が経つと治りました (^O^;A
mariadb-upgrade の処理に時間が掛かって、起動が遅くなっただけのようです。
さらに、気を良くして 11.8 、そして、一気に現在最新の LTS である 12 系の 12.3 までアップグレードして、現在、このサイトは MariaDB 12.3 をバックエンドにして動いています。
蛇足
ここまでの顛末を読んでいただいた方には、いくつか疑問が湧くと思います。それをまとめておきます。
なぜ一気に MariaDB 12.3 にしない?
こわいから d(^^;A
10.11 にしたのは、まず MARIADB_AUTO_UPGRADE の実験的な意味があります。上手くいったので、ここから一気に 12.3 でも行けそうな気がしまし、11.4, 11.8 と 11 系を二度も踏む必要なないかと思いますが、LTS から LTS へというのが、無難で間違いないかと思った次第。
ちなみに、ダウングレードはできませんので、バックアップを取りつつ慎重に行うことに越したことはありません。
そもそもどんな docker-compose.yml を書いてるの?
このサイトをコンテナ化したときから、若干見直して、今回のように、.env ファイルを書き換えるだけで、MariaDB のバージョンを指定できるだけでなく、Apache を動作させる Debian の公式イメージのバージョンも指定できるように進化しております。当方で使っている最新の docker-compose.yml を晒しときます( MariaDB のアップグレードを行ったあとのファイルですので、MARIADB_AUTO_UPGRADE はコメントインしています)。
services:
apache:
build:
context: ./httpd
dockerfile: Dockerfile
args:
- TARGET_VERSION=${TARGET_VERSION}
image: httpd4blosxom
container_name: httpd
volumes:
- ./data/html:/var/www/html
depends_on:
- php-fpm
restart: always
environment:
TZ: Asia/Tokyo
ports:
- 80:80
php-fpm:
image: wordpress:fpm
container_name: php-fpm
depends_on:
- mariaDB
volumes:
- ./data/html:/var/www/html
- ./conf/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
restart: always
environment:
WORDPRESS_DB_HOST: mariaDB
WORDPRESS_DB_USER: ${DB_USER}
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: ${DB_NAME}
TZ: Asia/Tokyo
mariaDB:
image: mariadb:${DB_VERSION}
container_name: mariaDB
volumes:
- ./data/db:/var/lib/mysql
restart: always
environment:
MARIADB_DATABASE: ${DB_NAME}
MARIADB_USER: ${DB_USER}
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
TZ: Asia/Tokyo
# MARIADB_AUTO_UPGRADE: '1'
phpmyadmin:
image: phpmyadmin:latest
container_name: phpmyadmin
environment:
PMA_ARBITRARY: '1'
PMA_HOST: mariaDB
UPLOAD_LIMIT: 10M
TZ: Asia/Tokyo
profiles: ["Setup"]
ports:
- 8080:80
ちなみに Debian の公式イメージに Apache をインストールしたものをビルドする Dockerfile はこんな感じ
ARG TARGET_VERSION
FROM debian:${TARGET_VERSION}-slim
# install httpd runtime dependencies
# https://httpd.apache.org/docs/2.4/install.html#requirements
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
# Add Apache2
apache2 \
# apache2-dev \
# Add perl and perl lib
perl \
perl-base \
perl-modules \
libwww-perl \
libcgi-pm-perl \
liblocal-lib-perl \
libjson-perl \
libdigest-sha-perl \
; \
rm -rf /var/lib/apt/lists/*
RUN a2enmod cgid
RUN a2enmod proxy
RUN a2enmod proxy_fcgi
RUN a2enmod rewrite
COPY ./conf/CGI_PHP-FPM.conf /etc/apache2/sites-available/
RUN a2ensite CGI_PHP-FPM
VOLUME ["/var/www/html"]
EXPOSE 80
ENTRYPOINT [ "/usr/sbin/apache2ctl", "-D", "FOREGROUND" ]
.env ファイルで TARGET_VERSION に「bookworm」とか「trixie」と定義してやると、Debian の公式イメージも bookworm ( 12 系)、trixie ( 13 系)の slim イメージをベースにするようになっています。