dicker:数据管理

数据管理机制

docker使用union file system来管理数据,docker构建image和container也是采用了同样的技术。

image层次

iamge由多个层次构成,每个层次包含dockerfile的一条指令,除了最后一层外,其他层次都是只读的。

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py

其一共生成四个层次:

  • FROM 根据ubuntu:18.04生成一个层次
  • copy将运行docker命令的目录下的文件复制到容器中的app文件中
  • run 使用make命令生成应用程序
  • cmd 在容器中运行指定命令

docker层次的管理方式类似于git版本管理,层次的结构类似于一个栈,每个层次只记录与之前的层次的差异。当创建一个container时,会在image层次的基础上再创建一个读写层,对容器的修改操作都记录在读写层上而不会修改底层记录的数据。

container层次

container和image最大的区别在于container比image多了一层读写层用于记录对容器的修改,读写层在容器结束运行后销毁,其所记录的一切结果都不会保留,也不会改变image的数据。

由于container不会修改底层image的数据,所以多个container副本底层可以共享一个image。

copy-on-write策略

copy-on-write用于提高共享和复制文件的效率。

当需要对低层次数据进行读取时,如果不涉及数据修改,那么直接从低层读取现有数据;如果需要修改数据,则将数据拷贝到当前层次进行修改。

当我们将某个image作为base image构建新的image时,新的image不会复制base image的层次,而是共享相同的只读层。

为了存储效率和读写效率,当我们创建一个container时,同样只将要修改的数据复制到读写层中,以此保证容器所占空间最小。

存储驱动

docker支持多种存储驱动,官方推荐的驱动程序是overlay2。

数据存储方式

docker中数据存储有三种方式:记录在读写层、挂载主机文件系统、设置volume。

其中使用读写层记录数据会存在以下问题:

  • 数据无法持久化,当容器关闭后,读写层记录的数据就会消失
  • 数据不利于共享,其他容器或进程很难获取到容器读写层的数据
  • 读写效率低,读写层存储数据需要使用存储驱动,该驱动需要使用linux内核,运行效率低

如上图所示,

volume是将数据主机文件系统中docker所管理的区域,bind mount是将主机文件系统中的任何一部分挂载到container中,tmpfs mount是linux上的一个文件管理系统,他所有的数据都存储在内存中而不会保留在硬盘上,所以掉电后,其里面所有数据都会丢失。

相关链接

https://docs.docker.com/storage/storagedriver/

https://docs.docker.com/storage/storagedriver/select-storage-driver/

https://docs.docker.com/storage/storagedriver/overlayfs-driver$

docker深入学习二的更多相关文章

  1. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  2. 【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World

    操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service doc ...

  3. Docker容器学习梳理 - 应用程序容器环境部署

    关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...

  4. docker深入学习

    docker深入学习 一.容器的介绍和容器的发展史 为什么要学习容器? 在openstack之后,目前互联网最火热的技术莫过于docker容器了,早在2015年,京东技术备战双11就是使用了10万+D ...

  5. 在Windows环境中开始Docker的学习和体验

    研究docker有一段时间了,当然我主要的使用环境还是在Linux中,确实很方便. 但也有不少朋友希望使用Windows来工作学习,这里介绍一下在Windows中如何快速开始Docker的学习和体验吧 ...

  6. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  7. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  8. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  9. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

随机推荐

  1. 如何用Windbg从dump获取计算机名、主机名

    对内存转储时发生的事情有一定的了解是非常重要的.这有助于您确定要执行哪些WinDbg命令,并为您提供一些有关如何解释这些命令输出的上下文.我正在查看一个服务器的内存转储,该服务器存在性能问题.我在内存 ...

  2. ESP8266低功耗解决的其中一个问题(芯片发热,影响旁边的温湿度芯片)

    这个项目的这个问题困扰了自己好长时间了,ESP8266芯片发热,导致了旁边的温湿度传感器采集不了空气中的温度....采集的温度是芯片发热的温度 一直采集出来的是30多度......尽管空气温度10几度 ...

  3. 洛谷 P2212 [USACO14MAR]浇地Watering the Fields 题解

    P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...

  4. C博客作业

    1.你对网络专业或者计算机专业了解是怎样? 信息化是国企的一个大趋势,目前正是红火的时候. - 网络是信息化必不可少的的基础和平台,随着信息化的进步,网络也必将水涨船高. - 我认为网络方向主要学的是 ...

  5. mysql帐号,权限管理

    -> use mysql; //选择数据库 -> select host,user,password from user; //查询已有用户 -> insert into user ...

  6. NIO Channel SocketChannel ServerSocketChannel

    ServerSocketChannel: ServerSocketChannel是一个基于通道的socket监听器.它同我们所熟悉的java.net.ServerSocket执行相同的基本任务,不过它 ...

  7. 《Hadoop综合大作业》

    作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 我主要的爬取内容是关于热门微博文章“996”与日剧<我要 ...

  8. 如何SpringBoot项目改为外置Tomcat启动

    正常情况下,我们开发 SpringBoot 项目,由于内置了Tomcat,所以项目可以直接启动,部署到服务器的时候,直接打成 jar 包,就可以运行了 (使用内置 Tomcat 的话,可以在 appl ...

  9. linux 命令 文件数量统计

    # 查看当前目录下的文件数量(不包含子目录中的文件) ls -l|grep "^-"| wc -l # 查看当前目录下的文件数量(包含子目录中的文件) 注意:R,代表子目录 ls ...

  10. coredump之栈溢出

    1.栈溢出引发的core往往出现出现在递归调用中. gdb时看到的特征是: 栈缺失,当前栈地址不可读. 根据栈是逆向生长的特点(栈逆向生长,所以很容易出现类似数组溢出覆盖率函数返回地址,导致函数退出地 ...