Alpine?Distroless?Busybox?到底谁才是容器镜像的瑞士军刀?

2025-05-29 0 36

Alpine?Distroless?Busybox?到底谁才是容器镜像的瑞士军刀?

大多数情况下,我们构建容器镜像时选择的基础镜像无外乎是 busybox、alpine 和 google/distroless 这几种,这几个基础镜像在云原生的世界很吃香,被广泛应用于各个应用的容器化。

那么问题来了,为什么这几个基础镜像如此受欢迎呢?

我们先来看下这几个基础镜像的大小:

  1. →podmanimagels
  2. REPOSITORYTAGIMAGEIDCREATEDSIZE
  3. docker.io/library/alpinelatest14119a10abf46daysago5.87MB
  4. docker.io/library/busyboxlatest42b97d3c2ae913daysago1.46MB
  5. gcr.io/distroless/staticlateste0851a4aa13651yearsago3.06MB

可以看到这些镜像的体积都非常小,几乎可以忽略不计。

Busybox

先启动一个 Busybox 容器进去一探究竟:

Alpine?Distroless?Busybox?到底谁才是容器镜像的瑞士军刀?

这个镜像的大小只有 1.24MB,缺容纳了这么多 GNU 命令,麻雀虽小五脏俱全啊,这到底是怎么做到的?

事实上这一切都要归功于 Multi-Call binary。什么是 Multi-Call binary 呢?

顾名思义,Multi-Call binary 就是多重调用二进制文件,是一个用C语言编写的程序,它允许多次调用来执行二进制文件。它包含了很多函数,每个执行独特动作的函数都可以通过一个名字来调用,这个名字同时也是 Multi-Call binary 的一个符号链接。Multi-Call binary 最好的应用范例便是 Busybox。

Busybox 里面的函数可以通过两种方式来调用:

例如:

Alpine?Distroless?Busybox?到底谁才是容器镜像的瑞士军刀?

Busybox 容器

很明显,这些不是我们所熟知的 GNU 二进制文件,因为所有的二进制文件都具有相同的属性,比如大小、日期等。这些都不是独立的二进制文件,而是 Multi-Call binary 每个调用函数的别名。这个 Multi-Call binary 就叫 Busybox。

遗憾的是,这些 Busybox 命令并不完全等同于 GNU 命令,某些命令的某些参数是无法执行的,相当于阉割版。

Alpine

看完了 Busybox,我们再来看看 Alpine 是怎么做的。

Alpine?Distroless?Busybox?到底谁才是容器镜像的瑞士军刀?

巧了,Alpine 的二进制文件竟然是指向 busybox 二进制文件的,这就很明显了,Alpine 镜像的底层使用了 busybox 二进制文件。除此之外,Alpine 还包含了 apk 包管理器和一些额外的可执行文件,所以 Alpine 镜像的体积才会比 Busybox 大。

Distroless

Distroless 就不用说了,它来自 Google[1]。该镜像几乎就是空的,只包含应用程序及其运行时所需的依赖,不包含软件包管理器、shell 和其他 GNU 二进制文件,当然还包含一些时区配置和部分 ca-certificates。

Alpine?Distroless?Busybox?到底谁才是容器镜像的瑞士军刀?

可以看到这个镜像中既没有 shell 也没有 bash,为了一探究竟,可以先把镜像保存为 tar 包,然后把 rootfs 解压出来:

  1. →mkdirimage
  2. →tarxvfdistroless.tar.gz-Cimage/
  3. 16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar
  4. e0851a4aa13657fc8dcd01e0e5e08cb817123ccb82e2c604b34f9ec9c1755e3f.json
  5. 2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/layer.tar
  6. 2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/VERSION
  7. 2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/json
  8. manifest.json
  9. repositories
  10. →cdimage
  11. →ls-lh
  12. total3.0M
  13. -r–r–r–.1rootroot3.0MJan1197016679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar
  14. drwxr-xr-x.2rootroot50Sep317:422e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c
  15. -r–r–r–.1rootroot462Jan11970e0851a4aa13657fc8dcd01e0e5e08cb817123ccb82e2c604b34f9ec9c1755e3f.json
  16. -r–r–r–.1rootroot213Jan11970manifest.json
  17. -r–r–r–.1rootroot106Jan11970repositories
  18. →mkdirrootfs
  19. →tarxf16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar-Crootfs
  20. →treerootfs
  21. rootfs
  22. ├──bin
  23. ├──boot
  24. ├──dev
  25. ├──etc
  26. │├──debian_version
  27. │├──default
  28. │├──dpkg
  29. ││└──origins
  30. ││└──debian
  31. │├──group
  32. │├──host.conf
  33. │├──issue
  34. │├──issue.net
  35. │├──nsswitch.conf
  36. │├──os-release
  37. │├──passwd
  38. │├──profile.d
  39. │├──protocols
  40. │├──rpc
  41. │├──services
  42. │├──skel
  43. │├──ssl
  44. ││└──certs
  45. ││└──ca-certificates.crt
  46. │└──update-motd.d
  47. │└──10-uname
  48. ├──home
  49. │└──nonroot
  50. ├──lib
  51. ├──proc
  52. ├──root
  53. ├──run
  54. ├──sbin
  55. ├──sys
  56. ├──tmp
  57. ├──usr
  58. │├──bin
  59. │├──games
  60. │├──include
  61. │├──lib
  62. ││└──os-release
  63. │├──sbin
  64. ││└──tzconfig
  65. │├──share
  66. ││├──base-files
  67. │││├──dot.bashrc
  68. │││├──dot.profile
  69. │││├──dot.profile.md5sums
  70. │││├──info.dir
  71. │││├──motd
  72. │││├──profile
  73. │││├──profile.md5sums
  74. │││└──staff-groupfor-usr-local

该镜像只有一层,大小为 3MB,也没有二进制文件,只有一些证书文件和目录。如果向下滚动,还能看到许可证和时区配置。看来 Distroless 采取的是非常极端的手段,直接把不需要的二进制文件全部抛弃了,只留下一个空镜像和部分必需品。

总结

由此看来,这几个基础镜像如此受欢迎的主要原因就是体积小。镜像越小,漏洞就越少,可攻击面也会大幅减少,而且很容易维护。所以大家构建镜像时尽量选择这些镜像作为基础镜像。

引用链接

[1]Google: https://github.com/GoogleContainerTools/distroless

原文链接:https://mp.weixin.qq.com/s/qAlYQFCo7-BFRzsVeRgXpg

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Alpine?Distroless?Busybox?到底谁才是容器镜像的瑞士军刀? https://www.kuaiidc.com/93027.html

相关文章

发表评论
暂无评论