镜像与层
每一个Docker镜像都会引用一系列代表着文件系统差异的层, 层互相叠加在一起构成了容器根文件系统的基础.
Docker的存储引擎负责这些层的叠加, 并且提供一个统一的视角.
当创建一个容器的时候, 就会在层的栈顶添加一个可写的层, 通常叫做容器层(container layer), 对一个运行中的容器的所有修改(增删改文件)都会写在最顶层的可写的容器层中.
- 内容寻址存储(Content addressable storage)
自Docker1.10, 引进了一种新的内容寻址存储模型, 之前使用一个随机生成的UUID进行镜像和层的存储和引用, 新模型中使用了一种安全的内容哈希作为替代.
新模型改善了安全性, 提供了一种内建的防止ID冲突的的方法, 并且保证了在执行pull/push/save/load操作后数据的完整性, 同时它增强了层的可共享性, 即使镜像并不是来自于同一个编译.
低于1.10版本的image向新版本迁移的过程(在Container and layers上面)
容器与层
容器与镜像最大的不同就是层栈顶的可写层, 容器中所以的写操作都会发生在此可写层中, 当删除容器时, 可写层会一起被删掉, 但镜像会保持不变.
Docker存储驱动的目的就是处理镜像层和可写的容器层, 不同驱动完成这种功能的方法可能有很大不同, 但核心技术就是镜像的栈化和写时复制策略.
写时复制策略
不同的系统进程需要同样的数据时, 它们会公用一份数据, 而不是每个进程都自己拷贝一份. 如果有时候进程需要对数据做一些修改, 只有此时操作系统才会为该进程拷贝一份数据, 而且也只有该进程对拷贝的数据有写权限, 其他进程仍然使用原有数据.
- 数据共享减小了镜像尺寸
1.10以前的版本与1.10(包括)以后的版本对于层的存储机制是不同的.
拉去和推送镜像都是以层为单位的, 使用docker history可以查看到镜像中使用了哪些层.
docker history centos7:7.3.1611
IMAGE CREATED CREATED BY SIZE COMMENT
6eb36ef5c4da 13 days ago 264.7 MB
Imported from -
在镜像和容器中Docker都使用了写时复制策略, 大大降低了磁盘开销.
- 复制使容器更高效
Docker的写时复制不仅减小了容器占用的空间, 同时也减小了启动容器花费的时间, 每次启动容器, Docker 只需要创建可写的容器层.
数据卷和存储驱动
数据卷不被存储驱动所管理, 对数据卷的读写都是通过存储驱动传递给本地操作系统的.
当容器被删除时, 数据卷不会删除, 仍然留在本地机器的存储上.
网友评论