大多数情况下,我们构建容器镜像时选择的基础镜像无外乎是 busybox
、alpine
和 google/distroless
这几种,这几个基础镜像在云原生的世界很吃香,被广泛应用于各个应用的容器化。
那么问题来了,为什么这几个基础镜像如此受欢迎呢?
我们先来看下这几个基础镜像的大小:
🐳 → podman image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/alpine latest 14119a10abf4 6 days ago 5.87 MB
docker.io/library/busybox latest 42b97d3c2ae9 13 days ago 1.46 MB
gcr.io/distroless/static latest e0851a4aa136 51 years ago 3.06 MB
可以看到这些镜像的体积都非常小,几乎可以忽略不计。
Busybox
先启动一个 Busybox 容器进去一探究竟:
这个镜像的大小只有 1.24MB
,缺容纳了这么多 GNU 命令,麻雀虽小五脏俱全啊,这到底是怎么做到的?
事实上这一切都要归功于 Multi-Call binary
。什么是 Multi-Call binary
呢?
顾名思义,Multi-Call binary 就是多重调用二进制文件,是一个用C语言编写的程序,它允许多次调用来执行二进制文件。它包含了很多函数,每个执行独特动作的函数都可以通过一个名字来调用,这个名字同时也是 Multi-Call binary 的一个符号链接。Multi-Call binary 最好的应用范例便是 Busybox。
Busybox 里面的函数可以通过两种方式来调用:
-
busybox ls
-
ls
例如:
很明显,这些不是我们所熟知的 GNU 二进制文件,因为所有的二进制文件都具有相同的属性,比如大小、日期等。这些都不是独立的二进制文件,而是 Multi-Call binary 每个调用函数的别名。这个 Multi-Call binary 就叫 Busybox
。
遗憾的是,这些 Busybox 命令并不完全等同于 GNU 命令,某些命令的某些参数是无法执行的,相当于阉割版。
Alpine
看完了 Busybox,我们再来看看 Alpine 是怎么做的。
巧了,Alpine 的二进制文件竟然是指向 busybox 二进制文件的,这就很明显了,Alpine 镜像的底层使用了 busybox 二进制文件。除此之外,Alpine 还包含了 apk
包管理器和一些额外的可执行文件,所以 Alpine 镜像的体积才会比 Busybox 大。
Distroless
Distroless
就不用说了,它来自 Google[1]。该镜像几乎就是空的,只包含应用程序及其运行时所需的依赖,不包含软件包管理器、shell 和其他 GNU 二进制文件,当然还包含一些时区配置和部分 ca-certificates。
可以看到这个镜像中既没有 shell
也没有 bash
,为了一探究竟,可以先把镜像保存为 tar 包,然后把 rootfs
解压出来:
🐳 → mkdir image
🐳 → tar xvf distroless.tar.gz -C image/
16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar
e0851a4aa13657fc8dcd01e0e5e08cb817123ccb82e2c604b34f9ec9c1755e3f.json
2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/layer.tar
2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/VERSION
2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/json
manifest.json
repositories
🐳 → cd image
🐳 → ls -lh
total 3.0M
-r–r–r–. 1 root root 3.0M Jan 1 1970 16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar
drwxr-xr-x. 2 root root 50 Sep 3 17:42 2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c
-r–r–r–. 1 root root 462 Jan 1 1970 e0851a4aa13657fc8dcd01e0e5e08cb817123ccb82e2c604b34f9ec9c1755e3f.json
-r–r–r–. 1 root root 213 Jan 1 1970 manifest.json
-r–r–r–. 1 root root 106 Jan 1 1970 repositories
🐳 → mkdir rootfs
🐳 → tar xf 16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar -C rootfs
🐳 → tree rootfs
rootfs
├── bin
├── boot
├── dev
├── etc
│ ├── debian_version
│ ├── default
│ ├── dpkg
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
如何快速更新自己的技术积累?
- 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
- 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
- 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
- 学习以后不知道有没有学成,则可以通过面试去检验。
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!**
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
[外链图片转存中…(img-pir7kj9J-1711130134565)]
[外链图片转存中…(img-EaOfQrEZ-1711130134565)]