自宅Fedoraサーバで、docker-compose版WordPressを動かしていました。
ローカルボリュームをマウントして運用していましたが。
コンテナのマイグレーションのため、コンテナ内からボリュームをバックアップするスクリプトを記録しておこうと思います。
目次
docker-compose版Wordpressのボリュームバックアップスクリプト
調べておくこと
新しい環境ではPodmanを使用する予定ですが、docker-composeファイルを新しい環境にコピーしておきます。下記の確認に使用するためです。
- 使用しているイメージ
- mariadbなのかmysqlなのか
- タグ(バージョン、fpm版かapache版か実装の違い等)
- 環境変数
- データベース名
- ユーザ名
- パスワード
- サイトのURL
マイグレーション先の環境でポッドを作成する際、これらを合わせないと、コンテナがうまく動作しないためです。
また後述しますが、URLを変更する場合、データベース内の設定値も変える必要があります。
イメージのバックアップ
まずは、dockerで使用していたイメージを保存しました。
docker save -o image_mysql.tar mysql:latest
docker save -o image_mariadb.tar mariadb:latest
docker save -o image_wordpress.tar wordpress:latest
コンテナ環境は、普通に2年とか3年安定して動いてしまうのですね・・・いや4年とか。
タグはlatestなのに、2年前とか。タグの運用とはいったい。
何よりも気になるのは。
長期間使用しているからこそ、故障等で動かなくなった時のダメージは大きそうです。恐ろしい。しっかりバックアップしたいと思います。
コンテナのバックアップ
コンテナの状態も念のためバックアップしました。
docker container commit wp-db wp-db-image
docker image save -o container_wp-db.tar wp-db-image
docker container commit wp-web wp-web-image
docker image save -o container_wp-web.tar wp-web-image
ボリュームのバックアップ
ボリュームに関しては、docker-composeコマンドでコンテナを停止後、下記の動作のコンテナを一時的に動かしてバックアップしました。
- docker run –rmコマンドで実行後に消えるコンテナを作成。
- バックアップ元として、–volumes-fromオプションで、WordPressコンテナとデータベースコンテナそれぞれをマウント。
- バックアップ先として、カレントディレクトリをコンテナ内から/backupへマウント。
- tarコマンドで、該当のボリュームをアーカイブ・圧縮して/backupディレクトリに出力。
docker-compose stop
docker run --rm --volumes-from wordpress_wordpress_1 -v ${PWD}:/backup:z fedora tar zcvf /backup/volume_wp-web_html.tar.gz /var/www/html
rem ※22.11.20追記:データベースのボリュームはバックアップしてもマイグレートできない可能性が御座います
docker run --rm --volumes-from wordpress_db_1 -v ${PWD}:/backup:z fedora tar zcvf /backup/volume_wp-db_mysql.tar.gz /var/lib/mysql
docker-compose start
データベースのダンプが別途必要
上記のデータベースボリュームは、マイグレーション先で使用できない可能性があります。
理由は、純粋にコンテンツのファイルが入っているわけではなく、データベースの実行状態を記録したファイルが入っているためです。
データベースにつきましては、別途、内容をダンプして保存しておく必要があると思います。
まずは、データベースの状態を確認してみました。
# DBコンテナでシェル実行
docker-exec -it wordpress_db_1 bash
mysql --user=wordpress --password=wordpress show databases; exit
続いてデータベースをダンプしてローカルディレクトリにコピーしました。
# mysqlをダンプ
docker exec wordpress_db_1 mysqldump --user=wordpress --password=wordpress wordpress > /tmp/mysqldump_wordpress.sql
# docker cpコマンドでコピー
docker cp wordpress_db_1:/tmp/mysqldump_wordpress.sql .
docker cpコマンドは便利ですね。
バックアップスクリプト全体
以上から、次の内容になりました。
# イメージのバックアップ
docker save -o image_mysql.tar mysql:latest
docker save -o image_wordpress.tar wordpress:latest
# コンテナのコミットとバックアップ
docker container commit wp-db wp-db-image
docker image save -o container_wp-db.tar wp-db-image
docker container commit wp-web wp-web-image
docker image save -o container_wp-web.tar wp-web-image
# mysqlをダンプ
docker exec wordpress_db_1 mysqldump --user=wordpress --password=wordpress wordpress > /tmp/mysqldump_wordpress.sql
# docker cpコマンドでコピー
docker cp wordpress_db_1:/tmp/mysqldump_wordpress.sql .
# ボリュームのバックアップ
docker-compose stop
docker run --rm --volumes-from wordpress_wordpress_1 -v ${PWD}:/backup:z fedora tar zcvf /backup/volume_wp-web_html.tar.gz /var/www/html
rem ※22.11.20追記:データベースのボリュームはバックアップしてもマイグレートできない可能性が御座います
docker run --rm --volumes-from wordpress_db_1 -v ${PWD}:/backup:z fedora tar zcvf /backup/volume_wp-db_mysql.tar.gz /var/lib/mysql
docker-compose start
リストア
WordPressポッドの作成はこちらの記事になります。
作成したポッドにボリュームとmysqlのダンプをリストアしました。
:start
pushd %~dp0
set pod=wp-pod
set containers=wp-web wp-db wp-phpmyadmin
rem DBリストア
set container=wp-db
set fn=volume_%container%.tar.gz
podman exec wp-db sh -c "mysql --user=wordpress --password=wordpress wordpress < /backup/mysqldump_wordpress.sql"
rem podman exec -it wp-db bash
rem ボリュームをリストア
podman container stop %containers%
set container=wp-web
set fn=volume_%container%.tar.gz
podman run --rm --volumes-from %container% -v .:/backup fedora bash -c "cd / && tar zxvf /backup/%fn%"
podman container start %containers%
:end
popd
マイグレーション後の確認
同じ環境で、起動→バックアップ→削除→リストアを行うには問題ありませんが。
dockerからpodmanへ移行する際、たとえばURLやポート番号が変わると、設定の調整が必要になります。
wp-config.phpの調整
dockerではlinkオプションでコンテナ間のリンクを設定できました。
Podmanはlinkが存在しないため、たとえばMysqlの場合、環境変数WORDPRESS_DB_HOSTでIPアドレス 127.0.0.1を指定する必要があります。
すでに動作している環境では、wp-config.phpファイルにすでにホスト名が埋め込まれている場合があるため、直接編集が必要になります。
rem Webコンテナにvimをインストールする覚書
podman exec -it wp-web bash
apt update
apt install -y vim
コンテナ内にテキストエディタをインストールしてwp-confg.phpファイルを編集しました。
データベース設定値の調整
ポート番号やURLが変わると、データベース内のテーブルに埋め込まれた値を変更する必要が出ます。
基本的には、公式マニュアルに従って、URLを変更します。
https://ja.wordpress.org/support/article/changing-the-site-url/
データベースのバックアップと値の変更のため、phyMyAdminやadminer等のツールは、ほぼ必須だと思います。
こちらの記事にて、phpMyAdminを同じポッドで動かしています。
phpMyAdminを使用して、次の操作をしました。
- 念のためphpMyAdminからWordPressのデータベースをエクスポート
- wp_optionsテーブルのoption_value列を変更
変更後、Webブラウザを一度終了してセッションをクリアします。
または別のWebブラウザで、新しいURLにアクセスして動作を確認しました。
バックアップしたWordPressは、FedoraのDocker環境で数年動かしていました。
ポッドに移行するタイミングで、イメージのバージョンを上げる事ができました。
またデータベースに関しては、ダンプしたデータを使用したため、MysqlからMariadbにイメージを変更後、リストアすることが可能でした。
移行が完了し、Windows 10でポッドが動くようになりましたので、しばらく使用して様子を見てみようと思います。