一、介绍

  Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。

  为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

  数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

  *注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

二、创建数据卷

  我们可以通过两种方式来初始化Volume,这两种方式有些细小而又重要的差别。

  2.1 使用-v 声明volume  

docker run -it --name vtest -v /data centos /bin/bash
[root@73413fd53edb /]# ls data/
[root@73413fd53edb /]#

  上面的命令会将/data挂载到容器中,并绕过联合文件系统,我们可以在主机上直接操作该目录。任何在该镜像/data路径的文件将会被复制到Volume。我们可以使用docker inspect命令找到Volume在主机上的存储位置:

docker inspect -f {{.Mounts}} vtest
[{volume dccde6b373f1c0f4da5b70c8dcc35bf4ecad0c499e1cfd80c258821206ee7948 /var/lib/docker/volumes/dccde6b373f1c0f4da5b70c8dcc35bf4ecad0c499e1cfd80c258821206ee7948/_data /data local true }]

  这说明Docker把在/var/lib/docker/volumes下的某个目录挂载到了容器内的/data目录下。让我们从主机上添加文件到此文件夹下: 

sudo touch /var/lib/docker/volumes/dccde6b373f1c0f4da5b70c8dcc35bf4ecad0c499e1cfd80c258821206ee7948/_data/test-file

# 查看/data目录
[root@73413fd53edb /]# ls /data
test-file

  2.2 使用Dockerfile 声明volume  

FROM centos
VOLUME /data

  2.3 挂载指定的主机目录

  但还有另一件只有-v参数能够做到而Dockerfile是做不到的事情就是在容器上挂载指定的主机目录。  

[bigberg@localhost volumes]$ docker run -itd --name vtest2 -v /data/docker/volumes/volume-test:/data centos /bin/bash
16b1aafbc219884b32bfb0c227e1250558bca550ab7bce31b0739f63620fd688 [bigberg@localhost volumes]$ sudo touch /data/docker/volumes/volume-test/test2-file
[bigberg@localhost volumes]$ docker-enter vtest2
[root@16b1aafbc219 ~]# cd /data/
[root@16b1aafbc219 data]# ls
test2-file

三、数据共享

  如果要授权一个容器访问另一个容器的Volume,我们可以使用-volumes-from参数来执行docker run。 

docker run -it --name vtest3 --volumes-from vtest2 centos /bin/bash
[root@e6ed980c8dba /]# ls /data/
test2-file

  值得注意的是不管container-test是否运行,它都会起作用。只要有容器连接Volume,它就不会被删除。

四、数据容器 

  如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

  首先,创建一个名为 dbdata 的数据卷容器: 

docker run -v /dbdata --name dbdata postgres echo "Data-only container for postgres"
Data-only container for postgres

  然后,在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。

docker run -d --volumes-from dbdata --name db1 postgres

docker run -d --volumes-from dbdata --name db2 postgres

  可以使用超过一个的 --volumes-from 参数来指定从多个容器挂载不同的数据卷。 也可以从其他已经挂载了数据卷的容器来级联挂载数据卷。 

docker run -d --name db3 --volumes-from db1 postgres

  *注意:使用 --volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。

  如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。

  

五、备份

  首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:

docker run --rm --volumes-from dbdata -v $(pwd):/backup centos tar cvf /backup/backup.tar /dbdata
tar: Removing leading `/' from member names
/dbdata/
/dbdata/test-file
[bigberg@localhost ~]$ ll
total 606496
-rw-r--r-- 1 root root 10240 Feb 28 17:32 backup.tar

  容器启动后,使用了 tar 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 backup.tar 的文件。

六、恢复

  如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。

docker run -v /dbdata --name dbdata2 centos /bin/bash

  然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中。

docker run --rm --volumes-from dbdata2 -v $(pwd):/backup centos tar xvf /backup/backup.tar

  为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看

docker run --volumes-from dbdata2 centos /bin/ls /dbdata
test-file

    

Docker入门与应用系列(四)数据卷管理的更多相关文章

  1. 《Visual C++ 2010入门教程》系列四:VC2010中初学者常见错误、警告和问题

    <Visual C++ 2010入门教程>系列四:VC2010中初学者常见错误.警告和问题   这一章将帮助大家解释一些常见的错误.警告和问题,帮助大家去理解和解决一些常见问题,并了解它的 ...

  2. Docker学习第三天(Docker数据卷管理)

    1.Docker数据卷管理 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供了三种 ...

  3. Docker 使用指南 (四)—— 数据卷的使用

    一.数据卷的使用 有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker中提供了数据卷可以供你方便的操作数据.数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用 ...

  4. Docker系列八: 数据卷

    什么是数据卷 生成环境中使用docker的过程中,往往需要对数据进行持久化,或者需要多个容器之间进行数据共享,这个就涉及到了容器数据管理 容器中管理数据主要有两种方式: 数据卷:容器内数据之间映射到本 ...

  5. docker 数据卷管理

    在生产环境中使用docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这涉及到容器对数据管理的操作 容器对数据的管理主要有两种方式: 数据卷(Data Volumes): 容器内 ...

  6. Docker 入门到实践(四)Docker 使用镜像

    一.获取镜像 Docker Hub 上有大量的高质量的镜像让我们获取,命令为: docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 具体的选项可以 ...

  7. Docker 备份、恢复、迁移数据卷

    可以利用数据卷对其中的数据进行进行备份.恢复和迁移. 备份 首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的 /backup 目录. ...

  8. docker数据卷管理及网络基础配置

    数据卷 数据卷容器 数据卷迁移数据 端口映射 容器间通信 数据卷的管理 当需要查看容器内应用产生的数据或者把容器内数据备份及多个容器数据共享.有两种方式,数据卷以及数据卷容器. 数据卷 数据卷是一个可 ...

  9. docker之数据卷管理

    转自:https://www.cnblogs.com/jsonhc/p/7777811.html docker之数据卷的备份和还原 1.现在利用镜像创建一个nginx的服务容器,并挂载一个数据卷 [r ...

随机推荐

  1. git 查看对比分支commit命令笔记

    git log  newheader(branch1) ^release(branch2) -- branch1 上比branch2多的commit 注意brnach2后面要--

  2. oracle数据update后怎么恢复到以前的数据

    http://blog.csdn.net/itdada/article/details/52746392

  3. ORM PHP 学习记录

    ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射.为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却 ...

  4. hadoop在章鱼大数据平台下的安装与配置

    本次所用的软件版本: ubuntu :14.04 Hadoop:hadoop-2.6.0-cdh5.4.5 jdk:jdk-7u75-linux-x64 Hive: Hbase: 一.配置基本环境 1 ...

  5. Daily Scrum 11.14

    姓名 今日任务 黄新越 按照热度排序->产生柱状图 刘垚鹏 总体代码架构整合 王骜 总体代码架构整合 林旭鹏 优化整体UI布局 安康 优化整体UI布局 黄伟龙 预先合作编写测试用例 马佐霖 预先 ...

  6. OO第四阶段总结

    一.测试与正确性论证的区别 从哲学的角度来说,正确性论证与测试的关系就像理论与实践的关系一样. 使用测试的方法检验程序正确性确实是一个非常方便可行且广泛运用的方法.可以通过几个简单或复杂的测试样例,迅 ...

  7. C# CHM帮助文档

    1.生成chm文件 首先,下载EasyCHM软件,此软件可将HTML文件.TXT文件.图片和文件夹按照文件层次生成.chm文件.EasyCHM打开界面如图所示: 点击“新建”,选择需要生成.chm文件 ...

  8. 软件工程实践2018第六次作业——现场UML作图

    团队信息 学号 姓名 博客链接 124 王彬(组长) 点击这里 206 赵畅 点击这里 215 胡展瑞 点击这里 320 李恒达 点击这里 131 佘岳昕 点击这里 431 王源 点击这里 206 陈 ...

  9. C++ 游戏之点点水果

    大二时利用C++编写的点水果小游戏 程序代码总共3个文件,main.cpp Fruit.h Fruit.cpp  代码将在图片下面给出 至于讲解,由于过了一年多的时间,有点忘记了,但我会努力回忆并即时 ...

  10. VIM 命令收藏

    1.vim#在命令行中输入vim,进入vim编辑器2.i#按一下i键,下端显示 --INSERT--#插入命令,在vim中可能任意字符都有作用3.Esc#退出i(插入)命令进行其它命令使用4.:r f ...