如何将仅数据卷从一台主机移植到另一台主机?


121

如Docker文档中有关使用卷的文档中所述,存在所谓的仅数据容器的概念,该容器提供了可以安装到多个其他容器中的卷,而无论该仅数据容器是否正在运行。

基本上,这听起来很棒。但是有一件事我不明白。

这些卷(由于可移植性原因,明确映射到主机上的文件夹,如文档所述)由Docker在主机上的某个内部文件夹中创建和管理/var/docker/volumes/…

假设我使用了这样一个卷,然后需要将其从一台主机迁移到另一台主机-如何移植该卷?AFAICS具有唯一的ID-我可以直接将卷及其相应的仅数据容器复制到新主机吗?如何找出要复制的文件?还是我还没有发现Docker内置的一些支持?


12
您可以导出数据容器目录:docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz这不依赖于卷的实现细节。然后在第二台计算机上使用tar导入数据。
吉里(Jiri)2014年

1
哇,太棒了,谢谢:-)))!如果您将此评论作为答案,我会很乐意接受!
Golo Roden 2014年

Answers:


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

6
“备份,还原或迁移数据卷”部分似乎已从Docker文档中删除:-(
SteveC

2
@Datz只是一个用来创建数据容器的命令,它可以是实际上不执行任何操作的任何命令。容器启动后立即退出,但用于保留数据。
tommasop

1
@rszalski如果由于某种原因,您需要容器保持运行(例如,您想docker exec进入容器中),那么一条简单的命令tail -f /dev/null将永远不会退出,而是使用最少的资源。当您不再需要它运行时,docker stop data-container将为您完成。该卷保留给其他容器使用。
杰西·奇斯霍尔姆

16

您可以将卷导出到tar并转移到另一台计算机。然后在第二台计算机上使用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 2014年

1
@nXqd数据容器的创建者docker run -v /data-volume -name datacointainer busybox true-您可以在任何地方运行它。创建数据容器后,您可以按照答案中的说明导入tar存档。
吉里(Jiri)2014年

感谢您的回答。但是我遇到了另一个问题,我们需要删除后来用于备份的僵尸容器。由于此操作不会返回ID。你有什么好办法吗:D
Dzung Nguyen 2014年

@nXqd确定-您必须将其--cidfile=id.txt用作运行参数。容器ID将存储在文件中id.txt。我已经更新了答案。
吉里(Jiri)2014年

9
您可以使用docker run --rm代替docker run --cidfile ... ; docker rm
Felix Rabe 2014年

16

扩展Docker文档的官方答案和此处最佳答案,您可以在.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主机之间移动保存在其中的备份文件。

还有两对备份/还原别名。一种使用压缩和debian:jessie,另一种不使用压缩,但使用busybox。如果要备份的文件很大,则建议使用压缩。


3

我将在这里从IBM添加另一个新工具,该工具实际上是用于从一个容器主机到另一个容器主机的卷迁移。这是一个正在进行的项目。因此,将来您可能会发现具有其他功能的其他版本。

Cargo的开发目的是将容器及其数据一起从一台主机迁移到另一台主机,而停机时间最少。Cargo使用联合文件系统的数据联合功能在源主机和目标主机之间创建统一的数据视图(主要是根文件系统)。当源根文件系统中的数据按需(使用写时复制(COW)分区)或延迟复制到目标主机时,这使Cargo几乎可以立即(在毫秒内)在目标主机上启动容器。在后台(使用rsync)

重要事项是:- centralized服务器处理迁移过程

此处提供了该项目的链接:

https://github.com/nadgowdas/cargo

3

如果您的计算机位于不同的VPC中,或者要从本地计算机复制到本地计算机(如我的情况),则可以使用我创建的dvsync。它基本上是ngrok,结合了rsync通过SSH打包成两个小映像(均为约25MB)。首先,dvsync-server在要从中复制数据的机器上启动(您NGROK_AUTHTOKEN可以从ngrok仪表板获取数据):

$ 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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.