今回は前回の続きです。
おさらい
今回は低コストに抑えるため、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の構築は完了です。
あまり詳しく書ききれなかったので、不明な点や誤記等あれば気軽にコメントを頂けたら幸いです。