前几天在学习docker卷volumes备份与恢复的时候遇到这样一个问题,首先还原一下整个流程:

第一步:创建一个容器名字为lm01,同时新建一个名字为vo1的卷挂在到容器的/dir1上(可以理解为dir1文件夹就是这个卷)同时在这个文件夹中创建一个1.txt文件.
docker run --name lm01 -v vo1:/dir1 ubuntu touch /dir1/1.txt
第二步:将刚创建好卷vo1备份,备份操作如下:

通过一个无名容器通过 --volumes-from lm01与容器lm01挂在相同的卷

docker run --volumes-from lm01 -v /newback:/backup ubuntu tar -cvf /backup/backup.tar /dir1

这也就要步入这篇文章的主题了:tar命令我们来把刚刚创建容器时最后的CMD也就是下面的指令单独拿出来分析一下:

tar -cvf /backup/backup.tar /dir1

这个指令就是在刚刚创建无名容器中做:将挂载的dir1文件夹打包成tar包放在这个容器的/backup文件下,由于此文件夹是挂载的当前宿主机的/ newback目录下,所以当把tar包放到这个无名容器的/backup文件夹中时,宿主机的/newback文件夹也能找到,也就自然可以通过后续操作来恢复到其它容器中。

第三步,删掉所有容器
docker rm -vf $(docker ps -aq)
docker volume rm vo1

-v:删除容器的同时尝试删除挂在的数据卷,如果没有被其他容器挂在则一同删除
-f:强制删除
docker ps -a:列出全部容器
docker ps -q:只列出id

第四步:
docker run -itd --name vocontainer2 -v vo1:/dir1 ubuntu /bin/bash

重新创建一个名字为lm01的绒球并挂在名字为vo1的卷作为dir1文件夹,因为刚刚全部删掉了,这次重新创建的,所以这次dir1文件夹是空的并没有1.txt文件。下面要做的就是再次通过一个中介容器恢复刚刚的tar包
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t:为容器分配一个伪终端
-d:后台执行,不会占用当前宿主机的终端窗口

第五步:
docker run --volumes-from vocontainer2 -v /newback:/backup ubuntu tar -xvf /backup/backup.tar -C /

还是我们把后面的tar终端命令拿出来

tar -xvf /backup/backup.tar -C /

-C:代表要解压的tar包在某个路径下
-xvf:就是解压了。这个就硬记吧
我们注意到最后的那个‘/’ 才是这次我最想说的:
我初次看到的时候我就在想,这样子回复的话不是把备份文件恢复到中介容器的根目录下了吗,怎么能起作用呢,纠结了好久,最后终于明白了!

  1. tar解压的时候如果遇到同名的文件夹不会覆盖,只会覆盖同名的文件!
  2. 在前面压缩这个tar包的时候实际压缩的是名字为dir1的文件夹。

我们也就是恢复一个名字为dir1的文件夹。又由于这个容器中已经存在了这个文件夹,也就是挂载的卷,所以就自然恢复到了这个卷里面。。。这个问题我甚至还加了老师微信问了好多,结果是tar 解压的讲究。。


2022-04-21 19:18:16 星期四