Docker + WordPressサーバ複数構成時のサーバ間ディレクトリ同期

WordPressDocker,WordPress

はじめに

当方のWodPress環境は、2台のCentOS7サーバにDockerでWordPressとMySQLのコンテナを立てており、上位のロードバランサーで負荷分散をする構成です。

WordPressを複数台で構成している場合、1台のWordPressサーバでバージョンアップや記事を更新すると、他のサーバとデータの差分が発生し、ユーザのアクセスによっては常に古いサーバを参照しに行ってしまいます。その為、サーバ間でデータの差分が発生しないようにサーバに更新作業を加えたら他のサーバにも更新ファイルをコピーしてあげる必要があります。

当方の環境はDockerということで、コピーするべき対象ファイルが以前は分かりませんでした。ただ色々と調べたり試行錯誤した結果、以降で説明する2つのディレクトリをコピーすることでサーバ間の差分が埋められることを確認しました。
※実際はrsyncによるディレクトリ同期で実装します。以降は、ディレクトリの同期という表現で説明を続けます。

今回は、ディレクトリの同期方法の説明と、同期前後のWordPressの動作を確認してみます。

環境について

Docker Engine Client/Server20.10.12
WordPress5.9

同期するディレクトリ

当方がWordPressを構築した際に使ったdocker-compose.ymlは下記となります。注目するのは永続化(volumes)をする為に定義したvolumesの部分であるMySQLのデータベース『db_data』WordPressの『/root/WordPress_Linux/wp』の二か所です。

この二か所が同期する対象になります。

version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    env_file: .env

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - /root/WordPress_Linux/wp:/var/www/html
    ports:
      - "8080:80"
    restart: always
    env_file: .env

volumes:
  db_data:

MySQL『db_data』

docker-compose.ymlで定義した通り、MySQLは『db_data』で管理されています。まずはこの実態を探します。

docker volume lsコマンドで『db_data』のボリューム名を確認します。(ボリューム名はdocker-compose.ymlで定義した「wordpress_linux」に「_da_data」が合わさった名称になるようです)

[root@centos7web-01 ~]# docker volume ls
DRIVER    VOLUME NAME
local     wordpress_linux_db_data

続いて上記のボリューム名を引数にdocker volume inspectコマンドで詳細を確認します。

確認すると、"Mountpoint"という項目で、「/var/lib/docker/volumes/wordpress_linux_db_data/_data」が確認できます。これがMySQL側の同期するディレクトリになります。

[root@centos7web-01 ~]# docker volume inspect wordpress_linux_db_data
[
    {
        "CreatedAt": "2022-02-11T23:45:32+09:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/wordpress_linux_db_data/_data",
        "Name": "wordpress_linux_db_data",
        "Options": null,
        "Scope": "local"
    }
]

WordPress『/root/WordPress_Linux/wp』

WordPress側はdocker-compose.ymlに記載の通り「/root/WordPress_Linux/wp』が同期対象となります。

同期をしてみる

WordPressサーバ1号機にだけ新記事を追加

同期の前にWordPressサーバ1号機で「テスト記事」を書きました。あえて1号機と2号機間に差分をもうけます。
なお、「テスト記事」は執筆時点の2022年2月12日です。

下記はWordPressサーバ2号機のWordPressのTopページです。
最新記事は6日前に書いた2022年2月6日の記事です。

この時点ではWordPressサーバ1号機にだけ「テスト記事」がアップされています。

同期作業

まずは2号機にて同期されるディレクトリを削除しときます。

[root@centos7web-02 ~]# rm -rf /root/WordPress_Linux/wp
[root@centos7web-02 ~]# rm -rf /var/lib/docker/volumes/wordpress_linux_db_data/_data

1号機側でrsyncによる同期をします。記載のIPアドレスは2号機のIPアドレスです。

[root@centos7web-01 ~]# rsync -a /root/WordPress_Linux/wp root@192.168.101.22:/root/WordPress_Linux/
root@192.168.101.22's password:
[root@centos7web-01 ~]# rsync -a /var/lib/docker/volumes/wordpress_linux_db_data/_data root@192.168.101.22:/var/lib/docker/volumes/wordpress_linux_db_data
root@192.168.101.22's password:
[root@centos7web-01 ~]#

2号機に戻りDockerコンテナを再起動します。
※再起動をしない場合ApacheのForbiddenページやデータベースの接続エラーが発生しました。

[root@centos7web-02 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
7d95a0d77203        wordpress:latest    "docker-entrypoint.s…"   22 months ago       Up About a minute   0.0.0.0:8080->80/tcp   wordpress_linux_wordpress_1
c2679a82fcc8        mysql:5.7           "docker-entrypoint.s…"   22 months ago       Up About a minute   3306/tcp, 33060/tcp    wordpress_linux_db_1

[root@centos7web-02 ~]# docker restart 7d95a0d77203
[root@centos7web-02 ~]# docker restart c2679a82fcc8

以上で同期作業は完了です。

2号機のTopページを参照すると1号機でしか書いていない「テスト記事」が表示してくれました。

ディレクトリ同期の作業と動作確認で今回は以上となります。