小知识:Docker镜像构建原理解析(不装docker也能构建镜像)

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-猿站网-插图

在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image。

docker client 会先检查本地有没有image,如果没有帮你 从镜像仓库 pull 下来

然后解析你写的dockerfile构建新的image。

本文带你了解

pull 命令 背后是怎么做的?  build 命令 背后是怎么做的?

下篇文章带你解析:

如果我不用docker 我如何构建一个镜像?

我们以微软的aspnet2.2为基础构建一个aspnetcore项目的镜像为例子

mcr.microsoft.com/dotnet/core/aspnet:2.2

根据基础镜像REGISTRY去获取mainfest信息

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-1猿站网-插图

?
1
2
3
https://mcr.microsoft.com/v2/dotnet/core/aspnet/manifests/2.2
Accept:
application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.v2+json,application/vnd.docker.distribution.manifest.v1+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
{
“schemaVersion”: 2,
“mediaType”: “application/vnd.docker.distribution.manifest.v2+json”,
“config”: {
“mediaType”: “application/vnd.docker.container.image.v1+json”,
“size”: 4039,
“digest”: “sha256:e7e3b238011ce0f2b9350153535fe273caa01f0e7188d0b91f965b3802ddc600”
},
“layers”: [
{
“mediaType”: “application/vnd.docker.image.rootfs.diff.tar.gzip”,
“size”: 22524609,
“digest”: “sha256:804555ee037604c40de144f9f8da0d826d38db82f15d74cded32790fe279a8f6”
},
{
“mediaType”: “application/vnd.docker.image.rootfs.diff.tar.gzip”,
“size”: 17692725,
“digest”: “sha256:970251047358aea56ba6db6975b14ff12470b75de0c2477f4445240ddd727fd4”
},
{
“mediaType”: “application/vnd.docker.image.rootfs.diff.tar.gzip”,
“size”: 2978257,
“digest”: “sha256:f3d4c41a4fd13f35c0b46f19a4e27845f4695163cc7174d908ff84836bbc2f5a”
},
{
“mediaType”: “application/vnd.docker.image.rootfs.diff.tar.gzip”,
“size”: 62145592,
“digest”: “sha256:bd391c46585f9f8d84992bbaa9087189148c1601968eaaf097d5b3ed60840e5e”
}
]
}

mainfest文件里面都是摘要(digest)记录

config信息摘要 每个layer的摘要 (上面的例子有4个)

根据上面的config信息摘要获取config详情

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-2猿站网-插图

?
1
GET:https://mcr.microsoft.com/v2/dotnet/core/aspnet/blobs/sha256:e7e3b238011ce0f2b9350153535fe273caa01f0e7188d0b91f965b3802ddc600
?
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
{
“architecture”: “amd64”,
“config”: {
“Hostname”: “”,
“Domainname”: “”,
“User”: “”,
“AttachStdin”: false,
“AttachStdout”: false,
“AttachStderr”: false,
“Tty”: false,
“OpenStdin”: false,
“StdinOnce”: false,
“Env”: [
“PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”,
“ASPNETCORE_URLS=http://+:80”,
“DOTNET_RUNNING_IN_CONTAINER=true”,
“ASPNETCORE_VERSION=2.2.8”
],
“Cmd”: [
“bash”
],
“ArgsEscaped”: true,
“Image”: “sha256:5ecfe4016ac8e911a94aa601a675f7204e9ccab00cbb08e7067c184ad40f34e9”,
“Volumes”: null,
“WorkingDir”: “”,
“Entrypoint”: null,
“OnBuild”: null,
“Labels”: null
},
“container”: “14196c2f9c327d41e26682d32c7c89c4e7c78aa32f8b7501a23192035a9f4844”,
“container_config”: {
“Hostname”: “”,
“Domainname”: “”,
“User”: “”,
“AttachStdin”: false,
“AttachStdout”: false,
“AttachStderr”: false,
“Tty”: false,
“OpenStdin”: false,
“StdinOnce”: false,
“Env”: [
“PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”,
“ASPNETCORE_URLS=http://+:80”,
“DOTNET_RUNNING_IN_CONTAINER=true”,
“ASPNETCORE_VERSION=2.2.8”
],
“Cmd”: [
“/bin/sh”,
“-c”,
“curl -SL –output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNETCORE_VERSION/aspnetcore-runtime-$ASPNETCORE_VERSION-linux-x64.tar.gz   && aspnetcore_sha512=954072376698be69acb7e277df2c243f931e10529def21dcbf9ce277609b30d462126bf8b8b3cab36476bec3d63a927b8e44e59e4d4cade23eef45956fba1ffd   && echo \”$aspnetcore_sha512 aspnetcore.tar.gz\” | sha512sum -c –   && mkdir -p /usr/share/dotnet   && tar -zxf aspnetcore.tar.gz -C /usr/share/dotnet   && rm aspnetcore.tar.gz   && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet”
],
“Image”: “sha256:5ecfe4016ac8e911a94aa601a675f7204e9ccab00cbb08e7067c184ad40f34e9”,
“Volumes”: null,
“WorkingDir”: “”,
“Entrypoint”: null,
“OnBuild”: null,
“Labels”: null
},
“created”: “2019-12-28T08:12:05.676492579Z”,
“docker_version”: “3.0.8”,
“history”: [
{
“created”: “2019-12-28T04:23:47.4966447Z”,
“created_by”: “/bin/sh -c #(nop) ADD file:90a2c81769a336bed3f731f44a385f2a65b0916f517a0b77c06c224579bf9a9a in / “
},
{
“created”: “2019-12-28T04:23:47.719507596Z”,
“created_by”: “/bin/sh -c #(nop) CMD [\”bash\”]”,
“empty_layer”: true
},
{
“created”: “2019-12-28T08:11:05.607009582Z”,
“created_by”: “/bin/sh -c apt-get update   && apt-get install -y –no-install-recommends     ca-certificates         libc6     libgcc1     libgssapi-krb5-2     libicu57     liblttng-ust0     libssl1.0.2     libstdc++6     zlib1g   && rm -rf /var/lib/apt/lists/*”
},
{
“created”: “2019-12-28T08:11:07.64336022Z”,
“created_by”: “/bin/sh -c #(nop) ENV ASPNETCORE_URLS=http://+:80 DOTNET_RUNNING_IN_CONTAINER=true”,
“empty_layer”: true
},
{
“created”: “2019-12-28T08:11:16.475068844Z”,
“created_by”: “/bin/sh -c apt-get update   && apt-get install -y –no-install-recommends     curl   && rm -rf /var/lib/apt/lists/*”
},
{
“created”: “2019-12-28T08:11:43.814078508Z”,
“created_by”: “/bin/sh -c #(nop) ENV ASPNETCORE_VERSION=2.2.8”,
“empty_layer”: true
},
{
“created”: “2019-12-28T08:12:05.676492579Z”,
“created_by”: “/bin/sh -c curl -SL –output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNETCORE_VERSION/aspnetcore-runtime-$ASPNETCORE_VERSION-linux-x64.tar.gz   && aspnetcore_sha512=954072376698be69acb7e277df2c243f931e10529def21dcbf9ce277609b30d462126bf8b8b3cab36476bec3d63a927b8e44e59e4d4cade23eef45956fba1ffd   && echo \”$aspnetcore_sha512 aspnetcore.tar.gz\” | sha512sum -c –   && mkdir -p /usr/share/dotnet   && tar -zxf aspnetcore.tar.gz -C /usr/share/dotnet   && rm aspnetcore.tar.gz   && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet”
}
],
“os”: “linux”,
“rootfs”: {
“type”: “layers”,
“diff_ids”: [
“sha256:814c70fdae62bc26c603bfae861f00fb1c77fc0b1ee8d565717846f4df24ae5d”,
“sha256:0cf75cb98eb2e0a82631d4aff71b40ba79ff7f83e0361f696875e592a1a4cefc”,
“sha256:15e45d99c92686fb1fd61a41431d8400d7a0e8381595d09d666b0809c4f5d993”,
“sha256:579a8f1d6a123f98095c0b1a1395079f7504391fd2a8bc529dede305a2072a36”
]
}
}

根据diff_ids里面去下载对应layers

下载完后对比摘要一致,确保镜像文件合法性

路径规则:

https://mcr.microsoft.com/v2/dotnet/core/aspnet/blobs/sha256:XXXXXX

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-3猿站网-插图

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-4猿站网-插图

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-5猿站网-插图

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-6猿站网-插图

构建我们的镜像

在基础镜像的配置基础上加入我们的自定义配置

Entrypoint Cmd Ports Environment ImageWorkingDirectory Volumes Labels

在基础镜像的所有的layers把我们要打包到镜像也做成一个layer

生成的镜像tar包解压出来

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-7猿站网-插图

多了一个 tar.gz文件,解压之后 就是我们打包放进去的文件

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-8猿站网-插图

原来基础镜像有4个layer 加上我们的 共5个 config.json manifest.json

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-9猿站网-插图

config.json对比与基础镜像

%小知识:Docker镜像构建原理解析(不装docker也能构建镜像)-10猿站网-插图

我们来复习下构建镜像的过程 根据镜像名称拉取mainfest

根据mainfest拉取config 根据config拉取layers 下载各个layer 修改到基础镜像的配置(config.json和mainfest.json) 加入我们要加入的文件layer

知道原理后我们可以自己写一个工具来实现整个过程

我开源的docker镜像构建,让你不用装docker也能快速构建容器镜像

支持以下镜像仓库作为基础镜像构建

docker hub aliyun 腾讯云

到此这篇关于Docker镜像构建原理解析(不装docker也能构建镜像)的文章就介绍到这了,更多相关Docker镜像构建内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:http://www.cnblogs.com/yudongdong/p/14466223.html

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Docker的安装与配置命令代码实例

2023-3-24 13:08:00

建站知识

小知识:SEATA事务服务DOCKER部署的过程详解

2023-3-24 13:22:45

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索