用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及到Docker的数据管理。

容器中管理数据主要有两种方式:

  • 数据卷(Data Volumes)
  • 数据卷容器(Data Volumes Dontainers)

数据卷:

数据卷是一个可供容器使用的特殊目录,他绕过文件系统,可以提供很多有用的特性:

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

数据卷的使用,类似于Linux下对目录或文件进行mount操作(挂载)。

创建一个数据卷:

在使用docker run命令的时候,使用-v参数可以在容器内创造一个数据卷,如果多次使用-v参数可以创造多个数据卷。

比如创建一个私有仓库的时候:

 docker run –d –p 5000:5000 —name registry –v /tmp/registry registry

创建一个/tmp/registry数据卷挂载到这个容器里。

挂载一个主机目录作为数据卷:

使用-v参数也可以制定挂载一个本地已有的目录到容器中作为数据卷,还是举创建私有仓库的例子:

 docker run –d –p 5000:5000 —name registry –v /data/registry:/tmp/registry registry

这样便是把本地的/data/registry挂载到容器中作为/tmp/registry。不过本地目录一定要是绝对路径,如果,目录不存在Docker会自动创建。

另外,Docker挂在数据卷的默认权限是读写(rw),也可以使用(ro)指定为只读权限:

 docker run –d –p 5000:5000 —name registry –v /data/registry:/tmp/registry:ro registry

这样容器就没有写入的权限了。

挂载一个主机文件作为数据卷:

也是可以把主机的一个文件挂载载到容器中作为数据卷,使用命令和挂载目录一样。

不过直接挂载一个文件到容器中,又在外部编辑文件有可能导致文件inode信息的改变,从Docker1.1.0起,这回导致错误信息。

所以建议挂载目录以达到访问文件的目的。

数据卷容器:

如果需要在容器之间共享一些持续的更新的数据,最简单的方式是使用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它提供数据卷提供其他容器挂载。使用方法如下:

首先,创建一个数据卷容器比如dbdata,并在其中创建一个数据卷并挂载到/dbdata。

 docker run –it –v /dbdata —name dbdata ubuntu

然后可以在其他容器使用–volumes-from来挂载dbdata容器中的数据卷。例如创建db1和db2两个容器,并从dadata容器挂载数据卷。

docker run –it —volumes–from dbdata —name db1 ubuntu
docker run –it —volumes–from dbdata —name db2 ubuntu

完成后,db1和db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看得到。

可以多次使用–volumes-from从而从多个容器中获得多个数据卷,也可以从其他已经挂在容器卷的容器挂载数据卷。

使用–volumes-from参数所挂载的容器自身不需要保存在运行状态。

删除数据卷容器:

如果删除了挂载的容器比如删除了dbdata,db1,数据卷并不会被自动删除,因为此时还有一个db2正在使用这个数据卷容器。

如果想删除一个数据卷必须在删除最后一个还挂载着它的容器时显式使用docker rm-v命令来指定同时删除关联的容器。

利用数据卷容器迁移数据:

可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

备份:

使用下面的命令来备份dbdata数据卷容器内的数据卷:

 docker run —volumes–from dbdata –v $(pwd):/backup —name worker ubuntu tar cvf /backup/backup.tar/dbdata

很长,慢慢分析,首先是要建立一个利用ubuntu镜像容器,把本地当前路径挂载到容器的/backup下,容器执行的命令是tar cvf /backup/backup.tar /dbdata,命令达到的效果就是吧/dbdata压缩并保存到/backup下。

因为/backup是由本地当前路径挂载的,因此就是保存到当前路径下,从而实现备份的效果。

恢复:

如果要恢复数据到容器中,可以按照下面的操作。

首先创建一个带有数据卷的容器dbdata2:

 docker run –v /dbdata —name dbdata2 ubuntu /bin/bash

然后创建另一个新容器,挂载dbdata2容器,使用tar解压备份文件到所挂载的容器卷中即可:

 docker run —volumes–from dbdata2 –v $(pwd):/backup ubuntu tar xvf /backup/backup.tar

容器是廉价的,数据是宝贵的,根据数据卷和本地的挂载以及容器之间容器卷的共享实现数据备份和还原很方便(说的好违心),总之,数据备份和恢复是没有问题了。

转自:梦续代码

Docker数据管理的更多相关文章

  1. Docker数据管理(四)

    Docker数据管理 Docker数据分为两种: 数据卷 -v /data -v src:dst 数据卷容器 --volumes-from 数据卷 案例1:我们创建一个容器,起名叫nginx-volu ...

  2. Docker系统七:Docker数据管理

    Docker的数据管理 I. 基本概念 Docker容器一旦删除,其相关的rootf文件系统就会被删除,其容器内的数据将一并删除,为了保存相关数据,Docker提出了数据卷的概念. II. 数据卷 D ...

  3. Docker数据管理(五)

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

  4. Docker数据管理(数据卷&数据卷容器)

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

  5. Docker实战(四)之Docker数据管理

    在生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及到容器的数据管理操作. 容器中管理数据主要有两种形式: 数据卷:容器内数据直接映射到本地主 ...

  6. 【Docker】第五篇 Docker 数据管理

    一.基本介绍 数据管理的原因:Docker中的容器一旦删除,容器本身的rootfs文件系统就会被删除,容器中的所有数据就会被删除.为了对一些需要持久化的数据,不随容器删除而删除,所以我们可以通过多个容 ...

  7. <Docker学习>5. docker数据管理

    当我们创建了一个tomcat容器,如何简单部署一个web应用?如何将war包放入到容器中?也就是说怎么样把文件从宿主机中 "放入" 到容器中? docker cp命令可以将宿主机本 ...

  8. docker数据管理(2)

    一.docker存储资源类型 docker两种存储资源类型 用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉 ...

  9. 六、【Docker笔记】Docker数据管理

    前几节我们介绍了Docker的基本使用和三大核心概念,那么我们在使用Docker的过程中,Docker中必然产生了大量的数据,对于这些数据我们需要查看或者对这些数据进行一个备份,也有可能容器之间的数据 ...

随机推荐

  1. Add Customerlize Button in More Button List In Odoo

    There're two commen type of actions in odoo: ir.actions.server,ir.actions.client_multi 1.Using ir.ac ...

  2. Java集合之Map接口

    Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值.Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashM ...

  3. 自己翻译 delegation 官方文档

    什么是代理,知道怎么用,见过N次.会用代理传值,还不够.代理到底是用来干嘛的嘛?还是看看官方文档吧,自己翻译出来看看是不是通顺 代理: 代理是一个简单高效的模式,尤其是一个类在编程的过程中代表或者需要 ...

  4. windows7下使用telnet

    需要打开windows功能,telnet客户端. 在命令行里输入Telnet open www.qq.com 80 连接成功后会进入一个空界面,之前命令行窗口里的字符还在,光标却移动到最起始. 这是很 ...

  5. PHP文件操作 之读取目录信息

    //定义一个函数 读取目录信息的函数 function dirInfo($dirName) { //判断目录是否存在 if (!file_exists($dirName)) { die('目录不存在! ...

  6. physical addressing virtual addressing 物理寻址 虚拟寻址

    Computer Systems A Programmer's Perspective Second Edition The main memory of a computer system is o ...

  7. 4Web镇之旅:开始链接

    为了将网页发布到web上,需要一个全日工作的网络服务器,最好的方法是找到一家主机代理商. 域名是用来定位网站的第一无二的名字. 网页的最顶层目录就是根目录.在Web服务器中,因为根目录中的东西有可能在 ...

  8. spring环境的搭建及作用和定义<一>

    问题?spring的定义及作用.spring的环境搭建 一.spring的定义及作用 1.spring由Rod Johnson创建的一个开源框架,它是为了解决企业应用开发的复杂性而创建的.框架的主要优 ...

  9. 【nodejs】使用Node.js实现REST Client调用REST API

    最近在产品中开发基于REST的API接口,结合自己最近对Node.js的研究,想基于它开发一个REST Client做测试之用. 通过初步研究,Node.js开发HTTP Client还是挺方便的. ...

  10. asp.net实现关闭当前网页

    asp.net实现关闭当前网页功能:Response.Write("<script>window.close();</script>");// 会弹出询问是 ...