Dockerとは
Dockerとは、アプリケーションの開発や運用を容易にするためのコンテナ型の仮想化技術です。アプリケーションやミドルウェアなどの実行環境を一つにまとめたコンテナを用意し、コンテナ管理ソフトウェア上で稼働させることで利用OSに依存しないアプリケーション実行環境を構築することができます。
DockerでWordpressの環境を構築するメリット
DockerでWordpressの環境を構築するメリットとしては以下が挙げられます。
- ローカルとサーバ上で同じ動作が保証されるので、ローカル(テスト)環境での検証が容易になる
- 失敗してもコンテナ外には影響を及ぼさないので何度も試行錯誤できる
- 一つのコンテナ内に依存関係をまとめて管理できるので、環境やアプリケーションの互換性による不具合を回避することができ、運用が安定する。
- 必要に応じてバックエンドサーバやリバースプロキシを設置するなど柔軟にシステムを変更することができる。
WordPressのマルチサイトとは
WordPressマルチサイトとはサーバにインストールした1つのWordPress上で複数のサイトを制作・運用することです。通常は1つのサイトごとにWordPressをインストールする必要がありますが、マルチサイト機能を導入することで1つのドメインで複数のサイトを構築することが可能になります。
しかし、マルチサイトには以下のようなデメリットがあります。
- テーマやプラグインによってはマルチサイトに未対応のものがある。
- 1つのWordpressアプリケーション上に複数サイトを構築するため、ある1つのエラーが複数サイトに影響を及ぼす恐れがある。
- マルチサイトに対応しているレンタルサーバを選ぶ必要がある。
そこで今回はDockerを用いて擬似的なマルチサイト環境を構築していきたいと思います。
システム構成
上図は今回構築するシステムの概略図です。各コンテナの役割は以下の通りです。
- https-poral:自動で通信をHTTPS化する(HTTPSサーバを自動構築するDockerコンテナ)
- nginx:https-portalからの通信を受け取り、ドメイン・ポートで宛先を振り分ける
- wordpress_A:https://A.example.comの宛先サーバ
- wordpress_B:https://B.example.comの宛先サーバ
- mysql_A:wordpress_Aコンテナで使用するDBサーバ
- mysql_B:wordpress_Bコンテナで使用するDBサーバ
WordPressのマルチサイト機能を使用する場合に比べて、今回のシステムは二つのWordpressサーバが論理的に分割されているのでバックアップが容易になったり、障害を切り分けることができるなどのメリットがあります。
コード
今回のシステムはDocker Composeを用いて作成していきます。
Docker Composeとは複数のDockerコンテナを定義、実行するサービスでコンテナ間通信など、複数コンテナを協調して稼働させたい場合に使用します。
以下のようにファイル・ディレクトリを用意してください
wordpress/
├ nginx/
│ └ nginx.conf
│ └ conf.d/
│ └ wordpress_A.conf
│ └ wordpress_B.conf
└ docker-compose.yml
docker-compose.yml
version: '3'
services:
https-portal:
image: steveltn/https-portal:1
ports:
- 80:80
- 443:443
depends_on:
- nginx
restart: always
volumes:
- ./certs:/var/lib/https-portal
environment:
# 本番運用の際はコメントアウトを外します
#STAGE: 'production'
DOMAINS: >-
A.example.com -> http://nginx:8880,
B.example.com -> http://nginx:8881,
WORKER_PROCESSES: auto
WORKER_CONNECTIONS: 2048
CLIENT_MAX_BODY_SIZE: 128M
nginx:
image: nginx:stable
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/log:/var/log/nginx
- ./nginx/www:/var/www
ports:
- "8880:8880"
- "8881:8881"
depends_on:
- wordpress_A
- wordpress_B
restart: always
mysql_A:
image: mysql:5.7
volumes:
- data_A:/var/lib/mysql
ports:
- "9990:3306"
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress_A:
depends_on:
- mysql_A
image: wordpress:latest
volumes:
- ./html_A:/var/www/html # マウントするディレクトリを指定
restart: always
environment:
WORDPRESS_DB_HOST: mysql_A:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
mysql_B:
image: mysql:5.7
volumes:
- data_B:/var/lib/mysql
ports:
- "9991:3306"
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress_B:
depends_on:
- mysql_B
image: wordpress:latest
volumes:
- ./html_B:/var/www/html
restart: always
environment:
WORDPRESS_DB_HOST: mysql_B:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
data_A:
data_B:
wordpress_A.conf
server {
listen 8881;
server_name A.example.com;
location / {
proxy_pass http://wordpress_A/;
proxy_redirect off;
# リクエストヘッダーの情報を下位のサービスに伝える
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# タイムアウト設定
proxy_connect_timeout 10;
proxy_send_timeout 10;
proxy_read_timeout 60;
# 画像や動画をアップロードへの対応
client_body_buffer_size 128M;
client_max_body_size 128M;
proxy_buffer_size 32K;
proxy_buffers 50 32K;
proxy_busy_buffers_size 64K;
}
}
wordpress_B.conf
server {
listen 8882;
server_name B.example.com;
location / {
proxy_pass http://wordpress_B/;
proxy_redirect off;
# リクエストヘッダーの情報を下位のサービスに伝える
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# タイムアウト設定
proxy_connect_timeout 10;
proxy_send_timeout 10;
proxy_read_timeout 60;
# 画像や動画をアップロードへの対応
client_body_buffer_size 128M;
client_max_body_size 128M;
proxy_buffer_size 32K;
proxy_buffers 50 32K;
proxy_busy_buffers_size 64K;
}
}
特にdocker-compose.ymlのCLIENT_MAX_BODY_SIZE、wordpress_A.conf・wordpress_B.confのclient_body_buffer_size,client_max_body_sizeには注意してください。
小さすぎる値を指定すると、テーマやプラグインを追加できなくなる恐れがあるので余裕を持って値を設定するのが良いかと思います。
実行(運用)
実行するには用意したwordpressディレクトリにて以下を実行します。
$ docker compose up -d
これでhttps://A.example.netやhttps://B.example.netで該当Wordpressにアクセスできるようになったはずです。
終わりに
以上、Dockerを用いてマルチサイトなWordpress環境を構築する手順のご説明でした。
少々複雑かもしれませんが前出の図を参照しながらコードをご覧いただければ幸いです。
ご清覧ありがとうございました。