备份数据卷
---------------------------------------------看看下面的一个实例---------------------------------------------
先创建一个容器wang,包含两个数据卷
/var/volume1
和
/var/volume2
(这两个目录是在容器里的数据卷路径)
[root@localhost ~]
# docker run -t -i -v /var/volume1 -v /var/volume2 --name wang docker.io/centos /bin/bash
[root@83eb43492ae7 /]
#
根据Docker的数据持久化之数据卷容器可知,上面创建的wang数据卷容器挂载了
/var/volume1
和
/var/volume2
两个目录
然后在数据卷里写些数据,以供测试。
[root@83eb43492ae7 /]
# cd /var/volume1
[root@83eb43492ae7 volume1]
# echo "test1" > test1
[root@83eb43492ae7 volume1]
# echo "test11" > test11
[root@83eb43492ae7 volume1]
# echo "test111" > test111
[root@83eb43492ae7 volume1]
# ls
test1 test11 test111
[root@83eb43492ae7 volume1]
# cd ../volume2
[root@83eb43492ae7 volume2]
# echo "test2" > test2
[root@83eb43492ae7 volume2]
# echo "test22" > test22
[root@83eb43492ae7 volume2]
# echo "test222" > test222
[root@83eb43492ae7 volume2]
# ls
test2 test22 test222
[root@83eb43492ae7 volume2]
#
然后进行这两个数据卷的备份
[root@localhost ~]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83eb43492ae7 docker.io
/centos
"/bin/bash"
2 minutes ago Up 2 minutes wang
现在开始进行数据卷的备份操作:
为了利用数据卷容器备份,使用--volumes-from标记来创建一个加载wang容器卷的容器,并从主机挂载当前目录到容器的
/backup
目录。并备份wang卷中的数据,执行完成之后删除容器--
rm
,此时备份就在当前的目录下了。
1)备份wang容器中的
/var/volume1
数据卷数据(注意下面:命令中的-i和-t这两个参数加不加都可以;--
rm
加上,备份后就会自动删除这个容器,如果不加这个--
rm
参数,那么备份后的容器就会保留,docker
ps
-a就会查看到)<
/strong
>
[root@localhost ~]
# docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup1.tar /var/volume1
tar
: Removing leading `/' from member names
/var/volume1/
/var/volume1/test1
/var/volume1/test11
/var/volume1/test111
2)备份wang容器中的
/var/volume2
数据卷数据
[root@localhost ~]
# docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup2.tar /var/volume2
tar
: Removing leading `/' from member names
/var/volume2/
/var/volume2/test2
/var/volume2/test22
/var/volume2/test222
3)备份wang容器中的
/var/volume1
和
/var/volume2
数据卷数据
[root@localhost ~]
# docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup.tar /var/volume1 /var/volume2
tar
: Removing leading `/' from member names
/var/volume1/
/var/volume1/test1
/var/volume1/test11
/var/volume1/test111
/var/volume2/
/var/volume2/test2
/var/volume2/test22
/var/volume2/test222
[root@localhost ~]
# ls
anaconda-ks.cfg a.py backup1.
tar
backup2.
tar
backup.
tar
mkimage-yum.sh pipework var wang.
tar
这样,数据卷容器中的数据就备份完成了. 简言之就是:
先创建一个容器,并挂载要备份的容器数据卷,再挂载数据卷(
pwd
):
/backup
目录到容器
/bakcup
,在容器中执行备份
/data
目录到
/backup
,也就是备份到宿主机$(
pwd
):
/backup
目录。
恢复或迁移数据卷
-----------------------------接着上面的实例进行数据卷恢复操作--------------------------
[root@localhost ~]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
531c9d8adf4c docker.io
/centos
"/bin/bash"
2 minutes ago Up 44 seconds wang
1)恢复数据给同一个容器
测了测试效果,先删除数据卷(注意:数据卷目录删除不了,只能删除其中的数据。)
[root@localhost ~]
# docker attach wang
[root@531c9d8adf4c ~]
# ls /var/volume1
test1 test11 test111
[root@531c9d8adf4c ~]
# ls /var/volume2
test2 test22 test222
[root@531c9d8adf4c ~]
# rm -rf /var/volume1 /var/volume2
rm
: cannot remove
'/var/volume1'
: Device or resource busy
rm
: cannot remove
'/var/volume2'
: Device or resource busy
[root@531c9d8adf4c ~]
# ls /var/volume2
[root@531c9d8adf4c ~]
# ls /var/volume1
现在进行数据卷恢复,恢复数据卷中的所有数据:
[root@localhost ~]
# ls
anaconda-ks.cfg a.py backup1.
tar
backup2.
tar
backup.
tar
mkimage-yum.sh pipework var wang.
tar
注意-C后面的路径,这个路径表示将数据恢复到容器里的路径。
命令中用
"/"
,即表示将backup.
tar
中的数据解压到容器的/路径下。后面跟什么路径,就解压到这个路径下。因此这里用
"/"
[root@localhost ~]
# docker run --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
再次到容器里查看,发现数据卷里的数据已经恢复了
[root@531c9d8adf4c ~]
# ls /var/volume1
test1 test11 test111
[root@531c9d8adf4c ~]
# ls /var/volume2
test2 test22 test222
2)恢复数据给另外的容器,新建容器并解压备份文件到新的容器数据卷
即新建一个容器huihui,将上面备份的数据卷数据恢复到这个新容器里。
[root@localhost ~]
# docker run -t -i -v /var/volume1 -v /var/volume2 --name huihui docker.io/centos /bin/bash
[root@f6ff380e0b7f var]
# ls /var/volume1
[root@f6ff380e0b7f var]
# ls /var/volume2
[root@localhost ~]
# ls
anaconda-ks.cfg a.py backup1.
tar
backup2.
tar
backup.
tar
mkimage-yum.sh pipework var wang.
tar
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
[root@localhost ~]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
813afe297b60 docker.io
/centos
"/bin/bash"
17 seconds ago Up 16 seconds huihui
这里注意一下:
新容器创建时挂载的数据卷路径最好是和之前备份的数据卷路径一致
如下:
1)新建容器挂载的数据卷只是备份数据卷的一部分,那么恢复的时候也只是恢复一部分数据。如下,新容器创建时只挂载
/var/volume1
[root@localhost ~]
# docker run -t -i -v /var/volume1 --name huihui docker.io/centos /bin/bash
[root@12dd8d742259 /]
# ls /var/volume1/
[root@12dd8d742259 /]
# ls /var/volume2
ls
: cannot access
/var/volume2
: No such
file
or directory
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
[root@localhost ~]
#
查看容器,发现只恢复了
/var/volume1
的数据,
/var/volume2
数据没有恢复,因为没有容器创建时没有挂载这个。
[root@localhost ~]
# docker run -t -i -v /var/volume1 --name huihui docker.io/centos /bin/bash
[root@12dd8d742259 /]
# ls /var/volume1/
[root@12dd8d742259 /]
# ls /var/volume2
ls
: cannot access
/var/volume2
: No such
file
or directory
2)新容器创建时只挂载
/var/volume2
[root@localhost ~]
# docker run -t -i -v /var/volume2 --name huihui docker.io/centos /bin/bash
[root@da3a3d2c95e0 /]
# ls /var/volume2/
[root@da3a3d2c95e0 /]
# ls /var/volume1
ls
: cannot access
/var/volume1
: No such
file
or directory
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
[root@localhost ~]
#
[root@da3a3d2c95e0 /]
# ls /var/volume1
ls
: cannot access
/var/volume1
: No such
file
or directory
[root@da3a3d2c95e0 /]
# ls /var/volume2/
test2 test22 test222
3)如果新容器创建时挂载的数据卷目录跟之前备份的路径不一致
[root@localhost ~]
# docker run -t -i -v /var/huihui --name huihui docker.io/centos /bin/bash
[root@9bad9b3bde71 /]
# ls /var/huihui/
[root@9bad9b3bde71 /]
#
如果解压时-C后面跟的路径不是容器挂载的容器,那么数据恢复不了,如下
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
发现容器内数据没有恢复
[root@9bad9b3bde71 /]
# ls /var/huihui/
[root@9bad9b3bde71 /]
#
但是如果解压时-C后面跟的是容器挂载的路径,数据就能正常恢复
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /var/huihui
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
[root@localhost ~]
#
发现容器内数据已经恢复了
[root@9bad9b3bde71 /]
# ls /var/huihui/
var
[root@9bad9b3bde71 /]
# ls /var/huihui/var/
volume1 volume2
[root@9bad9b3bde71 /]
# ls /var/huihui/var/volume1
test1 test11 test111
[root@9bad9b3bde71 /]
# ls /var/huihui/var/volume2
test2 test22 test222
删除数据卷
Volume 只有在下列情况下才能被删除:
1)docker
rm
-
v
删除容器时添加了-
v
选项
2)docker run --
rm
运行容器时添加了--
rm
选项
否则,会在
/var/lib/docker/volumes
目录中遗留很多不明目录。
可以使用下面方式找出,然后删除_data目录下的数据文件
[root@localhost volumes]
# docker inspect huihui|grep /var/lib/docker/volumes
"Source"
:
"/var/lib/docker/volumes/97aa95420e66de20abbe618fad8d0c1da31c54ce97e32a3892fa921c7942d42b/_data"
,
可以使用 docker
rm
-
v
命令在删除容器时删除该容器的卷。示例如下:
[root@localhost volumes]
# docker run -d -P --name huihui -v /www docker.io/centos
69199905a74cb360935e32f4e99f7f11319f6aa36033a920aa0bae25874f5c69
[root@localhost volumes]
# docker volume ls
DRIVER VOLUME NAME
local
5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local
97aa95420e66de20abbe618fad8d0c1da31c54ce97e32a3892fa921c7942d42b
local
data_volume
[root@localhost volumes]
# docker rm -vf huihui
huihui
[root@localhost volumes]
# docker volume ls
DRIVER VOLUME NAME
local
5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local
data_volume