はじめに
WordPressは、自宅サーバーで最も需要の高い定番アプリケーションの一つです。本ページでは、前回構築したApache(Podmanコンテナ)を発展させ、WordPress本体とデータベース(MariaDB)を2つのコンテナに分けて構築します。
1. 詳細な技術要素
| 用語 | 説明 |
|---|---|
| Podmanネットワーク | 複数のコンテナを同じ仮想ネットワークに参加させ、コンテナ名だけで相互に通信できるようにする仕組み。 |
| aardvark-dns | Podmanネットワーク内で、コンテナ名からIPアドレスを解決するための内蔵DNSサーバー。 |
| バインドマウント | ホスト側のディレクトリをコンテナ内に見せる仕組み(-vオプション)。データベースのデータやWordPressのファイルをホスト側に永続化するために使う。 |
| 公式Docker Hubイメージ(wordpress/mariadb) | WordPress・MariaDBそれぞれの公式コンテナイメージ。環境変数でデータベース接続情報を渡すだけで動作するよう設計されている。 |
2. 実証手順
コンテナ用ネットワークとデータ保存先を準備する
sudo podman network create wordpress-net
mkdir -p ~/wp-db-data ~/wp-content-data
実機で発生:バインドマウント先のディレクトリが自動作成されない
Dockerではホスト側のディレクトリが存在しない場合自動的に作成されるが、Podmanは自動作成せず、statfs: no such file or directoryエラーになる(実機で確認済み)。-vでマウントするディレクトリは事前にmkdir -pで作成しておくこと。
データベース(MariaDB)コンテナを起動する
sudo podman run -d --name wp-db --network wordpress-net --restart=always \
-e MYSQL_ROOT_PASSWORD=(強力なパスワード) \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wordpress \
-e MYSQL_PASSWORD=(強力なパスワード) \
-v ~/wp-db-data:/var/lib/mysql:Z \
docker.io/library/mariadb:latest
パスワードはopenssl rand -base64 18等で生成した推測されにくい文字列を使うこと。
WordPress本体のコンテナを起動する
sudo podman run -d --name wordpress --network wordpress-net --restart=always -p 80:80 \
-e WORDPRESS_DB_HOST=wp-db \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=(手順2と同じパスワード) \
-v ~/wp-content-data:/var/www/html:Z \
docker.io/library/wordpress:latest
WORDPRESS_DB_HOSTには、Podmanネットワーク内のコンテナ名(wp-db)をそのまま指定できる。名前解決がうまくいかない場合は次章「トラブルシューティング」参照。
ブラウザからインストールウィザードを進める
ブラウザでhttp://(サーバーのIP)/を開くと、WordPressの初期セットアップ画面が表示される。言語選択の後、サイトのタイトル・ユーザー名・パスワード・メールアドレスを入力する。
- ユーザー名:
adminは避け、推測されにくい名前にする - パスワード:自動生成される強力なパスワードをそのまま使う
- 検索エンジンでの表示:LAN内限定のテスト環境であれば、インデックスを回避するチェックを入れておく
3. トラブルシューティング
WordPressにアクセスすると「Database Error」(500エラー)になる
原因の確認:コンテナ内からgetent hosts wp-dbを実行し、名前解決ができているか確認する。
sudo podman exec wordpress getent hosts wp-db
実機で発生した原因:UFWが、Podmanのブリッジネットワーク(podman1)内部の通信(コンテナ間のDNS問い合わせを含む)までブロックしていた。sudo ufw disableで一時的に無効化して名前解決が回復することを確認し、原因を特定した。
sudo ufw allow in on podman1
sudo ufw enable
UFWを無効化したままにせず、Podmanのブリッジインターフェース宛ての通信だけを許可するルールを追加してから再度有効化すること。SSH接続が維持されることも確認した。
4. まとめ
WordPress+MariaDBの2コンテナ構成を構築しました。ポイントは、①Podmanはバインドマウント先のディレクトリを自動作成しないこと、②UFWがPodmanのブリッジネットワーク内部の通信まで妨げることがあり、コンテナを使う場合はブリッジインターフェースの許可ルールが必要になること、の2点です。