Docker中数据管理

Docker数据管理

  • 生产环境中,对数据进行持久化,或者需要在多个容器直接进行数据共享,这必然涉及到容器的一些数据管理的操作。
  • 容器中数据管理主要有两种方式:
    • 数据卷(Data Volumes):容器内数据直接映射到本地的主机环境
    • 数据卷容器(Data Volume Containers):使用特定的容器维护数据卷

数据卷

  • 数据集是一个可停过容器使用的特殊的文件目录,他将主机操作系统目录直接映射进容器,类似Linux中的mount操作。
  • 数据卷提供很多有用的特性如下:
    • 数据集可以在容器之间共享和重用,容器间传递数据将变得高效方便
    • 对数据卷内数据的修改会立刻生效,无论是容器内部的操作还是本地文件之间修改
    • 对书籍的更新不会影响镜像,解耦了应用和数据
    • 数据卷会一直存在,直到没有容器使用,可以安全的卸载它
  • 如下使用案例
  1. 在容器中创建一个数据卷
  • 在Docker run命令中使用 -v参数标记可以在容器内创建一个数据卷。多次重复使用-v 标记可以创建多个数据卷。
  • 现在使用training/webapp 镜像创建一个web容器,并创建一个数据卷挂载到容器的/webapp目录:
docker run -p 80:80 --name web -d -v /webapp training/webapp python app.py

-

  • 如上命令,在本地镜像仓库中没有对应镜像时候,会先自动下载
  • -p 指定将容器服务暴露的端口,是自动映射到本地主叫的临时端口80
  • -d 指定在后台运行
  • –name 指定容器启动后的别名
  1. 挂载一个主机目录作为数据卷
  • 使用-v标记也可以指定挂载一个本地以已经有的目录到容器中去作为数据卷,如下命令(推荐此种方式)
docker run -d -p 81:81 --name web -v /src/webapp:/opt/webapp training/webapp python app.py
  • 以上命令中加载主机的/src/webapp目录到容器的/opt/webapp目录
  • 这个功能在进行测试的时候比较方便,比如我们可以将一些程序或者数据预先放到本地的目录中,然后在容器中运行和使用。另外,本地目录的路径必须是绝对路径,如果目录不存在,Docker会自动创建。
  • Docker挂载数据卷的默认权限是读写(RW),我们可以通过ro指定位只读:
docker run -d -p 80:80 -name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
  • 如上命令,添加:ro后,容器内部对所挂载的数据卷内的数据就无法修改了。
  1. 挂载一个本地直接文件作为数据卷
  • -v 标记也可以从主机挂载单个文件到容器中作为数据卷(不推荐方式)。
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
  • 如上就可以距离在容器输入过的命令历史
  • 问题:如果直接挂载一个文件到容器,使用文件编辑工具,例如vi或者sed–in-place的时候,可能造成文件inode的改变,从Docker1.1.0开始,这回导致报错。所以推荐的方式是直接挂载文件所在目录。

数据卷容器

  • 现在我们需要在多个容器之间共享同一个持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,他的功能是用来提供数据卷供其他容器挂载。
  • 首先创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata:
docker run -it -v /dbdata --name dbdata ubuntu
  • 查看/dbdata目录:
    在这里插入图片描述
  • 如上已经有dbdata目录,我们可以在其他容器中使用–volumes-form来挂载dbdata容器中的数据卷,例如创建db1,db2两个容器,并从dbdata容器挂载数据卷:
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
  • 此时,容器db1和db2 都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到。
  • 示例:在dbdata容器中创建test文件
    在这里插入图片描述
  • 在db1 容器中查看其目录下的dbdata文件中内容:
    在这里插入图片描述
  • 我们也可以多次使用–volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。
  • 问题:
    • 使用–volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态
    • 如果删除了挂载的容器,包括上面的dbdata, db1, db2,数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着他的容器时显示的使用docker rm -v 命令指定同时删除关联的容器
    • 使用数据卷容器可以让用户在容器之间自由的升级和移动数据卷。

利用数据卷来迁移数据

  • 可以利用数据卷容器对启动的数据卷进行备份,恢复,这样实现数据的迁移
备份
  • 使用以下买那个了备份dbdata数据卷容器内的数据卷
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar dbdata
  • 如上命令:
    • 利用ubuntu镜像创建一个容器worker。使用–volumes-from dbdata参数来容worker容器挂载dbdata容器的数据卷(即dbdata数据卷);
    • 使用 -v ${pwd}:/backup参数来挂载本地的当前目录到worker容器的/backup目录。
    • worker容器启动后,使用tar cvf /backuo.backuo.tar/dbdata命令来将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主机当前目录下的backup.tar
    • 执行后可以看到宿主机/backup目录下出现backup.tar
      在这里插入图片描述
恢复
  • 如果需要将数据恢复到一个容器,可以按一下步骤:
  • 创建一个带有数据卷的容器dbdata2
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
  • 然后创建另外一个新的容器,挂载dbdata2 的容器,并使用untar解压备份文件到所挂载的容器卷中:
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

总结

  • Docker在设计上就考虑过数据问题,为数据管理提供了充分操作支持
  • 以上通过备份,恢复,共享机制,即使容器在运行中出现故障,用户也不必担心数据发生丢失,只要快速重新创建容器即可。
  • 生产环境中,推荐使用数据卷汇总数据卷容器以外,我们还需要定期将主机的本地数据进行备份,或者使用支持容错的存储系统,包括RAID或者分布式文件系统HDFS等。

上一篇:SpringCloud + Docker
下一篇:使用Dockerfile创建镜像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#两大知名Redis客户端连接哨兵集群的姿势

前言前面《Docker-Compose搭建Redis高可用哨兵集群》,我的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络,这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。同一网桥网络访问规避了Docker上发生的NAT&…

Docker之Dockerfile详解

使用Dockerfile创建镜像 Dockerfile是一个文本格式的配置文件,我们可以利用Dockerfile来快速的创建一个自定义的镜像。 基本结构 Dockerfile由一行命令语句组成,并且支持以#开头的注释一般包括四个部分:基础镜像信息,维护者信息…

创业的N种死法

点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份互联网的江湖一直流传着大佬们的创业传奇。马云上厕所几分钟敲定几千万美金融资。王石走投无路靠倒卖玉米赚到上百万从此逆袭。扎克伯格为了获得哈佛美女照片,开发一个小玩意从此改变了世界。传奇…

Docker容器实战思维

Docker成功的基础 Docker的实现用到的基础技术(cgroups, namespace,分层文件系统)在Docker之前已经存在很多年,并且 Linux Containers(LXC)也在很多企业的环境中得到了大量的应用实践,并得到明…

dotNET Core 3.X 请求处理管道和中间件的理解

理解 dotNET Core 中的管道模型,对我们学习 dotNET Core 有很大的好处,能让我们知其然,也知其所以然,这样在使用第三方组件或者自己写一些扩展时,可以避免入坑,或者说避免同样的问题多次入坑。本文分为以下…

了解.NET中的垃圾回收

原文来自互联网,由长沙DotNET技术社区编译。尽管这是一篇来自2009年的古老的文章,但或许能够对你理解GC产生一些作用。 了解.NET中的垃圾回收一旦了解了.NET的垃圾收集器是如何工作的,那么可能会触及.NET应用程序的一些更为神秘的问题时&…

数据结构与算法--数组:二维数组中查找

数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存。即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存&#xf…

数据结构与算法--字符串:字符串替换

数据结构与算法–字符串:字符串替换 字符串的优化 由于字符串在编程时候使用的评率非常高,为了优化,很多语言都对字符串做了特殊的规定。下面我们讨论java中字符串的特性java中的字符数组以’\0’ 结尾,我们可以利用这个特性来找…

数据结构与算法--经典10大排序算法(动图演示)【建议收藏】

十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序非比较类型排序&…

如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践

原文来自互联网,由长沙DotNET技术社区编译。本文来源:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-net-8-best-practices/从事大型企业项目的任何人都知道内存泄漏就像是大型酒店中的老鼠。当它们很少时,您可能不会…

ASP.NET Core技术研究-探秘依赖注入框架

ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务、提供服务。依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者。毫不夸张的说,ASP.NET Core通过依赖注入实现了各种服务对象的注册和创建,…

Redis遍历方式思考--字典扩容方式

全量遍历keys 工作中线上Redis维护,有时候我们需要查询特定前缀的缓存key列表来手动处理数据。可能是修改值,删除key。那么怎么才能快速的从海量的key中查找到对应的前缀匹配项。Redis提供了一下简单的指令,例如keys用来满足特定正则下的key…

从项目到产品: 软件时代需要价值流架构师 | IDCF

译者:无敌哥原文地址: https://thenewstack.io/the-age-of-software-needs-value-stream-architects/ 本文翻译仅供学习交流之用。原文作者 Mik Kersten 出版了《Project to Product》本系列共四篇文章,分别是01 从项目到产品:软件需要从物理…

Redis高效性探索--线程IO模型,通信协议

Redis线程IO模型 Redis是单线程,这个毋庸置疑Redis单线程能做到这么高的效率?不用怀疑,还有很多其他的服务都是单线程但是也有超高的效率,比如Node.js,Nginx也是单线程。Redis单线程高效原因: Redis所有数…

Redis持久化-深入理解AOF,RDB

持久化 Redis数据全部在内存中,如果宕机,数据必然丢失,因此必须有一种机制保证Redis数据不会因为故障丢失,这就是Redis的持久化机制持久化方式两种:AOF,RDB,如下图 RDB快照模式是一次全量备份&…

推荐一个集录屏、截图、音频于一体的软件给大家

捕获屏幕,网络摄像头,音频,光标,鼠标单击和击键GitHub:https://github.com/MathewSachin/Captura特性 免费 100%免费,你不需要花一分钱开源 根据MIT许可的条款,可以在Github上获得Captura的源…

Redis高效性探索--管道

管道 开始接触Redis时候,对应Redis管道有一个错误认识,任务是redis服务器提供的一种特别的技术,有了这种技术可以加速Redis的存取效率,但是实际上Redis的管道计算(Pipeline)本身是客户端提供的技术&#x…

Redis--事务理解

事务 一个成熟的数据库系统一般都会有事务的支持,Redis作为一个缓存数据库也不例外,Redis的事务比之关系型数据库mysql,oracle等算比较简单的,Redis中无需理解那么多事务模型,可以直接使用。不过也正是因为简单&#…

.NET中的内存管理

原文来自互联网,由长沙DotNET技术社区编译。 .NET中的内存管理资源分配Microsoft .NET公共语言运行时要求从托管堆分配所有资源。当应用程序不再需要对象时,它们将自动释放。初始化进程后,运行时将保留地址空间的连续区域,该区域最…

Redis存储优化--小对象压缩

小对象压缩 Redis是一种内存数据库,内存是计算机中一种比较宝贵的资源,如果我们不注意节约,Redis很可能出现内存不足,最终导致崩溃。Redis为了优化数据结构的内存占用,增加了非常多的优化点,这些优化也是牺…