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$

最新文章

  1. sun.misc.BASE64Encoder找不到jar包的解决方法
  2. php使用curl 检测socks5 代理的可用性
  3. Android java传递int类型数组给C
  4. js 模块化编程
  5. 5分钟windows wamp php安装phpunit 2015最新安装实践
  6. jquery.validate使用 - 1
  7. 使用python的subprocess启动windows程序提示WindowsError: [Error 6] The handle is invalid
  8. unreal3脚本stacktrace的问题
  9. 【转】GridView中页脚汇总显示
  10. 认识js函数对象(Function Object)
  11. SQL Server中的死锁
  12. JS定时器的使用--数码时钟
  13. Java内存回收机制.md
  14. width和max-width的用处
  15. CSS常见兼容问题以及解决办法
  16. Oracle数据库自带表空间
  17. python入门(四):字符串、编码、random
  18. 【读书笔记】iOS-使用SQL数据库保存信息
  19. Springboot 2.0.x 引入链路跟踪Sleuth及Zipkin
  20. Java结束线程的三种方法(爱奇艺面试)

热门文章

  1. echo如何输出带颜色的文本
  2. rac集群状态脚本执行awk拼接有问题
  3. 洛谷 P1522 牛的旅行 Cow Tours 题解
  4. SQL基础-建表
  5. uni-app快速上手
  6. 升级项目版本:SpringBoot1.5.x到SpringBoot2.0.x
  7. presto集成kerberos以及访问集成了kerberos的hive集群
  8. 关于python的深拷贝和浅拷贝
  9. inotify 监控文件系统操作
  10. AOP注解方式ApsectJ开发