docker コンテナ内の MariaDB だけをアップグレードする

投稿者: | 2026年11月1日

昨今、PHP 等の脆弱性で大騒ぎになりましたが、ここは基本、サイト全体がコンテナ化されているので、基本対応は新しいイメージを pull するだけ。お気軽かんたん (^^)v

…だったのですが、そのときに気づきました。

最初にコンテナ化の作業を始めたときに、最新版だった MariaDB も、今や WordPress から警告が出るほど古いバージョンになっていることに… orz

そのときにえっ?!ってなった話。

コンテナ内の MariaDB のアップグレードってどうするの?

このサイトは、Debian の公式イメージに Apache をインストールしたものと、WordPress の公式イメージの PHP-FPM 、さらに MariaDB の公式イメージで動作しております。

HTML と MariaDB のデータファイルは、ホストのファイルシステムとマウントして永続化しているので、HTML などのテキストデータはいいのですが、MariaDB のデータファイルは基本バイナリデータです。

通常、MariaDB をパッケージインストールしてある場合、アップグレードの際は、インストールスクリプトの中で mariadb-upgrade ツールを起動させ、移行してくれるのですが、これ、 docker イメージではどうするの?というところで、はたと止まってしまいました。

一応

  1. コンテナをまるごとバックアップ
  2. phpMyAdmin を起動してデータをエクスポート
  3. 新しいバージョンの MariaDB のコンテナイメージを作成
  4. 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 イメージをベースにするようになっています。


コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です