`
wyf
  • 浏览: 436520 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

Docker 备份恢复数据卷

 
阅读更多
备份数据卷
---------------------------------------------看看下面的一个实例---------------------------------------------
先创建一个容器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数据卷数据<strong>(注意下面:命令中的-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
分享到:
评论

相关推荐

    Docker容器技术-数据卷与数据持久化.pptx

    4. 当你需要把容器数据在不同的宿主机之间备份、恢复或迁移时,数据卷是很好的选择。 五、数据卷最佳使用场景 数据卷的使用场景非常广泛,以下是一些常见的使用场景: 1. 需要在多个容器之间共享数据时。 2. 需要...

    Docker数据备份恢复实现过程详解

    在Docker环境中,数据通常存储在容器的数据卷(volumes)中,而非容器本身,因为容器是易变的,而数据卷则提供了持久化的存储。本文将详细介绍如何使用Docker命令进行数据备份和恢复。 **一、Docker数据备份** ...

    详解Docker数据管理(数据卷&数据卷容器)

    如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复。 数据卷 数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。 数

    浅谈Docker 容器数据卷挂载小结

    - 数据卷的备份与恢复,确保数据的安全性和可恢复性。 - 容器卸载数据卷时,如果数据卷引用计数为零,Docker会自动删除该数据卷。 文章通过实验的方式对Docker容器数据卷挂载进行验证,通过具体的实例,让读者能够...

    通过数据卷备份恢复数据.pptx

    Docker容器技术

    Docker学习视频(讲师马永亮)10集之第6集:存储卷

    存储卷是Docker提供的一种机制,用于在容器之间持久化和共享数据,确保数据独立于容器的生命周期,即使容器被销毁,数据也能得以保留。以下是对这一主题的详细阐述: 1. **Docker容器的数据管理挑战**:Docker容器...

    详解Docker 数据卷管理

    Docker数据卷管理是容器技术中一个非常重要的概念,它允许用户在Docker容器中持久化数据,实现数据的共享以及数据备份等功能。通过数据卷,可以将宿主机上的文件系统的一部分目录或文件挂载到容器内部,这样容器内部...

    docker-backup:用于备份docker卷的脚本

    【docker-backup】是一个专为Docker环境设计的备份脚本,主要针对Docker容器中的数据卷进行备份操作。在Docker中,数据卷是持久化容器数据的关键方式,但如何安全有效地备份这些数据就显得尤为重要。【docker-...

    docker-backuper:一个备份恢复 docker 容器、它们的卷和元数据的工具......就地

    用于备份/恢复 docker 容器/卷的 python 脚本。 想法: 备份将从容器及其卷中备份元数据 restore 将从保存的元数据重新创建一个容器并恢复其卷 ####Requires Python && Docker-py python 包。 apt-get install ...

    docker-s3-volume:具有来自s3的数据量的Docker容器

    只需将S3桶视为备份源,需要时从S3恢复数据卷即可。这不仅适用于整个容器的备份,还可以针对特定容器中的部分数据进行备份。 **安全性与最佳实践** 在使用docker-s3-volume时,应确保遵循AWS的最佳实践,如限制S3...

    非常详细的-Docker-学习笔记.docx

    * 备份、恢复或迁移数据卷 * 删除数据卷 Docker注册表 Docker注册表是用于管理Docker镜像的仓库,以下是一些常用的Docker注册表操作: * 提交镜像到私有库 * 提交镜像到公共库 * 删除镜像 Docker最佳实践 Docker...

    dcs-docker-data:还原DCS Docker卷的数据

    5. **恢复数据**:使用`docker volume cp`命令将备份的数据复制回新的或已存在的Docker卷。 6. **重新启动服务**:确认数据恢复无误后,可以重启DCS服务或容器。使用`docker-compose up -d`或者直接用`docker start...

    docker-backup:用于备份 Docker 数据容器的简单实用程序(可选到 s3)

    -volumes-from或/var/lib/docker/vfs/dir --volumes-from /var/lib/docker/vfs/dir访问容器卷存储容器描述(来自检查)和体积恢复使用容器描述在恢复文件之前重新创建数据容器上述方法导致了一个相当大的工具,主要...

    convoy.tar.gz

    通过convoy,用户可以方便地创建、挂载、备份和恢复Docker数据卷,同时支持多种后端存储,如本地文件系统、Rados Block Device (RBD)、Amazon S3等。这样,你可以根据自己的需求选择最适合的存储解决方案。 在这个...

    Docker容器中Mysql数据的导入/导出详解

    在使用Docker部署MySQL服务时,数据库的备份与恢复是一个重要的环节。本篇文章将详细介绍如何在Docker容器中对MySQL数据库进行数据导入和导出。 首先,了解在Docker环境下导出MySQL数据的基本原理。由于MySQL的数据...

    使用docker-compose搭建高可用Apollo配置中心

    3. 数据持久化是必要的,可以使用Docker卷或云存储服务来保存MySQL的数据,防止重启或更新容器导致数据丢失。 4. 定期备份数据库,以防万一需要恢复到特定版本的配置。 5. 监控与日志记录同样重要,可以集成...

    docker单机版主从,支持不同宿主机,IP请自行修改

    - 配置`docker-compose.yml`文件,包括环境变量(如数据库密码)、端口映射、数据卷挂载等。 - 使用`docker-compose up -d`启动服务,这将在后台运行容器。 - 在从服务器上设置复制,使用如下命令: ```sql ...

    docker compose管理mysql资料.zip

    总结来说,这个“docker compose管理mysql资料.zip”可能包含的内容有:Docker Compose的基本用法、`docker-compose.yml`文件的结构解析、MySQL服务的配置、数据持久化、网络配置、以及数据库的备份与恢复操作。...

    docker-volume-ceph-rbd:一个Docker Volume插件,可将Ceph RBD用作分布式数据存储

    4. **数据一致性**:通过Ceph的快照和克隆功能,可以实现数据的备份和恢复。 这种插件适用于需要大规模、高性能存储的场景,如云服务提供商、大数据分析、媒体流服务等。 **总结** `docker-volume-ceph-rbd`是一...

    Docker网络与存储技术详解及其应用场景

    在存储部分,探讨了 Docker 的存储模型、常见的存储驱动(aufs、device mapper、overlay2、zfs)的原理,存储卷与数据持久化的方法,以及高级存储管理如存储卷管理、数据备份与恢复、存储驱动优化和最佳实践。...

Global site tag (gtag.js) - Google Analytics