前回、Dockerで動かしていましたPostgreSQLコンテナのデータベースを。
Windows版Podman.exeで新たにポッドとコンテナを作成し。
PodmanのPostgreSQLコンテナにデータベースをリストアしました。
同じ流れで、MongoDBコンテナの内容を移行したいと思います。
目次
Dockerコンテナ側でデータベースをバックアップ
まずは、既存のコンテナのMongoDBのバックアップをどうするかですが。
Dockerのコンテナから、Podmanのコンテナへ持ってゆく、という状況を踏まえますと。使用するイメージが変わる可能性がありますので、下記の永続化ボリュームをバックアップする方法は、互換性にリスクがあります。
- /data/configdb
- /data/db
MongoDBのバージョン違いや構成違いの影響を受けないように、ここでは純粋にデータベースのデータのみダンプしたほうが、互換性が高いと判断しました。
そのような理由から、mongodumpでデータベースの純粋な構造とデータのみ出力する方法を取りたいと思います。
mongodumpによるバックアップ
MongoDBのコンテナでシェルを起動します。
こちらの記事の内容になります
現在のMongoDB Ver.6は、mongo adminコマンドは存在せず、mongoshコマンドが存在するのですね。ふむふむ。
手元にdocker環境が無いため、podmanの画面で手順のみ記録します。
ここでは例として「sv1」というデータベースをダンプします。ダンプの際、コンテナを起動した時に設定したユーザ名、パスワードを使用します。
また認証データベースとしてadminを指定する必要があるようです。
具体的なダンプコマンドは下記になります。
cd /backup
# MongoDBのデータベースをダンプ
# mongodump -u <ユーザ名> -p <パスワード> --authenticationDatabase admin -d <データベース名> -o .
mongodump -u root -p humongous --authenticationDatabase admin -d sv1 -o .
この画面では、コレクションは5つあります。
mongodumpコマンドを実行すると、データベース名のディレクトリが作成され、jsonとbsonファイルが出力されました。
ファイル数は、コレクションそれぞれのjson,bsonということで、10ファイルになりました。
こちらのデータを、次に作成するPodmanのコンテナへ読み込めるところへ保存しておきます。
Podmanでアプリケーション用のポッドを作成
では、Podman側でMongoDBを起動したいと思います。
ポッドを作成し、その中でMongoDB本体と管理ツールのMongoExpressのコンテナを起動したいと思います。
移行作業用のため、Windows側のカレントディレクトリをコンテナの/backupにマウントしています。
尚、パスワードがヒューマンガス様になっていますのでそのままお使い下さい。(まて
rem ポッド作成
podman pod create --name sv1-pod -p 8081:8081/tcp
rem MongoDBコンテナ作成
podman run ^
--restart=always ^
--pod=sv1-pod ^
--name=sv1-mongodb ^
-e MONGO_INITDB_ROOT_USERNAME="root" ^
-e MONGO_INITDB_ROOT_PASSWORD="humongous" ^
-v .:/backup ^
-d docker.io/library/mongo:latest
rem Mongo Expressコンテナ作成
podman run ^
--restart=always ^
--pod=sv1-pod ^
--name=sv1-mongoexp ^
-e ME_CONFIG_MONGODB_SERVER="127.0.0.1" ^
-e ME_CONFIG_MONGODB_ADMINUSERNAME="root" ^
-e ME_CONFIG_MONGODB_ADMINPASSWORD="humongous" ^
-v .:/backup ^
-d docker.io/library/mongo-express:latest
rem ブラウザ起動
start http://localhost:8081
起動後、WebブラウザでMongoExpressにアクセスして正しく動作しているか確認します。
http://localhost:8081
mongorestoreコマンドによるリストア
MongoDBコンテナでbashを起動します。
podman exec -it sv1-mongodb bash
コンテナ内からは/backupディレクトリに、コンテナを起動したディレクトリがマウントされていると思います。
先程ダンプしたデータを、コンテナを起動したディレクトリにコピーしておきます。
そちらに移動後、リストアコマンドを実行しました。
cd /backup
# MongoDBのデータベースをリストア
# mongorestore -u <ユーザ名> -p <パスワード> --authenticationDatabase admin -d <データベース名> <ダンプ先ディレクトリ>/
mongorestore -u root -p humongous --authenticationDatabase admin -d sv1 sv1/
MongoDBのポピュレーション機能(RDBのリレーションのようなもの)を使用しているため、ログの出力が少し大きいですが。
すべてのコレクションが取り込めているようです。
以上で、DockerのMongoDBコンテナから、PodmanのMongDBコンテナへデータを移行することができました。
ボリュームはバックアップしても復元できず
データベースのコンテナから、ボリュームをバックアップ・リストアするコマンドを記録しておきますが、実用ではありません。
参考:バックアップ
rem sv1-mongodbコンテナのボリュームバックアップ
podman container stop sv1-mongodb
podman run --rm --volumes-from sv1-mongodb -v .:/backup fedora tar zcvf /backup/mongodb.tar.gz /data/db /data/configdb
podman container start sv1-mongodb
podman pod stop sv1-pod
podman pod start sv1-pod
参考:リストア
rem ポッドとボリューム削除
podman pod stop sv1-pod
podman pod rm sv1-pod
podman volume prune
rem sv1-mongodbコンテナのボリュームリストア
podman container stop sv1-mongodb
podman run --rm --volumes-from sv1-mongodb -v .:/backup fedora bash -c "cd / && tar zxvf /backup/mongodb.tar.gz"
podman container start sv1-mongodb
データベースのディレクトリは、プロセス(プログラム)が動作している状態が格納されているため、バックアップ・リストアして状態を復元できるものでは無いようです。
データベースをバックアップしたい場合、ボリュームの保存ではなく、ダンプ・リストアする必要があるようです。
新しくPodmanで作成したポッドで、MongoDBとMongoExpress環境を作成し、Dockerで動かしていたデータベースを移行することができました。
ボリュームのバックアップ手順も作りましたので、ポッドをマイグレーションすることも可能となりました。
Podmanのポッドの場合、1つのポッドの中で、たとえばMongoDBとPostgreSQLを動かして連携させることが可能です。
そのような状況に応じて、コンテナを足したり、バックアップのコマンドを足して使用する感じかと思います。
さて。
次はNode環境のコンテナをなんとかしようと思います。