投稿日:

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のサンプルを参照しつつ以下のように作成した.

dokcer-compose.yml
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配下に以下を作成する.

default.conf
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の初期画面が表示されることを確認する.

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ページが表示されるようになっている.

デフォルトWebページ

以降,管理画面は https://test.com/wp-login.php で表示できる.

手順ここまで.ありがとうございました.

参考

https-portalを使ってみて、個人的にぶつかりそうな壁の解決方法 - Qiita