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

如Docker有关使用卷的文档中所述,存在所谓的“仅数据容器”的概念,它提供可以装入多个其他容器的卷,而不pipe数据专用容器是否实际运行。

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

由于Docker在主机上的某个内部文件夹( /var/docker/volumes/… )中创build并pipe理这些卷(由于可移植性原因而没有显式映射到主机上的文件夹)。

假设我使用这样一个卷,然后我需要将它从一个主机迁移到另一个主机 – 我该如何移植卷? AFAICS它有一个唯一的ID – 我可以去复制卷和其相应的数据专用容器到一个新的主机? 如何找出要复制的文件? 还是有一些内置的Docker,我没有发现呢?

官方的答案现在可以在这里find:

使用卷共享目录

在“备份,恢复或迁移数据卷”部分中,您可以:

备份:

 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目录下的所有文件创build一个未压缩的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 

您可以将卷导出到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文档扩展官方的答案和这里的最佳答案 ,我创build了以下别名,您可以放在.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。 如果要备份的文件很大,请使用压缩。