img

一、研究调研

1.1 调研工作

什么是基础镜像?

基础镜像是 Docker 镜像的起点,它是一个只读的文件系统。基础镜像通常包含了一个最小化的操作系统,以及一些预装的基础软件包。Docker Hub 提供了许多常用的基础镜像,如 Ubuntu、Alpine 等。这些镜像是由 Docker 官方或社区维护的,可以在 Docker Hub 上自由获取和使用。

手动查看基础镜像

  • 查看docker history

    1
    docker history calico/cni:v3.13.1

    image3

  • 查看docker inspect

    1
    docker inspect 6912ec2cfae6

    有部分镜像会在label中写出基础镜像,但有的没有

    image2

    有部分镜像会在parent中写出基础镜像,但有的没有

    image1

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

layer2

查看docker hub中对应file信息

dockerhub

寻找宿主机中镜像实际文件系统

layerID:

压缩后的哈希,和diffID有一一映射关系

diffID:

解压缩后的哈希,使用docker inspect可以查看到

file

1
2
3
4
/var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256
# 存放diffID -> layerID 正向查询,以文件名进行查询
/var/lib/docker/image/overlay2/distribution/v2metadata-by-diffid/sha256
# 存放layerID -> diffID 反向查询,以文件名进行查询

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

file1

我们想要获取的镜像/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

file2

利用镜像文件系统查看基础镜像

在manifest.json文件中找到第一个layer的文件名,进入tar包并查看/etc/os-release文件,能够获取基础镜像信息

find

1.2 bif开源工具

  • 维护了一个基础镜像查询服务器输入镜像名来查询基础镜像

code

  • 运行命令和截图
1
./bif find --image us-docker.pkg.dev/fairwinds-ops/oss/polaris:7.0.0 --insights-oss-token  cde4be88-d5a6-4cbb-ae0f-0f4653724623

bif

  • 调用API
1
2
3
GET https://bif-server-6biex2p5nq-uc.a.run.app/base?image_tag={完整镜像名}
# headers中需要加入一个认证字段
Authorization: Bearer {你的token}

提交请求后返回json信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
{
"image_repository": "us-docker.pkg.dev/fairwinds-ops/oss/polaris",
"image_tag": "7.0.0",
"image_platform": "linux/amd64",
"base_images": [
{
"image_repository": "alpine",
"image_tag": "3.16.0",
"vulnerabilities": [
{
"id": "CVE-2022-2097",
"severity": "MEDIUM",
"cvss": 5.3
},
{
"id": "CVE-2022-30065",
"severity": "HIGH",
"cvss": 7.8
},
{
"id": "CVE-2022-37434",
"severity": "CRITICAL",
"cvss": 9.8
},
{
"id": "CVE-2022-4304",
"severity": "MEDIUM",
"cvss": 5.9
},
{
"id": "CVE-2022-4450",
"severity": "HIGH",
"cvss": 7.5
},
{
"id": "CVE-2023-0215",
"severity": "HIGH",
"cvss": 7.5
},
{
"id": "CVE-2023-0286",
"severity": "HIGH",
"cvss": 7.4
},
{
"id": "CVE-2023-0464",
"severity": "UNKNOWN"
},
{
"id": "CVE-2023-0465",
"severity": "MEDIUM"
},
{
"id": "CVE-2023-2650",
"severity": "MEDIUM"
},
{
"id": "CVE-2023-3446",
"severity": "UNKNOWN"
},
{
"id": "CVE-2023-3817",
"severity": "MEDIUM"
}
],
"last_scan": "2023-08-24T21:00:58.176344Z",
"upgrades": [
{
"type": "minor",
"image_tag": "3.18.4",
"last_scan": "2023-09-29T00:13:31.931497Z",
"fixed_vulnerabilities": [
{
"id": "CVE-2022-2097",
"severity": "MEDIUM",
"cvss": 5.3
},
{
"id": "CVE-2022-30065",
"severity": "HIGH",
"cvss": 7.8
},
{
"id": "CVE-2022-37434",
"severity": "CRITICAL",
"cvss": 9.8
},
{
"id": "CVE-2022-4304",
"severity": "MEDIUM",
"cvss": 5.9
},
{
"id": "CVE-2022-4450",
"severity": "HIGH",
"cvss": 7.5
},
{
"id": "CVE-2023-0215",
"severity": "HIGH",
"cvss": 7.5
},
{
"id": "CVE-2023-0286",
"severity": "HIGH",
"cvss": 7.4
},
{
"id": "CVE-2023-0464",
"severity": "UNKNOWN"
},
{
"id": "CVE-2023-0465",
"severity": "MEDIUM"
},
{
"id": "CVE-2023-2650",
"severity": "MEDIUM"
},
{
"id": "CVE-2023-3446",
"severity": "UNKNOWN"
},
{
"id": "CVE-2023-3817",
"severity": "MEDIUM"
}
]
},
{
"type": "patch",
"image_tag": "3.16.7",
"last_scan": "2023-08-07T22:13:31.226553Z",
"fixed_vulnerabilities": [
{
"id": "CVE-2022-2097",
"severity": "MEDIUM",
"cvss": 5.3
},
{
"id": "CVE-2022-30065",
"severity": "HIGH",
"cvss": 7.8
},
{
"id": "CVE-2022-37434",
"severity": "CRITICAL",
"cvss": 9.8
},
{
"id": "CVE-2022-4304",
"severity": "MEDIUM",
"cvss": 5.9
},
{
"id": "CVE-2022-4450",
"severity": "HIGH",
"cvss": 7.5
},
{
"id": "CVE-2023-0215",
"severity": "HIGH",
"cvss": 7.5
},
{
"id": "CVE-2023-0286",
"severity": "HIGH",
"cvss": 7.4
},
{
"id": "CVE-2023-0464",
"severity": "UNKNOWN"
},
{
"id": "CVE-2023-0465",
"severity": "MEDIUM"
},
{
"id": "CVE-2023-2650",
"severity": "MEDIUM"
},
{
"id": "CVE-2023-3446",
"severity": "UNKNOWN"
},
{
"id": "CVE-2023-3817",
"severity": "MEDIUM"
}
]
}
]
}
]
}

本文采用CC-BY-SA-3.0协议,转载请注明出处
Author: Sally