Docker-Volumeのバックアップとリストア
何故か標準でバックアップ方法が存在しない
DockerはImageやConteinerは簡単にバックアップがとれるのに、何故かVolumeに関しては標準的なバックアップ方法が存在しません。ということでできる限り簡単な方法を考えてみました。
ネットで検索すると出てくる方法
VolumeをマウントするConteinerを作って、バックアップを作成する方法が多数ヒットします。ただ、残念なのはその出力先です。何故かバックアップファイルをConteiner内、もしくはDockerホスト上のディレクトリに作成していました。
それをやられると、リモートでコマンドを使った場合に、手元にバックアップが残りません。作成したバックアップを何らかの手段でさらに引き寄せる必要があります。非常に面倒です。
標準入出力を使おう
dockerコマンドは標準入出力でConteinerとデータをやりとりすることが出来ます。つまりバックアップファイルを標準出力に出すだけで、コマンドを実行した環境にバックアップ結果を吐き出すことが出来ます。
バックアップコマンドを作ってみる
以下のようなコマンドを実行すると、期待通りに動いてくれます。
>
によるリダイレクトはConteiner上ではなく、dockerコマンドを実行したローカル環境で働くからです。
- バックアップコマンド
docker run --rm -v [Dockerボリューム]:/backup busybox tar cvz -C /backup . > [バックアップファイル名.tar.gz]
- リモートのDockerホストに対してボリュームのバックアップ
docker -H [ホスト名] run --rm -v [Dockerボリューム]:/backup busybox tar cvz -C /backup . > [バックアップファイル名.tar.gz]
リモートのバックアップした場合も、もちろんローカル環境にバックアップをとることが出来ます。
リストアコマンドを作ってみる
- リストアコマンド
dockerコマンドで-iを使い、標準入力を使えるようにします。
docker run --rm -i -v [Dockerボリューム]:/backup busybox tar xvz -C /backup < [バックアップファイル名.tar.gz]
- リモートのDockerホストに対してボリュームのリストア
docker -H [ホスト名] run --rm -i -v [Dockerボリューム]:/backup busybox tar xvz -C /backup < [バックアップファイル名.tar.gz]
高速化したい
バックアップやリストアは出来るようになりましたが、もっと高速に処理したくなります。tarでzオプションを使うとgzipが使われますが、これをpigzのような並列処理対応のコマンドで置き換えれば、ホスト側のCPUのコア数に応じて高速化が見込めます。しかしざっと探したところ、pigzが入っている軽量Imageが見つかりません。もしかしたらどこかにあるかもしれませんが、探すより作った方が早いので作ることにしました。
バックアップ用Imageを作成する
pigz付きalpineのImageを作成します。
コマンドを書かなくても良いように、CMDも設定しておきます。
- バックアップ
FROM alpine
RUN apk --no-cache add pigz
CMD sh -c "tar cv -C /backup . | pigz"
- リストア
FROM alpine
RUN apk --no-cache add pigz
CMD sh -c "pigz -d | tar xv -C /backup"
Docker Hubに登録
- 置き場所
- 使い方
- バックアップ
docker --rm -v [DOCKER-VOLUME]:/backup dktools/backup > backup.tar.gz
- リストア
docker --rm -i -v [DOCKER-VOLUME]:/backup dktools/restore < backup.tar.gz
- バックアップ
今のところパラメータ指定などはありませんが、気が向いたらそのうち機能を追加します。
まとめ
私の場合Dockerはtls接続でリモート管理しているので、バックアップをローカルに呼び寄せないと面倒なので、今回のようなものを作成しました。ちなみにsshのポートフォワードをしている場合も、リモートバックアップは可能です。ただtlsで直接接続している場合とポートフォワードでは、ポートフォワードの転送速度が数倍遅いので、出来ることならtls設定を入れた方が効率は上がります。
tls設定に関してはこちらに記事を書いています。
UbuntuにDockerをインストールし、tlsを使ったリモート接続の設定を行う