目次
うっかり CentOS 8 で構築してしまったため、自宅のサーバーでは Docker ではなく Podman を使っている。Docker ほど Web 上に情報がないので以下にまとめておく。
Pod の作成
まず Pod を作る。これがないと WordPress のコンテナと MariaDB のコンテナ間通信ができない。
$ podman pod create \
--name wordpress_pod \
-p 20080:80 \
-p 20443:443
外側に公開するポートは 20080/tcp と 20443/tcp とする。80/tcp, 443/tcp でもいいけど、well-known ポートをルートレスコンテナ、すなわち非root権限で動かすのはやや抵抗があったのでこのようにした。
ポート番号を決めたら firewalld の設定も必要。
$ sudo firewall-cmd --add-port=20080/tcp --permanent
$ sudo firewall-cmd --add-port=20443/tcp --permanent
$ sudo firewall-cmd --reload
MariaDB コンテナの起動
次に MariaDB コンテナを作る。DBのデータは mariadb-data という名前のデータボリュームに置く。これでコンテナを作り直してもDBのデータは保持されるようになる。
$ podman run -d \
--pod wordpress_pod \
--name mariadb \
--restart=unless-stopped \
-e MARIADB_ROOT_PASSWORD=supersecretpassword \
-v mariadb-data:/var/lib/mysql \
mariadb:10.6
WordPress 用 DB の作成
WordPress 用には root とは別にユーザを作成した。今思うとどうせ WordPress からしか使わない DB コンテナなのであれば、わざわざユーザ分けなくてもよかったかもしれない。
$ podman exec -ti mariadb mysql -uroot -p
MariaDB [(none)]> CREATE DATABASE wordpress charset utf8mb4;
MariaDB [(none)]> CREATE USER 'wordpress'@'%' IDENTIFIED BY 'supersecretpassword';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress.* to 'wordpress'@'%';
MariaDB [(none)]> FLUSH PRIVILEGES;
WordPress コンテナの起動
WordPress コンテナは SSL (Let’s Encrypt) 対応にしたかったため、コンテナ内部に certbot をインストールすることにした。
以下の Dockerfile を作成。
FROM wordpress:5.8-apache
RUN apt update -y && apt install -y certbot python-certbot-apache && apt clean && rm -rf /var/lib/apt/lists/*
そしてビルド。
$ podman build -t wordpress_certbot .
ビルドできたらコンテナを実行する。コンテナを作り直してもデータが消えないように、WordPress の wp-content/ と Let’s Encrypt の証明書、certbot によって書き換えられる /etc/apache2 以下のコンフィグはデータボリュームに置く。
$ podman run -d \
--pod=wordpress_pod \
--restart=unless-stopped \
-e WORDPRESS_DB_HOST=mariadb \
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=supersecretpassword \
-e WORDPRESS_DB_NAME=wordpress \
-v wordpress-data:/var/www/html \
-v wordpress-certificate:/etc/letsencrypt \
-v wordpress-config:/etc/apache2 \
--name wordpress \
wordpress_certbot
Let’s Encrypt 証明書のインストール
この段階ではまだ HTTPS で接続できない。WordPress コンテナに入って certbot を実行し、証明書をインストールする。もちろんドメインのバリデーションが発生するので、ドメインやDNSレコードの設定を別途事前にやっておく必要がある。
またバリデーションを通すにはインターネット側から 80/tcp でコンテナにつながるように、ルーターなりファイアウォールなりで 80/tcp -> 20080/tcp, 443/tcp -> 20443/tcp のポートフォワードを設定する必要がある。
$ podman exec -ti wordpress /bin/bash
# certbot run
インストールできたらコンテナを再起動。
$ podman restart wordpress
Tweet