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

# 要約

```sh
# バックアップ
$ 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`を作ります。

```sh
$ docker volume create testvolume
testvolume
```

## ファイル1個つくる

`testvolume`に、`hoge`と書いてあるファイル`file1`を作ります。簡単のため、`busybox`コンテナを使いました。

```sh
$ 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`の内容をバックアップします。

```sh
$ 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`を作ります。

```sh
$ 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回目

またカレントディレクトリにバックアップします。

```sh
$ 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`と書き換えておきましょう。

```sh
docker run -it --rm -v testvolume:/data busybox /bin/sh -c "echo hogehoge > /data/file1"
```

## バックアップ1回目相当に戻す

一個前、`file1`しかなくって、中身は`hoge`の状態にリストアします。

```sh
$ rdiff-backup --restore-as-of 1B --force --remote-schema 'docker run -i -v %s:/data --rm sumomoneko/alpine-rdiff-backup' . testvolume::/data
```

ちゃんと思った状態になっています。また、タイムスタンプ/ユーザIDも正しく復元されています。

```sh
$ 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](http://www.nongnu.org/rdiff-backup/rdiff-backup.1.html)のREMOTE OPERATIONを参照)。


ファイルのユーザID/グループIDについては、`rdiff-backup`がよきに計らってくれました([man page](http://www.nongnu.org/rdiff-backup/rdiff-backup.1.html)のUSERS AND GROUPSを参照)。オリジナルファイルのメタ情報もバックアップとして持っているようです。

# おわりに

コンテナ `sumomoneko/alpine-rdiff-backup` はたったの[3行](https://hub.docker.com/r/sumomoneko/alpine-rdiff-backup/~/dockerfile/)です。作っといていうのもアレですが、得体のしれない野良イメージ使うより、ご自分で作られたほうが気が休まるかと思います。

この記事は、minecraftにて重大インシデント(高所からの落下、爆殺など)が多発したため、時計巻き戻しのためのメモとして作られました。