前言:
在我们pull镜像的时候,就会发现一个神奇的地方,在将镜像pull到本地的时候它是分层下载的,如下图:
这时候我就有一个疑问,为什么是分层下载的?怎么和我们平时下载软件的时候不一样呢?
联合文件系统
造成上面的原因是因为docker采取了联合文件系统(Union File System)来存储镜像。联合文件系统是一种将多个独立目录或文件系统透明叠加为单一逻辑视图的技术。它通过合并不同来源的文件层,呈现出一个统一的文件系统结构,用户或应用程序可以像访问普通目录一样访问这些叠加后的内容,而无需感知底层的分层细节。
Docker镜像的联合文件系统的主要构成部分
1. 基础镜像层(Base Image Layer):这是 Docker 镜像的初始层,通常包含操作系统的基本文件系统。基础镜像层是只读的,不可更改。
2. 镜像层(Image Layers):在基础镜像层之上,可以有一个或多个镜像层。每个镜像层都包含了一组文件或目录的快照。镜像层是只读的,可以在多个镜像之间共享。
3. 容器层(Container Layer):当使用镜像创建容器时,会在镜像层的顶部添加一个容器层。容器层是可写的,用于存储容器运行时的文件修改和数据。
4. 挂载点(Mount Point):Docker 容器可以将主机上的目录或文件挂载到容器内的指定路径。挂载点允许容器访问主机的文件系统,以实现数据共享和持久化存储。
联合文件系统通过将这些部分以一种有效的方式组合在一起,形成一个单一的可读写的文件系统。容器在运行时会将这些层叠加在一起,形成一个完整的容器文件系统视图。
举例说明
在前言里面pull了一个标签为latest的redis镜像,我们在pull一个标签为6.2的redis镜像。输入下面指令来查看一下镜像的详情
docker system df -v
上面的各个参数分别代表着:
- REPOSITORY:镜像所属仓库的名称
- TAG:镜像的标签。
- IMAGE ID:镜像的唯一hashID,这里只是截取了一小部分来表示
- CREATED:表示镜像的创建时间。
- SIZE:表示镜像的逻辑总大小(包含了共享曾)
- SHARED SIZE:表示该镜像的层中被其他镜像共享的层总大小(即共享层的总大小)
- UNIQUE SIZE:表示该镜像中独用层的总大小(扣除镜像层的部分)
- CONTAINERS:表示的是基于该镜像创建的容器正在运行的数量。
我们不免可以看出来redis6.2和redis:latest的SHARED SIZE均为74.83,说明他们共享同一个基础层(相同的操作系统或依赖)。说明了docker的镜像存储是采用的是联合文件系统。