如何将只有数据的卷从一台主机移植到另一台主机?
如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。 如果要备份的文件很大,请使用压缩。