この記事では、Docker(Portainer)環境で WordPress に Redis Object Cache を導入する際に実際に遭遇したトラブルと、その解決策をまとめます。単なる手順書ではなく、再現性の高い“落とし穴”を中心に整理しています。
1. Redis Object Cache プラグインを入れるだけでは動かない
まず前提として、WordPress で Redis を使うための代表的なプラグインは “Redis Object Cache” です。これを有効化すると Object Cache Drop-in (object-cache.php) が導入され、Redis を使ったキャッシュが使えるようになります。
しかし、Docker 上で WordPress 公式イメージ(wordpress:php8.3-apache)を使用している場合、プラグインを入れるだけでは Redis と接続できません。
最初にやることはシンプルで、以下のプラグインを導入することです。
- Redis Object Cache
ただし、これを入れただけでは「Connected」にはなりません。公式イメージは Redis 拡張が入っておらず、WordPress が Redis を認識できないからです。ここからが本番です。
2. WordPress 公式イメージには php-redis が無い → Dockerfile が必要になる
● 問題:php-redis が入っていない
wordpress:php8.3-apache は最小構成のため、php-redis 拡張(redis.so)が標準で入っていません。
そのため、Redis Object Cache を有効化してもこのようになります。
Status: Not enabled
Redis: Unreachable
● 解決策:Dockerfile を使って php-redis を追加する
Portainer CE では Stack 画面に「Dockerfile を追加するUI」が無いため、ホスト側でイメージをビルドし、ローカルイメージとして利用する方法が必要になります。
▼ Dockerfile(WordPress 公式イメージを拡張)
FROM wordpress:php8.3-apache
# Enable Apache modules
RUN a2enmod headers && a2enmod rewrite
# Install build tools (phpize/pecl に必要)
RUN apt-get update && apt-get install -y \
build-essential pkg-config zlib1g-dev && \
rm -rf /var/lib/apt/lists/*
# Install php-redis extension
RUN pecl install redis && docker-php-ext-enable redis
▼ ホスト側でビルド
mkdir ~/wp1-custom
cd ~/wp1-custom
nano Dockerfile
docker build -t wp1-custom:latest .
● Portainer での注意点:pull してはいけない
ローカルで build した wp1-custom:latest は Docker Hub には存在しないため、Portainer の “Pull and Deploy” を押すと必ず以下のエラーになります。
pull access denied for wp1-custom
repository does not exist
▼ 正しい操作
- Stack を開く
- image: の部分を以下に変更
image: wp1-custom:latest
- 「Deploy the stack」だけ押す(Pull は絶対押さない)
これで WordPress コンテナの中で Redis 拡張が正しく読み込まれる状態になります。
3. WP_REDIS_HOST が読み込まれない(起動順の問題)
Docker Compose の environment: に以下のように設定していても、Redis Object Cache では接続できないことがあります。
- WP_REDIS_HOST=wp1_redis
- WP_REDIS_PORT=6379
● 原因
WordPress(特に PHP8.3系公式イメージ)では、環境変数を読み込む前に object-cache.php が動いてしまうケースがあります。つまり、Redis Object Cache プラグインが Redis の接続先を取得する段階で、環境変数がまだ読まれていません。
● 解決策:wp-config.php に明示的に定義する
最も確実なのは、wp-config.php に直接記述する方法です。
define('WP_REDIS_HOST', 'wp1_redis');
define('WP_REDIS_PORT', 6379);
これにより、プラグインが確実に値を参照できるようになり、「Unreachable」→「Connected」に変わります。
4. ネットワーク設定の落とし穴(同一 network に入れる)
Redis が起動していても、WordPress コンテナから接続できなければ Redis Object Cache は有効になりません。
Docker Compose では、同じ Docker network に所属していないとコンテナ同士が名前解決できません。
▼ 正しい YAML 構成(wp1 と wp1_redis は同じ network)
version: "3.6"
services:
wp1:
image: wp1-custom:latest
container_name: wp1
volumes:
- wp1_wp_data:/var/www/html
environment:
- WORDPRESS_DB_HOST=wp1_db:3306
- WORDPRESS_DB_NAME=wordpress
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=XXXXXXXXX
- WORDPRESS_TABLE_PREFIX=wp_
- WP_REDIS_HOST=wp1_redis
- WP_REDIS_PORT=6379
depends_on:
- wp1_db
- wp1_redis
restart: always
networks:
- wpnet
- proxy
wp1_db:
image: mariadb:latest
container_name: wp1_db
volumes:
- wp1_db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=XXXXXXXX
- MYSQL_DATABASE=XXXXXXXX
- MYSQL_USER=XXXXXXX
- MYSQL_PASSWORD=XXXXXXXXXX
restart: always
networks:
- wpnet
wp1_redis:
image: redis:alpine
container_name: wp1_redis
command: redis-server --appendonly yes
volumes:
- wp1_redis_data:/data
restart: always
networks:
- wpnet
networks:
wpnet:
proxy:
external: true
volumes:
wp1_db_data:
wp1_wp_data:
wp1_redis_data:
● 疎通確認(redis-cli)
WordPress コンテナ側に redis-cli を入れて確認すると確実です。
docker exec -it wp1 bash
apt update && apt install redis-tools -y
redis-cli -h wp1_redis ping
以下が返れば接続成功です。
PONG
まとめ
Docker + Portainer CE + WordPress 公式イメージ環境で Redis Object Cache を動かすには、単にプラグインを入れるだけでは不十分で、次の4つの落とし穴を順番に乗り越える必要があります。
- Redis Object Cache プラグインを入れるが、公式イメージには php-redis が無いためそのままでは動かない
- Dockerfile で wp1-custom イメージを作り、Portainer では Pull せず Deploy のみ行う
- WP_REDIS_HOST が環境変数で読まれない問題は wp-config.php で直接定義する
- WordPress と Redis を同一 Docker network に入れ、疎通確認する
この4点で私の環境ではRedisを導入することができました。私が陥ったトラブルのいずれかでも参考になれば幸いです。

Redisを導入した効果は単体では明確にはわかりませんが、同時期にWP Super CacheやImage Optimizerなども導入したので、かなりサクサクこのブログが表示されるようになった気がします。
学園祭のサイトや他のWordPressも高速化していきたいところです。ここまでご覧くださりありがとうございました。





コメントを残す