要了解storage driver的概念,我们得明白docker的一些工作原理
layer stack
通过dockerfile,可以基于旧的image文件,创建新的image文件
比如以下dockerfile:
FROM ubuntu:18.04 COPY . /app RUN make /app CMD python /app/app.py
基于ubuntu:18.04 image, 创建了新的image
image创建是采用layer stack的模式。
即首先引用已有的image,在 此基础上每一条执行命令,都意味着对旧的image改动,因此对应每条执行命令,就会创建一个新image layer, 叠加在旧的image之上,比如以上命令:
- FROM引用已有的ubuntun 18.04image
- COPY基于FROM创建layer
- RUN基于COPY创建layer
每个layer中,都仅包含本指令改动的内容。这样一层层的堆积后的整体效果,就是最终的image
一个完整的image就由旧有的image,以及之上的一层层layer stack构成。
从image创建container的过程,也是基于这个原理,由image创建container的时候,上面再构建一个container layer。其中container layer是运行时可读写的,而之下的image layer是只读的,如图:
同一个image可以创建多个container,即创建多个container layer。container内的数据读写,就发生在container layer中,如图:
显然,这样做的好处,大大的节省了存储空间,提高了资源的重用
copy on write(cow)
整个image layer采用copy on write的工作方式,即上层并不完全拷贝下层数据,上层仅仅保存本层修改了的数据。
仅有当上层layer需要对下层layer中的数据修改时,才把需要修改的内容拷贝到上层,修改后结果保存在上层,这样上层修改后的数据会隐藏掉下层的数据,达到修改目的。
需要注意的是,下层的数据依然还在,仅仅是被上层的数据隐藏了
storage driver
整个image layer stack以及cow模式,是一种设计思路。而具体的实现,叫做storage driver,storage driver也叫graphdriver
docker通过统一的接口,使用插件的方式,可选择不同的storage driver。
启动docker daemon的时候,可通过–storage-driver参数指定具体的storage driver,指定后,所有的image都采用该storage driver。
大部分情况下 ,我们都不需要自定义storage driver,只有在一些特定的操作系统,或者业务环境中,可通过选择合理的storage driver,实现效率最大化
container内数据保存
container内数据修改,就保存在container layer中。container尽可能少的进行数据读写,减少cow的代价,以及container的大小。
当有数据需要频繁读写时,该数据建议保存到volume中
相关命令
#查看storage driver docker info #指定storage dirver dockerd --storage-driver=devicemapper #查看image layer docker history [image id] # 查看container占用的存储大小 ls /var/lib/docker/containers 或者 docker ps -s //其中显示的size是container数据在磁盘的大小。virtual size是size加下层image数据总共的大小。 //注意的是下层image数据是多个container共享的,仅占一份空间
回复 agodelo 取消回复