簡単に最低限のWordPress環境を構築する方法 【後編】

今回は前回の続きです。

おさらい

今回は低コストに抑えるため、Load Balancerは使用せず、DockerとDocker-composeを使用してWebサーバからWordpressの構築まで行います。
HTTPSの証明書発行にはLet's Encryptを使用する事で、無償で証明書を自動で発行、管理します。

構築方法

事前準備

まず、事前準備として動作させるための環境を用意します。
今回はOSとしてUbuntuを使用して説明します。
VPSであればサーバ契約時にUbuntuを選択し、自前のサーバであればUbuntuをインストールしてください。
Docker、Docker-composeに対して十分に理解のある人はWindows, MAC, 他のLinuxなどOSは何でも問題ありません。

Docker、Docker-composeのインストール

まず、サーバへログインします。
VPSであれば管理コンソールから、それ以外の場合はSSHでログインします。
ログイン後、以下のコマンドを入力しDockerとDocker-composeをインストールします。

sudo apt update
sudo apt install docker.io docker-compose

Docker-compose定義ファイルの配置

構築を行うためのDocker-compose定義ファイルを配置します。
まず、WordPressのファイルを管理するディレクトリを作成します。

cd ~/
mkdir wordpress
cd wordpress
vim docker-compose.yml # 以下のdocker-compose.ymlを作成
vim .env # 以下の.envを作成
  • docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - /home/${USER_NAME}/${APP}/data/db:/var/lib/mysql
    env_file: .env
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - /home/${USER_NAME}/${APP}/html:/var/www/html
    links:
      - db
    expose:
      - 80
    environment:
      WORDPRESS_DB_HOST: "db:3306"
      VIRTUAL_HOST: ${DOMAIN}
      LETSENCRYPT_HOST: ${DOMAIN} 
      LETSENCRYPT_EMAIL: ${EMAIL}
    env_file: .env
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /home/${USER_NAME}/${APP}/certs:/etc/nginx/certs:ro
      - /home/${USER_NAME}/${APP}/htpasswd:/etc/nginx/htpasswd
      - /home/${USER_NAME}/${APP}/nginx_conf:/etc/nginx/conf.d
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro

  letsencrypt-nginx-proxy-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    volumes:
      - /home/${USER_NAME}/${APP}/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy

networks:
  default:
    external:
      name: ssl-proxy
  • .env
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=mysql_user
WORDPRESS_DB_PASSWORD=password

MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wordpress
MYSQL_USER=mysql_user
MYSQL_PASSWORD=password

USER_NAME=user_name
APP=APP_NAME
DOMAIN=example.com
EMAIL=user_name@example.com

Docker-compose定義ファイルの説明

次に、Docker-compose定義ファイルの説明を行います。

データベースの設定

3:  db:
4:    image: mysql:5.7

データベースとして、WordPressはMySQLを使用しています。
MySQL 8.0以降だと正常に動作しないようなので、5.7を明示的に指定しています。

5:    volumes:
6:      - /home/${USER_NAME}/${APP}/data/db:/var/lib/mysql

MySQLのデータファイル類を事前に作成したWordPressのディレクトリ配下にマウントしています。
volumesを使用してホストにマウントしておかないと、Dockerを削除すると保存しておいたデータも削除されてしまいます。
また、ホストのWordPressのディレクトリにマウントしておく事で、ディレクトリを他の場所に保存するだけでバックアップする事ができます。

7:    env_file: .env

MySQLの設定に必要な環境変数を読み込みます。
事前に作成した.envファイルが参照されます。 (.envの中身については後に紹介)

WordPressの設定

9:    depends_on:
10:      - db

データベースが作成されないと、動作しないためdbが立ち上がってから起動する用に依存関係の設定を行っています。

11:    image: wordpress:latest

WordPressのイメージを選択しています。
latestを指定する事で、最新版のイメージを使用しています。

12:    volumes:
13:      - /home/${USER_NAME}/${APP}/html:/var/www/html

データ類はWordPressのディレクトリに保存しています。
目的はMySQLの時と同様です。

14:    links:
15:      - db

データベースと接続できるようにするために、dbと接続する事を定義する設定です。

16:    expose:
17:      - 80

80番ポートをコンテナ内に公開するための設定です。
ホストには80番ポートは公開されません。

18:    environment:
19:      WORDPRESS_DB_HOST: "db:3306"
20:      VIRTUAL_HOST: ${DOMAIN}
21:      LETSENCRYPT_HOST: ${DOMAIN} 
22:      LETSENCRYPT_EMAIL: ${EMAIL}
23:    env_file: .env

データベースへの接続や、Let's Encryptで証明書を登録するための環境変数の定義です。
設定する必要がある値は、.envファイルを使用しているためdocker-compose.ymlを変更する必要はありません。

Nginxの設定

24:  nginx-proxy:
25:    image: jwilder/nginx-proxy

今回WebサーバとしてNginxを使用するため、Nginxのイメージを指定しています。
nginx-proxyではアプリケーションサーバへ通信を転送するための設定が含まれているため、こちらを使用しています。

26:    ports:
27:      - 80:80
28:      - 443:443

ポートをホストに公開するための設定です。
ホストとコンテナのポート番号を紐付ける事で、外部から接続できるようにしています。

29:    volumes:
30:      - /home/${USER_NAME}/${APP}/certs:/etc/nginx/certs:ro
31:      - /home/${USER_NAME}/${APP}/htpasswd:/etc/nginx/htpasswd
32:      - /home/${USER_NAME}/${APP}/nginx_conf:/etc/nginx/conf.d
33:      - /etc/nginx/vhost.d
34:      - /usr/share/nginx/html
35:      - /var/run/docker.sock:/tmp/docker.sock:ro

Let's Encryptと連携するための設定や、MySQLやWordPressと同様に設定ファイルをホスト側で管理するために設定しています。

Let's Encryptの設定

37:  letsencrypt-nginx-proxy-companion:
38:    image: jrcs/letsencrypt-nginx-proxy-companion

Let's EncryptをシームレスにNginxと連携するためのDockerイメージです。
Dockerのソケットから自動的に対象を探しだし、証明書を発行します。

39:    volumes:
40:      - /home/${USER_NAME}/${APP}/certs:/etc/nginx/certs:rw
41:      - /var/run/docker.sock:/var/run/docker.sock:ro
42:    volumes_from:
43:      - nginx-proxy

対象を探しだしたり、発行した証明書をNginxに連携するための設定です。
ホストのDocker用ソケットをマウントする事で、対象のコンテナを探し出します。
証明書の発行されたら、Nginxでマウントしているホスト側のディレクトリに証明書を作成します。

ネットワークの設定

45: networks:
46:   default:
47:     external:
48:       name: ssl-proxy

コンテナを既存のネットワークに接続し、Webサーバとアプリケーションサーバを接続できるようにするための設定です。

環境変数ファイルの説明

WordPressの環境変数

WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=mysql_user
WORDPRESS_DB_PASSWORD=password

WordPressで使用する値を設定するための環境変数です。
WORDPRESS_DB_NAME にはMySQLで設定するデータベース名を記述します。
WORDPRESS_DB_USER にはMySQLで設定するユーザ名を記述します。
WORDPRESS_DB_PASSWORD にはMySQLで設定するユーザのパスワードを設定します。

MySQLの環境変数

MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wordpress
MYSQL_USER=mysql_user
MYSQL_PASSWORD=password

MySQLで使用する値を設定するための環境変数です。
MYSQL_RANDOM_ROOT_PASSWORD はrootユーザを作成する際、自動的にランダムなパスワードを設定するための設定です。
MYSQL_DATABASE はWordPressで使用するためのデータベース名を記述します。
MYSQL_USER はWordPressでデータベースにアクセスするためのユーザ名を記述します。
MYSQL_PASSWORD はWordPressでデータベースにアクセスするためのユーザパスワードを記述します。

データベース名、ユーザ名、ユーザパスワードはWordPress側の設定と合わせておく必要が有ります。

システムに関する環境変数

USER_NAME=user_name
APP=APP_NAME
DOMAIN=example.com
EMAIL=user_name@example.com

システムで使用するための環境変数です。
USER_NAME はホスト側のログインユーザ名を記述します。
APP はWordPressを保存するディレクトリ名を記述します。 今回の例では、wordpress となります。
DOMAIN はLet's Encryptで発行する証明書のドメイン名を記述します。
EMAIL はLet's Encryptに登録するメールアドレスを記述します。

デプロイ

各種設定ファイルの配置と、環境変数の設定が完了したら以下のコマンドを実行してデプロイします。
登録したドメインにアクセスし、正常にWordPressの言語選択画面が表示されたら完了です。

sudo docker-compose up -d

後書き

以上でWordPressの構築は完了です。
あまり詳しく書ききれなかったので、不明な点や誤記等あれば気軽にコメントを頂けたら幸いです。