Fedoraのdocker-composeで、自分用のWordPressを動かしております。
先日、Fedoraを32に更新したところ。
WordPressが動作しなくなってしまいました。あれれー?
動かなくなった原因は記事に記載致しますが、大まかに申し上げると、dockerが正常に動作していないようです。
いずれdockerからPodmanに移行しなければならないのですが・・・移行時にdockerが動かないのは不便ですので、一時的にでもdockerを動かす方法を記録しておこうと思います。
※20.9.21追記:
その後、dokcer composeからPodmanへ移行しました。Podman用のyamlファイルを用意しましたので、今は移行したほうが楽な気がします。
目次
Fedora32で一時的にDockerを動かす手順
Fedora 32対応版Dockerのインストール
こちらのfedora MAGAZINEの記事を参考にしたところ。どうやら、6月26日時点でFedora 32ではDockerがサポートされていないようです。
サポートされない理由は、podmanへ開発の主軸が移ったためのようです。ふむふむ。
しかしながら。サポート外ながら、Docker環境のインストール手順が紹介されています。
こちらの手順で、dockerを入れ替えてみました。
- dockerをアンインストールします。
sudo dnf remove docker-* sudo dnf config-manager --disable docker-*
- CGroupsを有効にします。
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
- firewalldの設定を変更し、docker-0インタフェースをホワイトリストに追加します。
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0 sudo firewall-cmd --permanent --zone=FedoraWorkstation --add-masquerade
- Mobyをインストール、dockerを有効化、再起動します。
sudo dnf install moby-engine docker-compose sudo systemctl enable docker sudo systemctl reboot
WordPress用docker-compose.yamlの更新
dockerを入れ替えてみたもものの、wordpressが正常に動作していません。orz
最初に、オフィシャルイメージ情報をもとに、docker-compose.yamlを更新しました。
コンテナ間で通信できるよう、linksを追加しました。
またデバッグ用の設定を追加しました。ユーザ名やパスワードは適宜変更して下さい。
version: '3.3'
services:
db:
image: mysql:latest
volumes:
- "./.data/db:/var/lib/mysql:z"
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
security_opt:
- seccomp:unconfined
wordpress:
depends_on:
- db
image: wordpress:latest
links:
- "db"
ports:
- "8000:80"
volumes:
- "./.data/html:/var/www/html:z"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DEBUG: 0
正常に動作しない原因を探るため、デバッグモードを動かせるようにしました。WordPressをデバッグ実行する場合、「WORDPRESS_DEBUG: 0」を「:1」に設定します。
docker-compose.yaml更新後、WordPressを起動してみました。
docker-compose up -d
エラーの原因は、mysqlの動作か、コンテナ間の通信にある感じです。
mysqlの動作確認
mysqlが正しく動作しているかどうか、確認してみました。
su
cd /root/docker/wordpress
docker-compose exec db bash
# dbコンテナでmysqlコマンドを実行
mysql -h localhost -p -u wordpress
このようにmysql> プロンプトが表示されれば、mysqlは問題なく動作しています。
というわけで、怪しいのはコンテナ間の通信、ということになります。
Firewalldのログ確認
firewalldのログを表示します。
firewall-cmd --set-log-denied=all
firewall-cmd --reload
journalctl -fn0
ログを見てみると、ポート番号3306の通信がfirewalldでブロックされていて、dockerのコンテナ間で通信ができていないようです。ふむふむ。
少し厄介なのは、docker0のインタフェースではなく、br-で始まるdocker-composeの動的なネットワーク・インタフェースでブロックされているところです。
Firewalldのtrustedゾーンにdocker-composeのインタフェースを追加
次の手順でfirewalldの信頼できるゾーンにdocker-composeのインタフェースを追加しました。
ip addr
# br-で始まるdocker-composeのインタフェースを確認
firewall-cmd --permanent --zone=trusted --add-interface=<brで始まるインタフェース名>
firewall-cmd --reload
# コピペ用
# firewall-cmd --list-all
# firewall-cmd --get-active-zones
# firewall-cmd --list-services
# firewall-cmd --permanent --zone=trusted --remove-interface=<brで始まるインタフェース名>
ip addrコマンドで、docker-composeで生成されたインタフェースを確認します。この場合、br-bcb~というインタフェースが、docker-composeで使用されています。
このインタフェースを、trustedゾーンに追加することで、wordpressコンテナとdbコンテナ間の通信が行えるようにしました。
とりあえずwordpressが動作しましたが。
docker-composeコマンドでサービスを再起動すると、インタフェースが変わるため、また動かなくなります。再度、firewalldのtrustedゾーンにインタフェースを追加する必要があります。
根本的な解決方法は。
やはりdockerからPodmanへの移行でしょうか。
とりあえずdockerを動かして、データを取り出せる状態にしましたので。追々Podman環境を作成していこうと思います。
※20.9.21追記: