要約
# バックアップ
$ rdiff-backup --remote-schema 'docker run -i -v %s:/data --rm sumomoneko/alpine-rdiff-backup' <バックアップ元ボリューム名>::/data <アーカイブディレクトリ>
# リストア
$ rdiff-backup --restore-as-of <戻したい時刻指定> --force --remote-schema 'docker run -i -v %s:/data --rm sumomoneko/alpine-rdiff-backup' <アーカイブディレクトリ> <リストア先ボリューム名>::/data
実行例
準備
ボリューム testvolume
を作ります。
$ docker volume create testvolume
testvolume
ファイル1個つくる
testvolume
に、hoge
と書いてあるファイルfile1
を作ります。簡単のため、busybox
コンテナを使いました。
$ docker run -it --rm -v testvolume:/data busybox /bin/sh -c "echo hoge > /data/file1"
$ docker run -it --rm -v testvolume:/data busybox /bin/ls -al /data
total 12
drwxr-xr-x 2 root root 4096 Jan 21 02:46 .
drwxr-xr-x 19 root root 4096 Jan 21 02:46 ..
-rw-r--r-- 1 root root 5 Jan 21 02:46 file1
$ docker run -it --rm -v testvolume:/data busybox /bin/cat /data/file1
hoge
バックアップ1回目
カレントディレクトリに、 testvolue
の内容をバックアップします。
$ rdiff-backup --remote-schema 'docker run -i -v %s:/data --rm sumomoneko/alpine-rdiff-backup' testvolume::/data .
$ ls -la
合計 16
drwxr-xr-x 3 oreore oreore 4096 1月 21 11:46 .
drwxrwxr-x 40 oreore oreore 4096 1月 21 11:04 ..
drwx------ 3 oreore oreore 4096 1月 21 11:48 rdiff-backup-data
-rw-r--r-- 1 oreore oreore 5 1月 21 11:46 file1
$ rdiff-backup -l .
Found 0 increments:
Current mirror: Thu Jan 21 11:48:55 2018
ファイル2個目つくる
引き続きtestvolue
を変えていきます。今度はfuga
と書いてあるfile2
を作ります。
$ docker run -it --rm -v testvolume:/data busybox /bin/sh -c "echo fuga > /data/file2"
$ docker run -it --rm -v testvolume:/data busybox /bin/ls -al /data
total 16
drwxr-xr-x 2 root root 4096 Jan 21 02:50 .
drwxr-xr-x 19 root root 4096 Jan 21 02:51 ..
-rw-r--r-- 1 root root 5 Jan 21 02:46 file1
-rw-r--r-- 1 root root 5 Jan 21 02:50 file2
バックアップ2回目
またカレントディレクトリにバックアップします。
$ rdiff-backup --remote-schema 'docker run -i -v %s:/data --rm sumomoneko/alpine-rdiff-backup' testvolume::/data .
$ ls -la
合計 20
drwxr-xr-x 3 oreore oreore 4096 1月 21 11:50 .
drwxrwxr-x 40 oreore oreore 4096 1月 21 11:04 ..
drwx------ 3 oreore oreore 4096 1月 21 11:51 rdiff-backup-data
-rw-r--r-- 1 oreore oreore 5 1月 21 11:46 file1
-rw-r--r-- 1 oreore oreore 5 1月 21 11:50 file2
$ rdiff-backup -l .
Found 1 increments:
increments.2018-01-21T11:48:55+09:00.dir Thu Jan 21 11:48:55 2018
Current mirror: Thu Jan 21 11:51:36 2018
カレントミラーバックアップ2回目、file1
とfile2
がある状態で、インクリメント1のものはバックアップ1回目、file1
しかない状態のものです。
バックアップされない変更を仕込む
リストアの確認に移りますが、ちゃんとリストアされたか確認できるように、testvolue
内のfile1
をhogehoge
と書き換えておきましょう。
docker run -it --rm -v testvolume:/data busybox /bin/sh -c "echo hogehoge > /data/file1"
バックアップ1回目相当に戻す
一個前、file1
しかなくって、中身はhoge
の状態にリストアします。
$ rdiff-backup --restore-as-of 1B --force --remote-schema 'docker run -i -v %s:/data --rm sumomoneko/alpine-rdiff-backup' . testvolume::/data
ちゃんと思った状態になっています。また、タイムスタンプ/ユーザIDも正しく復元されています。
$ docker run -it --rm -v testvolume:/data busybox /bin/ls -al /data
total 12
drwxr-xr-x 2 root root 4096 Jan 21 02:46 .
drwxr-xr-x 19 root root 4096 Jan 21 02:54 ..
-rw-r--r-- 1 root root 5 Jan 21 02:46 file1
$ docker run -it --rm -v testvolume:/data busybox /bin/cat /data/file1
hoge
簡単な説明
rdiff-backup は、ローカルディレクトリ間の差分だけでなく、リモートディレクトリとの差分比較にも対応しています。
デフォルトでは、リモートディレクトリをみるために ssh で接続し、そのなかで rdiff-backup --server
を起動、こちら側とのパイプ役を担っています。
要は相手側でrdiff-backup --server
が起動できれば良いので、docker exec
コマンドでボリュームをマウントしたコンテナを立ち上げ、そこでrdiff-backup --server
することで、ボリュームをリモートディレクトリの用に見せています(man pageのREMOTE OPERATIONを参照)。
ファイルのユーザID/グループIDについては、rdiff-backup
がよきに計らってくれました(man pageのUSERS AND GROUPSを参照)。オリジナルファイルのメタ情報もバックアップとして持っているようです。
おわりに
コンテナ sumomoneko/alpine-rdiff-backup
はたったの3行です。作っといていうのもアレですが、得体のしれない野良イメージ使うより、ご自分で作られたほうが気が休まるかと思います。
この記事は、minecraftにて重大インシデント(高所からの落下、爆殺など)が多発したため、時計巻き戻しのためのメモとして作られました。