Dockerボリュームのバックアップと復元


23

私はDockerを使用してCentOS 6.4サーバーにいくつかのサービスを展開し、それらが生成するデータを適切にバックアップする方法を見つけようとしています。

たとえば、サービスの1つは、ユーザーがファイルをアップロードできるWebアプリケーションです。このコンテナには、/filesバックアップしたいボリュームがあります。ホストマウントは、このブログの投稿ボリュームのドッカードキュメントで述べられているように、ポータブルではないため、やや眉をひそめているように見えます。

同じブログ投稿から、ボリューム内のファイルにアクセスするためにホストマウントを必要としないことdocker inspectを知っています。ファイルの場所を見つけるために使用できます。

しかし、ここに私の問題があります。コンテナとそれに関連付けられたボリュームを構築するために必要なdockerfileのみをバックアップすることを考えていました。バックアップからすべてを復元する必要がある可能性が高い場合、どのボリュームディレクトリがどのコンテナに対応するかを知るにはどうすればよいですか?コンテナを再構築すると、IDとボリュームパスが変更されるため、それらに一致する追加情報が必要になります。実際にすべてを復元できるようにするには、他にどのようなバックアップが必要ですか?

回答:


24

あなたが正しい。独自のボリュームを持つ複数のコンテナを使用できるため、どのボリュームがどのコンテナに対応するかを追跡する必要があります。その方法は設定によって異なります。データコンテナには-dataという名前を使用しているため、画像がどのコンテナに属しているかは明らかです。そうすれば、次のようにバックアップできます。

VOLUME=`docker inspect $NAME-data | jq '.[0].Volumes["/path/in/container"]'`
tar -C $VOLUME . -czvf $NAME.tar.gz

ここで、イメージを再構築してデータコンテナを再作成するだけです。

cat $NAME.tar.gz | docker run -name $NAME-data -v /path/in/container \
                              -i busybox tar -C /path/int/container -xzf -

したがって、これはバックアップする必要があることを意味します。

  • Dockerfile
  • ボリューム
  • コンテナ内のボリュームパス
  • ボリュームが属するコンテナの名前

更新:その間、私はコンテナとそのボリューム(コンテナ)をバックアップするツールを作成しました:https : //github.com/discordianfish/docker-backupと、バックアップを作成してそれらをプッシュできるバックアップイメージs3:https : //github.com/discordianfish/docker-lloyd


それは公正な妥協です、ありがとう。データ用に別のコンテナを使用する明確な利点はありますか?
fcoelho 14

これもセットアップによって異なります。「volumes-from」を使用して簡単に参照でき、すべての内部を抽象化できるため、データコンテナーを使用するのが理にかなっています。パスとマウントポイントの観点から考えるのではなく、コンテナーから他のコンテナーにボリュームをアタッチするだけです。
ヨハネス '魚' Ziemke

このエラーは無効なオプションです-z。busyboxのデフォルトのtarはこれをサポートしていないようです。
nXqd

6
jqは非常にクールですが、依存関係を導入するのではなく、次のdocker inspectようにテンプレートに組み込まれたsを使用してください VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" )。また、ファイルがアクティブに使用されている間(データベースなど)、この方法でファイルをバックアップしないことを人々に思い出させることもおそらく賢明です。
mc0e

2
Docker 1.8では、形式が変更されました- Volumes廃止され、Mounts代わりに異なる構造があります。私たちは、と少し多くの作業を行う必要がありrange、私たちがに興味があるマウントポイントを見つけるためにVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
JarekPrzygódzki

5

新しいDocker(テスト済み1.9.1, build 9894698)では、cpコマンドを使用できます。

次に、ディレクトリをコンテナからホストにコピーする方法の例を示します。

docker cp wordpress:/var/www/html backups/wordpress.`date +"%Y%m%d"`/

コンテナからtarファイルにディレクトリをコピーする方法の例を次に示します。

docker cp wordpress:/var/www/html - > backups/wordpress.`date +"%Y%m%d"`.tar

最後になりましたが、ディレクトリをコンテナからtar.gzファイルにコピーする方法の例:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz

2
docker cpネットワーク経由ですべてを送信します。Dockerボリュームが既にbtrfsボリュームである場合は特に避けたいものです。
ジャレックPrzygódzki17年

2
質問では、バックアップと復元に言及しています。を使用してこの答えの復元の例はdocker cpいいでしょう。
MadMike
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.