qianlei90 / Blog

那些该死的文字呦
https://qianlei.notion.site
103 stars 20 forks source link

深入Docker存储(一):概念和原理 #37

Open qianlei90 opened 7 years ago

qianlei90 commented 7 years ago

深入Docker存储(一):概念和原理

Tags: 印象笔记 Docker

docker官方文档Understand images, containers, and storage drivers的笔记。

[toc]


一、镜像和图层

镜像是由一组只读的图层组成,这些图层自下而上以栈(stack)的形式互相关联,每层图层中都存储了文件系统级别上与下一层图层的差异。如图所示。

image1

docker的存储驱动用来管理这些图层,在逻辑上(非存储上)提供一个单一的扁平的视图,就好像在上图最上面提供了一个平面视图,当我们从上往下看时,看到了这个镜像完整的文件系统。 当我们根据镜像来创建容器时,docker会在镜像的图层(所有只读的图层)之上,再添加一层可读写的图层,被称为"容器图层"。所有对容器的改动都只会写到容器图层中去,而不会影响到下面只读的镜像图层。如图所示。

iamge2

1.1 内容寻址存储

docker在1.10版本中引入了新的存储模型:内容寻址存储。 之前的版本中,镜像和图层的UUID只是一个随机值,但是在新模型中,这个UUID是镜像和图层的内容哈希值。 这种新的计算方式在避免UUID冲突(因为之前是随机生成的)的同时,也保证了数据在一些操作(push、pull、load等)之后的完整性。在不同的构建过程中,也可以更好的复用图层,因为有一样的基于内容的哈希值。 注意,这只限于镜像图层,容器图层还是随机的UUID。如图所示。

image3

1.2 迁移

从老版本的docker迁移到新版本的docker时,会自动将镜像的存储模型迁移到新的内容寻址存储。在更新后的docker服务启动时,docker会自动的去计算内容哈希值,但是如果镜像数据量特别大的话,还是会消耗很多时间,而在这段时间内,docker服务是不可用的,而这对很多用户来说是不可接受的。 docker提供了一个迁移工具,可以在升级docker服务之前就开始迁移数据。具体的可以查看github上的v1.10-migrator

二、理解容器和图层

容器与镜像的区别在于,容器是在镜像图层之上新增了一层可读写的图层,所以一个镜像可以生成多个容器,而每个容器又可以有自己的数据。如图所示。

image4

当容器被删除时,其新增的可读写层也一起被删除。 docker的存储驱动负责管理镜像图层和容器图层,但背后的逻辑却因不同的存储驱动而不同,而其中的两个关键技术就是:镜像图层的可栈化(stackable)和写时拷贝技术(copy-on-write, CoW)。

三、理解写时拷贝技术

简单来说,就是多个系统应用需要使用同一块数据时,如果是读取数据,那大家就一起读取,如果有应用要写入数据时,系统为这个应用单独的复制这一块数据,应用只往数据副本中写入,等写完了,操作系统再把副本合并到原数据中去。 CoW技术对性能会有一定的影响,不同的存储驱动实现CoW的操作不一样,受CoW的性能影响也不同。

四、数据卷和存储驱动

当容器被删除时,所有不在数据卷中的数据都会被删除,这是因为数据卷不在容器图层中。删除容器时容器图层会被删除,但数据卷不会。 数据卷绕过了存储驱动,也被排除在本地的文件系统之外。下图显示了容器和数据卷的使用。

image5

- 完 - 2016/03/10