一、研究调研
1.1 调研工作
什么是基础镜像?
基础镜像是 Docker 镜像的起点,它是一个只读的文件系统。基础镜像通常包含了一个最小化的操作系统,以及一些预装的基础软件包。Docker Hub 提供了许多常用的基础镜像,如 Ubuntu、Alpine 等。这些镜像是由 Docker 官方或社区维护的,可以在 Docker Hub 上自由获取和使用。
手动查看基础镜像
查看docker history
1
docker history calico/cni:v3.13.1
查看docker inspect
1
docker inspect 6912ec2cfae6
有部分镜像会在label中写出基础镜像,但有的没有
有部分镜像会在parent中写出基础镜像,但有的没有
layers发现基础镜像的方法
Docker 镜像是由一系列只读的文件系统层构成的,这些层会按特定顺序叠加在一起,构成一个完整的镜像。镜像层的设计使得 Docker 具有轻量、高效和可复用的特性。下面是 Docker 镜像层构成的详细介绍:
- 基础镜像层:
Docker 镜像的第一层是基础镜像层,它通常包含一个最小化的操作系统,如Alpine Linux、Ubuntu、CentOS等。这个基础镜像提供了运行应用程序所需的最基本的文件和工具。基础镜像通常是公共或私有的,供其他镜像构建和扩展使用。
- 应用程序依赖层:
在基础镜像之上,Docker 可以添加应用程序的依赖项和运行时环境,这些依赖项可能包括软件包、库文件等。这些层用于支持应用程序的执行和运行所需的软件和工具。
- 应用程序代码层:
在依赖层之上,Docker 可以添加应用程序的实际代码和资源文件。这些层包含了应用程序的源代码、配置文件、静态资源等。这使得 Docker 镜像能够完整地包含应用程序的所有代码。
- 只读层:
镜像的每个层都是只读的,这意味着在构建后,镜像层的内容不会再改变。这种设计有助于镜像的高效性和可复用性。如果需要修改镜像,Docker 将在现有层之上创建新的镜像层,保持原有层的完整性。
- 共享相同层:
当多个镜像共享相同的基础层时,它们可以节省存储空间和下载时间。因为这些镜像只需在自己的特定层上添加差异层,而不是复制整个基础镜像。这使得镜像的存储和传输变得更加高效。
- 镜像的唯一标识:
每个镜像都有一个唯一的标识符,称为镜像 ID,它是根据镜像内容生成的哈希值。镜像 ID 是根据所有镜像层的内容计算得出的,即使一个镜像只有一个小的改动,它的镜像 ID 也会发生变化。这种特性有助于确保镜像的唯一性和数据的完整性。
查看docker history中最下方添加的file信息
1 | docker history runctaoyi:v1.0 --no-trunc |
查看docker hub中对应file信息
寻找宿主机中镜像实际文件系统
layerID:
压缩后的哈希,和diffID有一一映射关系
diffID:
解压缩后的哈希,使用docker inspect可以查看到
1 | /var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256 |
chainID:
- 如果layer是最底层,没有任何父layer,那么 diffID = chainID
- 否则,chainID(n)=sha256sum(chainID(n-1)) diffID(n))
cacheID:
我们想要的第一层layer刚好没有任何父layer,所以diffID=chainID,访问/var/lib/docker/image/overlay2/layerdb/sha256/{chainID}/cache-id文件可以获取cache-id
我们想要获取的镜像/etc/os-release文件在宿主机的真实路径表现为/var/lib/docker/overlay2/{cache-id}/diff/etc/os-release
1 | cat /var/lib/docker/overlay2/{cache-id}/diff/etc/os-release |
利用镜像文件系统查看基础镜像
在manifest.json文件中找到第一个layer的文件名,进入tar包并查看/etc/os-release文件,能够获取基础镜像信息
1.2 bif开源工具
- 维护了一个基础镜像查询服务器输入镜像名来查询基础镜像
- 运行命令和截图
1 | ./bif find --image us-docker.pkg.dev/fairwinds-ops/oss/polaris:7.0.0 --insights-oss-token cde4be88-d5a6-4cbb-ae0f-0f4653724623 |
- 调用API
1 | GET https://bif-server-6biex2p5nq-uc.a.run.app/base?image_tag={完整镜像名} |
提交请求后返回json信息
1 | { |
Author: Sally