Dockerize WordPress: MariaDBとRedis Cacheで構築する本格的なプロダクション環境

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

なぜWordPressをRedisと一緒にDocker化するのか?

VPSでPHPをアップグレードした際に、サイトが500エラーでダウンして冷や汗をかいた経験はありませんか?Dockerはその救世主となります。従来のLAMP/LEMP環境の構築は、ライブラリのバージョンが異なるとエラーが発生しがちですが、Dockerはすべてをコンテナにパッケージ化し、開発環境と本番環境の100%の同一性を保証します。

しかし、WordPressとMySQLを動かすだけでは不十分です。トラフィックが増えると、データベースがすぐにボトルネックになります。実際、Redisをオブジェクトキャッシュとして追加することで、データベースのレスポンス時間を数百ミリ秒からわずか数ミリ秒に短縮できます。Redisはクエリ結果をRAMに保存するため、MariaDB의 CPU負荷を大幅に軽減します。

サイトが重くなってから最適化を考えるのではなく、初日から標準的な構成を構築しましょう

プロジェクトのディレクトリ構造

ファイルを体系的に管理することで、バックアップやサーバー移転時のトラブルを防げます。コード、データ、設定を明確に分けるのが一般的です。

my-wordpress-site/
├── docker-compose.yml
├── .env
├── wordpress_data/ 
└── mariadb_data/

「実践的」なDocker Composeファイルの設定

現在、私は完全にDocker Compose v2に移行しました。古い docker-compose up ではなく、新しい構文は docker compose up です。v2はリソースの処理がスムーズで、大幅に高速化されています。

以下は、実際のプロジェクトでよく使用する設定ファイルです。MariaDB 10.11を選んだ理由は、MySQLよりもRAM消費が少なく、コンテナ環境でのクエリ処理性能が優れているためです。

services:
  db:
    image: mariadb:10.11
    container_name: wp_mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./mariadb_data:/var/lib/mysql
    networks:
      - wp_network

  redis:
    image: redis:7-alpine
    container_name: wp_redis
    restart: always
    networks:
      - wp_network

  wordpress:
    depends_on:
      - db
      - redis
    image: wordpress:latest
    container_name: wp_app
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: ${DB_USER}
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: ${DB_NAME}
      WORDPRESS_CONFIG_EXTRA: |
        define('WP_REDIS_HOST', 'redis');
        define('WP_REDIS_PORT', 6379);
        define('WP_CACHE', true);
    volumes:
      - ./wordpress_data:/var/www/html
    networks:
      - wp_network

networks:
  wp_network:
    driver: bridge

注目すべきポイント:

  • WORDPRESS_CONFIG_EXTRA: これは公式のWordPressイメージの非常に優れた機能です。wp-config.phpを手動で編集することなく、Redisの設定を自動的に挿入してくれます。
  • Isolated Network: wp_network ネットワークにより、コンテナ間の内部通信が可能になります。データベースのポートを外部に公開する必要がないため、ハッカーによる3306ポートのスキャンを防げます。
  • Alpine Image: redis:7-alpine バージョンはわずか数十MBと軽量で、ディスク容量を最大限に節約できます。

.envファイルによる環境変数の管理

コードをGitHubにプッシュする予定がある場合は、パスワードをcomposeファイルに直接記述しないでください。機密情報を保存するために、同じ階層に .env ファイルを作成しましょう:

DB_ROOT_PASSWORD=非常に強力なルートパスワード
DB_NAME=wordpress_db
DB_USER=wp_admin
DB_PASSWORD=ユーザーパスワード

WordPressダッシュボードでのRedisの有効化

docker compose up -d を実行すると、ウェブサイトはポート8080でオンラインになります。ただし、Redisはすぐには自動で動作しません。追加で3つのステップが必要です:

  1. wp-adminにログインします。
  2. Redis Object Cache プラグインを検索してインストールします。
  3. 設定 -> Redis に移動し、「Enable Object Cache」をクリックします。

ステータスが「Connected」になれば、Redisがキャッシュの受信を開始したことを意味します。この時点で、ページの読み込み速度が明らかに向上しているはずです。

実践的な最適化とセキュリティのヒント

1. リソースの制限

WordPressは、ボットによる連続スキャンを受けるとサーバーのRAMを使い果たす可能性があります。composeファイル内でリソース制限を設定しましょう。個人のブログであれば、512MBのRAM制限が妥当なラインです。

deploy:
  resources:
    limits:
      cpus: '0.50'
      memory: 512M

2. 権限(パーミッション)エラーの解決

画像をアップロードできない場合は、UIDの不一致が原因である可能性が高いです。Linuxでは、chown -R 33:33 wordpress_data コマンドを実行してください。これにより、コンテナ内の www-data ユーザーがデータの書き込み権限を持つようになります。

3. バックアップ戦略

Dockerボリュームだけに頼りすぎないでください。1日に1回、定期的にデータベースをダンプするcronジョブをスケジュールすることをお勧めします。小さな .sql ファイルが、サーバーのハードウェアトラブル時にあなたを救ってくれます。

まとめ

MariaDBとRedisをDockerスタックに組み合わせることで、WordPressの運用がよりスムーズになり、管理も容易になります。WORDPRESS_CONFIG_EXTRA を活用することが、すべてを自動化する最短ルートです。高負荷に強く、安定したシステムを構築できることを願っています!

Share: