DockerでWordPress構築(+SSL対応)
はじめに
DockerでWordPressを構築した際の作業メモ
WebサーバはNginxを利用.また外部への公開を視野に入れて,https-portalを利用したSSL(HTTPS)対応も実施した.
なお,外部への公開にはグローバルIPアドレスとそれに紐づけたドメインの取得も必要となってくるので別途用意すること(記事中はtest.comというドメイン名で仮表記).
手順
docker関連ファイル準備
Dockerで使用したイメージは以下 (リンク先はDocker Hub)
イメージ | タグ | 概要 |
---|---|---|
wordpress | 6-fpm-alpine | オープンソースのブログソフトウェア (Wikipedia抜粋) 後述のNginxを利用するのでApachインストール無しのfpm版を選定した |
mysql | 5.7 | WordPressで使用するDB.バージョンはWordPress公式のDockerファイルに合わせて5.7とした |
nginx | alpine | フリーかつオープンソースなWebサーバ (Wikipedia抜粋) WordPressを公開するWebサーバとして利用する |
https-portal | 1 | HTTPS終端・リバースプロキシサーバ Let’s EncryptでのSSL証明書発行等を自動で実施してくれるので簡単にSSL対応が実現できる |
アクセスの流れは以下のようなイメージ
インターネット – [HTTPS] -> https-portal – [HTTP] -> Nginx+WordPress
docker-compose
dockerhubのサンプルを参照しつつ以下のように作成した.
version: '3'
services:
wordpress:
container_name: wordpress
image: wordpress:6-fpm-alpine
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: user
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: wordpress
volumes:
- ./app:/var/www/html
db:
container_name: mysql
image: mysql:5.7
restart: unless-stopped
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./db:/var/lib/mysql
nginx:
container_name: nginx
image: nginx:alpine
restart: unless-stopped
volumes:
- ./web/conf.d:/etc/nginx/conf.d
- ./web/log:/var/log/nginx
- ./app:/var/www/html
https-portal:
container_name: https-portal
image: steveltn/https-portal:1
ports:
- 80:80
- 443:443
restart: unless-stopped
volumes:
- ./ssl_certs:/var/lib/https-portal
environment:
DOMAINS: 'test.com -> http://nginx:80'
STAGE: local
# STAGE: staging
# STAGE: production
CLIENT_MAX_BODY_SIZE: 64M
47行目の”test.com”は,外部からのアクセスに使用するドメイン名を指定する.
また http://nginx:80
は,28行目で指定したNginxのサービス名”nginx”と合わせる.
DOMAINS: 'test.com -> http://nginx:80'
4行目のwordpressのサービス名は次項のNginxコンフィグにも影響するため変更した場合は要注意
Nginxコンフィグ
./web/conf.d配下に以下を作成する.
server {
listen 80;
server_name localhost;
client_max_body_size 64M;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
19行目の”wordpress:9000″は,docker-compose.ymlの4行目で指定したサービス名”wordpress”に合わせる.
ディレクトリ構成
立ち上げ前のディレクトリ構成は以下となる.
/wordpress
|--docker-compose.yml
|--web
| |--conf.d
| | |--default.conf
各コンテナのデータはdocker-composeファイルと同じディレクトリに格納するようマウント先を指定したため,最終的なディレクトリ構造は以下のようになる.
/wordpress
|--docker-compose.yml
|--app
| |--[WordPressデータ]
|--db
| |--[MySQLデータ (WordPressデータ)]
|--ssl-certs
| |--[https-portalデータ (証明書類)]
|--web
| |--conf.d
| | |--default.conf
| |--log
| | |--[Nginxログ]
バックアップ/リカバリする場合はこのディレクトリごとコピーすれば良いはず.
立ち上げ(テスト)
docker-compose.ymlを配置したディレクトリにて以下コマンドでコンテナを立ち上げる.
$ docker-compose up -d
docker-compose.ymlでSTAGE: localを指定していると,Let’s Encryptと連携しない自己署名証明(オレオレ証明書)での立ち上げとなる.
docker-composeで指定したドメイン(test.com)でhttps-portalの外部IPアドレスへ飛ぶように,アクセスする端末のhosts設定を追加する.
$ sudo sh -c "echo \"ww.xx.yy.zz test.com\" >> /etc/hosts"
https://test.com にアクセスして,自己署名証明書の警告の後にWordPressの初期画面が表示されることを確認する.
STAGE | メモ |
---|---|
local | オレオレ証明書 |
staging | Let’s Encryptと連携するが本番用の証明書ではない (自己署名証明書の警告文が出る) |
production | 本番用.Let’s Encryptへの接続回数上限(1時間5回迄)があるので,localやstagingで事前に動作確認しておいたほうが良い |
立ち上げ
STAGE: productionを指定してコンテナを再度立ち上げる.
environment:
DOMAINS: 'test.com -> http://nginx:80'
# STAGE: local # 変更
# STAGE: staging
STAGE: production # 変更
$ docker-compose up -d
/etc/hostsの設定を削除した上で https://test.com にアクセしてもユーザ登録画面が表示されるはず.
ユーザ登録が完了すると管理画面が表示される.この時点でシークレットタブ等から改めて https://test.com にアクセスするとデフォルトのWebページが表示されるようになっている.
以降,管理画面は https://test.com/wp-login.php で表示できる.
手順ここまで.ありがとうございました.