当前位置: 首页 > 科技观察

高山?无节制?忙箱?谁是容器镜像的瑞士军刀?

时间:2023-03-20 12:59:45 科技观察

大多数情况下,我们在构建容器镜像时选择的基础镜像无外乎busybox、alpine、google/distroless。这些基础镜像在云原生世界非常流行,广泛应用于各种应用程序容器化。那么问题来了,为什么这些基础图片会如此受欢迎呢?先来看看这些基础镜像的大小:🐳→podmanimagelsREPOSITORYTAGIMAGEIDCREATEDSIZEdocker.io/library/alpinelatest14119a10abf46daysago5.87MBdocker.io/library/busyboxlatest42b97d3c2ae913daysago1。46MBgcr.io/distroless/staticlateste0851a4aa13651yearsago3.06MB可以看出这些图片的体积很小,几乎可以忽略不计。Busybox首先启动了一个Busybox容器,发现:这个镜像的大小只有1.24MB,没有容纳这么多GNU命令的能力。麻雀虽小五脏俱全,它是怎么做到的呢?其实这一切都归功于Multi-Callbinary。什么是Multi-Call二进制文件?顾名思义,Multi-Callbinary就是多次调用的二进制文件,是用C语言编写的程序,允许多次调用来执行一个二进制文件。它包含许多功能,每个执行独特操作的功能都可以通过名称调用,这也是Multi-Call二进制文件的符号链接。Multi-Callbinary最好的应用例子是Busybox。Busybox内部的函数可以通过两种方式调用:busyboxlsls例如:Busyboxcontainer这些显然不是我们熟悉的GNU二进制文件,因为所有二进制文件都具有相同的属性,如大小、日期等。这些不是独立的二进制文件,但是Multi-Call二进制文件的每个调用函数的别名。这个Multi-Call二进制文件叫做Busybox。遗憾的是,这些Busybox命令并不完全等同于GNU命令,部分命令的部分参数无法执行,相当于阉割版。Alpine看完了Busybox,我们来看看Alpine是怎么做的。巧合的是,Alpine的二进制文件其实指向的是busybox的二进制文件,这是显而易见的,Alpine镜像底层使用的是busybox的二进制文件。此外,Alpine还包括apk包管理器和一些额外的可执行文件,因此Alpine镜像的大小比Busybox大。不用说,DistrolessDistroless来自Google[1]。镜像几乎是空的,只包含应用程序及其运行时依赖项,没有包管理器、shell和其他GNU二进制文件,当然还有一些时区配置和一些ca证书。您可以看到此图像中既没有shell也没有bash。Inordertofindout,youcanfirstsavetheimageasatarpackage,andthendecompresstherootfs:🐳→mkdirimage🐳→tarxvfdistroless.tar.gz-Cimage/16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tare0851a4aa13657fc8dcd01e0e5e08cb817123ccb82e2c604b34f9ec9c1755e3f.json2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/layer.tar2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/VERSION2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/jsonmanifest.jsonrepositories🐳→cdimage🐳→ls-lhtotal3.0M-r--r--r--.1rootroot3.0MJan1197016679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tardrwxr-xr-x.2rootroot50Sep317:422e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c-r--r--r--.1rootroot462Jan11970e0851a4aa13657fc8dcd01e0e5e08cb817123ccb82e2c604b34f9ec9c1755e3f.json-r--r--r--.1rootroot213Jan11970manifest.json-r--r--r--rapositProot19oriesProot197;rr;mkdirrootfs🐳→tarxf16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar-Crootfs🐳→treerootfsrootfs├──bin├──boot├──dev├──etc│├──debian_version│├──default│├──dpkg││└──起源││└──debian│├──group│├──host.conf│├──issue│├──issue.net│├──nsswitch.conf│├──os-release│├──passwd│├──profile.d│├──协议│├──rpc│├──服务│├──skel│├──ssl││└──certs││└──ca-证书。crt│└──update-motd.d│└──10-uname├──home│└──nonroot├──lib├──proc├──root├──run├──sbin├──sys├──tmp├──usr│├──bin│├──游戏│├──include│├──lib││└──os-release│├──sbin│└──tzconfig│├──share││├──base-files││├──dot.bashrc│││├──dot.profile││├──dot.profile.md5sums│││├──info.dir│││├──motd││├──profile││├──profile.md5sums│││└──staff-group-for-usr-local……该镜像只有一层,大小为3Mb,也没有,只只一些证书向下向下向下向下向下,还还如果如果看到看到许可证和和时区时区。时区配置。。看来。。配置。采取采取采取采取采取采取采取的的是是非常非常非常非常只留下镜像和部分必需品由此,这此总结此看来看来几个个基础基础基础如此镜像镜像如此如此受受欢迎欢迎欢迎的的的的的主要主要原因原因原因就就就就是是是是是体积体积体积小容易维护。所以大家构建镜像时尽量选择这些镜像作为基础镜像。参考链接[1]谷歌:https://github.com/GoogleContainerTools/distroless