backup
docker

docker volume を rdiff-backupを使ってインクリメンタルバックアップする

要約

# バックアップ
$ 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回目、file1file2がある状態で、インクリメント1のものはバックアップ1回目、file1しかない状態のものです。

バックアップされない変更を仕込む

リストアの確認に移りますが、ちゃんとリストアされたか確認できるように、testvolue内のfile1hogehogeと書き換えておきましょう。

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にて重大インシデント(高所からの落下、爆殺など)が多発したため、時計巻き戻しのためのメモとして作られました。