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

Docker 如何将仅数据卷从一台主机移植到另一台主机?,docker,Docker,如Docker文档中所述,存在所谓的仅数据容器的概念,它提供了一个可以装入多个其他容器的卷,无论仅数据容器是否实际运行 基本上,这听起来很棒。但有一件事我不明白 这些卷(如文档所述,出于可移植性的原因,这些卷不会显式映射到主机上的文件夹)由Docker在主机上的某个内部文件夹中创建和管理(/var/Docker/volumes/…) 假设我使用这样一个卷,然后我需要将它从一个主机迁移到另一个主机—如何移植该卷?AFAICS它有一个唯一的ID—我可以直接将卷及其相应的数据专用容器复制到新主机上吗?

如Docker文档中所述,存在所谓的仅数据容器的概念,它提供了一个可以装入多个其他容器的卷,无论仅数据容器是否实际运行

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

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


假设我使用这样一个卷,然后我需要将它从一个主机迁移到另一个主机—如何移植该卷?AFAICS它有一个唯一的ID—我可以直接将卷及其相应的数据专用容器复制到新主机上吗?如何找到要复制的文件?或者Docker是否有我尚未发现的内置支持?

您可以将卷导出到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
#您可以列出数据容器的共享目录
docker inspect | grep”/vfs/dir/“
#您可以将数据容器目录导出到tgz
docker run--cidfile=id.tmp--来自ubuntu tar-cO | gzip-c>volume.tgz的卷
#清理:删除用于导出和临时文件的已退出容器
docker rm`cat id.tmp`&&rm-f id.tmp

官方答案可在以下部分找到:

备份:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
# 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
  • --rm
    :在容器退出时将其卸下
  • --数据中的卷
    :附加到数据容器共享的卷
  • -v$(pwd):/backup
    :绑定将当前目录装载到容器中;将tar文件写入
  • busybox
    :一个简单的小图像-便于快速维护
  • tar cvf/backup/backup.tar/data
    :创建/data目录中所有文件的未压缩tar文件
恢复:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
# 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

扩展和的官方答案,在.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。如果要备份的文件很大,则支持使用压缩。

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

Cargo的开发目的是将集装箱及其数据从一台主机迁移到另一台主机,而停机时间最短。Cargo使用union filesystem的数据联合功能创建跨源主机和目标主机的统一数据视图(主要是根文件系统)。这允许Cargo几乎立即(在毫秒内)在目标主机上启动容器,因为源根文件系统中的数据可以按需(使用写时拷贝(COW)分区)或在后台(使用rsync)惰性地复制到目标主机

重点是: -集中的服务器处理迁移过程

此处给出了该项目的链接:

https://github.com/nadgowdas/cargo

如果您的计算机位于不同的VPC中,或者您希望从本地计算机复制/复制到本地计算机(如我的情况),您可以使用我创建的。它基本上与SSH上的
rsync
结合在一起,打包成两个小(都是~25MB)映像。首先,在要从中复制数据的机器上启动
dvsync服务器
(需要从以下位置获得
NGROK\u AUTHTOKEN
):

然后,您可以在要将文件复制到的机器上启动
dvsync客户端
,传递服务器显示的
dvsync\u令牌

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

复制完成后,客户端将退出。这也适用于Docker CLI、Compose、Swarm和Kubernetes。

如果可以在机器之间建立SSH连接,这里有一个单行程序:

docker run --rm -v <SOURCE_DATA_VOLUME_NAME>:/from alpine ash -c "cd /from ; tar -cf - . " | ssh <TARGET_HOST> 'docker run --rm -i -v <TARGET_DATA_VOLUME_NAME>:/to alpine ash -c "cd /to ; tar -xpvf - " '
docker-run--rm-v:/from alpine ash-c“cd/from;tar-cf-.“|ssh”docker-run--rm-i-v:/to alpine ash-c”cd/to;tar-xpvf-“'

学分归Guido Diepen所有。

改编自公认的答案,但提供了更大的灵活性,您可以在bash管道中使用它:

#/bin/bash
如果[$#!=2];然后
回显用法“$0”:卷/路径/of/the/dir/in/volume/to/backup
出口1
fi
if[-t1];然后
echo cmd的输出为二进制数据“(tar)”\
它应该被重定向,而不是打印到终端
出口1
fi
volume=“$1”
path=“$2”
exec docker run--rm--mount type=volume,src=“$volume”,dst=/mnt/volume/cf--C/mnt/volume/“$path”
如果要定期和增量备份卷,则可以使用以下脚本:

#/bin/bash
如果[$#!=3];然后
回显用法“$0”:卷/路径/of/the/dir/in/volume/to/backup/path/to/put/backup
出口1
fi
volume=“$1”
volume_path=“$2”
path=“$3”
如果[[“$path”=~^.*/$];然后
echo“第三个参数不应以“/”结尾,否则rsync将无法正常工作”
出口1
fi
container_name=“docker备份rsync服务-$RANDOM”
docker run--rm--name=“$container_name”-d-p 8738:873\
--装载类型=卷,src=“$volume”,dst=/mnt/volume/\
nobodyxu/rsyncd
echo-e'\n正在开始同步…'
rsync--info=progress2,stats,symsafe-aHAX--delete\
"rsync://localhost:8738/root/mnt/volume/$volume\u path/“$path”
退出状态=$?
echo-e'\n停止rsyncd docker…'
码头停靠站-t 1“$container\u name”
退出$exit_状态
It utiliz