あるホストから別のホストにデータ専用ボリュームを移植するにはどうすればよいですか?


121

ボリュームの操作に関する Dockerドキュメントで説明されているように、データのみのコンテナーが実際に実行されているかどうかに関係なく、他の複数のコンテナーにマウントできるボリュームを提供する、いわゆるデータのみのコンテナーの概念があります。

基本的に、これは素晴らしいですね。しかし、私には理解できないことが1つあります。

これらのボリューム(ドキュメントに記載されているように、移植性の理由でホスト上のフォルダーに明示的にマッピングされていない)は、Dockerによってホストの内部フォルダー(/var/docker/volumes/…)に作成および管理されます。

そのようなボリュームを使用していて、それをあるホストから別のホストに移行する必要がある場合-ボリュームを移植するにはどうすればよいですか?AFAICSには一意のIDがあります-ボリュームとそれに対応するデータ専用コンテナーを新しいホストにコピーするだけでよいですか?コピーするファイルを見つけるにはどうすればよいですか?または、まだ発見していないDockerに組み込まれているサポートはありますか?


12
データコンテナディレクトリをエクスポートできます。docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgzこれは、ボリュームの実装の詳細に依存しません。2番目のマシンでtarを使用してデータをインポートします。
Jiri、2014

1
うわー、それは素晴らしいです、ありがとう:-)))!このコメントを回答として頂ければ、喜んで承ります!
Golo Roden

回答:


136

正式な回答は、「データボリュームのバックアップ、復元、または移行」セクションにあります。

バックアップ:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm:終了時にコンテナを削除します
  • --volumes-from DATA:DATAコンテナーが共有するボリュームに接続する
  • -v $(pwd):/backup:現在のディレクトリをコンテナにバインドマウントします。tarファイルを書き込む
  • busybox:小さくシンプルなイメージ-迅速なメンテナンスに適しています
  • tar cvf /backup/backup.tar /data:/ dataディレクトリ内のすべてのファイルの非圧縮tarファイルを作成します

戻す:

# create a new data container
$ sudo docker create -v /data --name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

3
現時点ではdocker create、データのみのコンテナーを使用して開始しないようにすることをお勧めします。オフの例を参照してください。ドキュメント:docs.docker.com/userguide/dockervolumes/...
FelikZ

1
だから... ...私はバックアップにPostgresデータベースをしようとしている場合は、私が何を代わる/data/var/lib/postgresql/data正しいですか、?
425nesp 2015年

6
「データボリュームのバックアップ、復元、または移行」セクションは、Dockerドキュメントから削除されているようです:-(
SteveC

2
@Datzこれは、データコンテナーを作成するために呼び出されるコマンドです。実際には何も実行しない任意のコマンドである可能性があります。コンテナは起動してすぐに終了しますが、データを保持するために使用されます。
tommasop

1
@rszalskiなんらかの理由で、コンテナーを実行したままにする必要がある場合(たとえば、コンテナーに入れたいdocker exec場合)、単純なコマンドでtail -f /dev/null終了せず、最小限のリソースを使用します。実行する必要がなくなったら、代わりに実行docker stop data-containerします。ボリュームは他のコンテナ用に残ります。
Jesse Chisholm

16

ボリュームをtarにエクスポートして、別のマシンに転送できます。2番目のマシンでtarを使用してデータをインポートします。これは、ボリュームの実装の詳細には依存しません。

# you can list shared directories of the data container
docker inspect <data container> | grep "/vfs/dir/"

# you can export data container directory to tgz
docker run --cidfile=id.tmp --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz

# clean up: remove exited container used for export and temporary file
docker rm `cat id.tmp` && rm -f id.tmp

ご回答有難うございます。あるホストから別のホストにデータコンテナを移動するにはどうすればよいですか?
Dzung Nguyen 14

1
@nXqdデータコンテナーは、docker run -v /data-volume -name datacointainer busybox true次のユーザーによって作成されます-これはどこでも実行できます。データコンテナーを作成したら、回答で説明されているようにtarアーカイブをインポートできます。
Jiri

ご回答有難うございます。しかし、後でバックアップするために使用されるゾンビコンテナーを削除する必要があるという別の問題に遭遇しました。これはidを返さないので。良い方法はありますか:D
Dzung Nguyen 14年

@nXqdもちろん- --cidfile=id.txt実行パラメータとして使用する必要があります。コンテナIDはファイルに保存されますid.txt。答えを更新しました。
Jiri

9
docker run --rm代わりに使用できますdocker run --cidfile ... ; docker rm
Felix Rabe 14

16

Docker docsの公式回答とここトップ回答を拡張すると、.bashrcまたは.zshrcに次のエイリアスを含めることができます

# backup files from a docker volume into /tmp/backup.tar.gz
function docker-volume-backup-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -czvf /backup/backup.tar.gz "${@:2}"
}
# restore files from /tmp/backup.tar.gz into a docker volume
function docker-volume-restore-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -xzvf /backup/backup.tar.gz "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie ls -lh "${@:2}"
}
# backup files from a docker volume into /tmp/backup.tar
function docker-volume-backup() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -cvf /backup/backup.tar "${@:2}"
}
# restore files from /tmp/backup.tar into a docker volume
function docker-volume-restore() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -xvf /backup/backup.tar "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox ls -lh "${@:2}"
}

バックアップはに保存される/tmpため、そこに保存されているバックアップファイルをDockerホスト間で移動できます。

また、バックアップ/復元エイリアスのペアが2つあります。1つは圧縮とdebian:jessieを使用し、その他は圧縮なしでbusyboxを使用します。バックアップするファイルが大きい場合は、圧縮を使用してください。


3

ここでは、IBMの別の最近のツールを追加します。実際には、1つのコンテナーホストから別のコンテナーホストへのボリュームの移行用に作成されています。これは現在進行中のプロジェクトです。そのため、将来、追加機能を備えた別のバージョンが見つかる可能性があります。

Cargoは、コンテナーを1つのホストから別のホストに、データとともにダウンタイムを最小限にして移行するために開発されました。Cargoは、ユニオンファイルシステムのデータフェデレーション機能を使用して、ソースホストとターゲットホスト全体のデータ(主にルートファイルシステム)の統合ビューを作成します。これにより、ソースルートファイルシステムからのデータがオンデマンドで(コピーオンライト(COW)パーティションを使用して)またはレイジーにターゲットホストにコピーされるため、Cargoはほぼ即座に(ミリ秒以内に)ターゲットホストでコンテナーを起動できますバックグラウンドで(rsyncを使用)

重要なポイントは次のとおりですcentralized。-サーバーが移行プロセスを処理します

プロジェクトへのリンクはここにあります:

https://github.com/nadgowdas/cargo

3

マシンが異なるVPCにある場合、またはローカルマシンとの間でコピーしたい場合(私の場合のように)、作成したdvsyncを使用できます。これは基本的にngrokrsyncSSHを組み合わせて2つの小さな(両方の〜25MB)イメージにパッケージ化したものです。最初に、dvsync-serverデータのコピー元のマシンでを起動します(ngrokダッシュボードNGROK_AUTHTOKENから取得できるものが必要です):

$ docker run --rm -e NGROK_AUTHTOKEN="$NGROK_AUTHTOKEN" \
  --mount source=MY_VOLUME,target=/data,readonly \
  quay.io/suda/dvsync-server

次にdvsync-client、ファイルのコピー先のマシンでを起動DVSYNC_TOKENし、サーバーによって表示されたを渡します。

docker run -e DVSYNC_TOKEN="$DVSYNC_TOKEN" \
  --mount source=MY_TARGET_VOLUME,target=/data \
  quay.io/suda/dvsync-client 

コピーが完了すると、クライアントは終了します。これは、Docker CLI、Compose、Swarm、Kubernetesでも機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.