Docker + WordPressサーバ複数構成時のサーバ間ディレクトリ同期
はじめに
当方のWodPress環境は、2台のCentOS7サーバにDockerでWordPressとMySQLのコンテナを立てており、上位のロードバランサーで負荷分散をする構成です。
WordPressを複数台で構成している場合、1台のWordPressサーバでバージョンアップや記事を更新すると、他のサーバとデータの差分が発生し、ユーザのアクセスによっては常に古いサーバを参照しに行ってしまいます。その為、サーバ間でデータの差分が発生しないようにサーバに更新作業を加えたら他のサーバにも更新ファイルをコピーしてあげる必要があります。
当方の環境はDockerということで、コピーするべき対象ファイルが以前は分かりませんでした。ただ色々と調べたり試行錯誤した結果、以降で説明する2つのディレクトリをコピーすることでサーバ間の差分が埋められることを確認しました。
※実際はrsyncによるディレクトリ同期で実装します。以降は、ディレクトリの同期という表現で説明を続けます。
今回は、ディレクトリの同期方法の説明と、同期前後のWordPressの動作を確認してみます。
環境について
Docker Engine Client/Server | 20.10.12 |
WordPress | 5.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号機でしか書いていない「テスト記事」が表示してくれました。
ディレクトリ同期の作業と動作確認で今回は以上となります。
ディスカッション
コメント一覧
まだ、コメントがありません