目次

CentOS7 + MySQL8.0 で WordPress(SSL 対応)

WordPress のインストールをできるだけ楽にするためコマンド経由でやってみた例。
mkcert を使った独自 SSL 証明書で SSL 通信にも対応。

ディレクトリ構成

project
├ docker
│  ├ app
│  |  ├ cert
│  |  |  ├ XXX.XXX.XXX.XXX-key.pem
│  |  |  └ XXX.XXX.XXX.XXX.pem
│  |  ├ conf
│  |  |  └ php74.ini
│  |  ├ conf.d
│  |  |  ├ charset.cnf
│  |  |  ├ html.conf
│  |  |  └ my_ssl.conf
│  |  └ Dockerfile
│  ├ db
│  |  ├ conf.d
│  |  |  └ charset.cnf
│  |  └ Dockerfile
│  └ docker-compose.yml
└ production  // appコンテナに載せるプログラムファイルを格納

docker/docker-compose.yml

version: '3'
services:
  db:
    container_name: wp_db
    build: ./db/
    image: laravel_mysql80_db
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: wp
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    ports:
      - 3306:3306
  app:
    container_name: wp_app
    build: ./app/
    image: wordpress_centos7_php74_app
    ports:
      - 8080:80
      - 4430:443
    volumes:
      - ../production:/var/www/production/
    tty: true
    stdin_open: true
    privileged: true
    command: /sbin/init
    depends_on:
      - db

docker/app/Dockerfile

FROM centos:7

RUN yum -y update && \
    yum -y install httpd && \
    yum -y install epel-release && \
    yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && \
    yum -y install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-gd php-xml php-mysqlnd php-bcmath php-json php-pecl-zip php-imap && \
    yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm && \
    yum -y install --enablerepo=mysql80-community mysql-community-server && \
    yum -y install zip unzip && \
    yum -y install less && \
    yum -y install mod_ssl openssl

ENV LANG=ja_JP.UTF-8 LC_ALL=C LANGUAGE=ja_JP:ja

COPY ./cert/XXX.XXX.XXX.XXX.pem /etc/pki/tls/certs/XXX.XXX.XXX.XXX.pem
COPY ./cert/XXX.XXX.XXX.XXX-key.pem /etc/pki/tls/certs/XXX.XXX.XXX.XXX-key.pem
COPY ./conf/php74.ini /etc/php.ini
COPY ./conf.d/html.conf /etc/httpd/conf.d/html.conf
COPY ./conf.d/my_ssl.conf /etc/httpd/conf.d/my_ssl.conf
COPY ./conf.d/charset.cnf /etc/my.cnf.d/charset.cnf

RUN chmod 644 /etc/httpd/conf.d/html.conf && \
    mkdir /var/log/php && \
    chown apache:apache /var/log/php && \
    rm -rf /var/www/html && \
    ln -s /var/www/production /var/www/html && \
    curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
    chmod +x wp-cli.phar && \
    mv wp-cli.phar /usr/local/bin/wp && \
    mkdir /var/www/wp && \
    wp core download --locale=ja --path=/var/www/wp

# httpd
RUN systemctl enable httpd

WP-CLI を使って、コマンドラインから WordPress のインストールを行っています。
参考サイト

wp core download –locale=ja –path=/var/www/wp

このコマンドで、WordPress のコアファイルをダウンロードしています。パスで「/var/www/production」を指定すると何故かうまく動作しなかったので、一度「/var/www/wp」にダウンロードしています。
後ほど、Web コンテナ内に入って、production への移動や、WordPress のインストールの続きを行います。

docker/app/cert

予め mkcert で作っておいた「サーバ証明書」と「秘密鍵」を設置。

docker/app/conf/php74.ini

予め PHP7.4 の Web コンテナを立ち上げるなどして、php.ini をコピーし、設定したい内容を書き換えて設置。

docker/app/conf.d/html.conf

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

docker/app/conf.d/my_ssl.conf

<VirtualHost _default_:443>
  DocumentRoot "/var/www/html"
  ServerName XXX.XXX.XXX.XXX:443

  SSLCertificateFile /etc/pki/tls/certs/XXX.XXX.XXX.XXX.pem
  SSLCertificateKeyFile /etc/pki/tls/certs/XXX.XXX.XXX.XXX-key.pem
</VirtualHost>

docker/app/conf.d/charset.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin
init-connect='set names utf8'

[client]
loose-default-character-set = utf8mb4

docker/db/Dockerfile

FROM mysql:8.0

RUN apt-get update && \
    apt-get -y install locales-all

ENV LANG=ja_JP.UTF-8 LC_ALL=C LANGUAGE=ja_JP:ja

COPY ./conf.d/charset.cnf /etc/my.cnf.d/charset.cnf

docker/db/conf.d/charset.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin
init-connect='set names utf8'

[client]
loose-default-character-set = utf8mb4

コマンドの実行

Docker Quickstart Terminal を起動する。

# project/docker ディレクトリへ移動
cd project/docker

# コンテナの作成&起動
# -d をつけることでバックグラウンドでコンテナを起動
# --build をつけることでイメージを作成
docker-compose up -d --build

# コンテナの一覧を確認
docker-compose ps

# IP アドレスを調べる
docker-machine ip

# 192.168.99.100 なら、以下でアクセス可能になる
# http://192.168.99.100:8080

# 2回め以降は、バックグラウンドでコンテナを起動するだけでよい
docker-compose up -d

# app コンテナに入る
docker container exec -it wp_app /bin/bash

# db コンテナの DB に接続できるか確認
mysql -h wp_db --port 3306 -u docker -pdocker -D laravel_db

exit

WordPress のインストール

# WordPress のコアファイルがダウンロードされているのを確認
ls -l /var/www/wp

# WP-CLI が動作するか確認
wp --info

# wp の中身を production に移動
mv /var/www/wp/* /var/www/production/

# wp の削除
rm -rf /var/www/wp

# wp-config.php の生成
wp core config --dbname='wp' --dbuser='docker' --dbpass='docker' --dbhost='wp_db' --path=/var/www/production

# WordPress をインストール
wp core install --url='http://XXX.XXX.XXX.XXX:8080' --title='てすと' --admin_name='admin' --admin_password='admin' --admin_email='test@example.com' --path=/var/www/html

これで WordPress のインストールが完了します。
あとは、ブラウザでローカルの URL にアクセスして WordPress のページが表示されることを確認します。

http://XXX.XXX.XXX.XXX:8080
http://XXX.XXX.XXX.XXX:8080/wp-admin