成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Alpine?Distroless?Busybox?到底誰才是容器鏡像的瑞士軍刀?

開發 前端
大多數情況下,我們構建容器鏡像時選擇的基礎鏡像無外乎是 busybox、alpine 和 google/distroless 這幾種,這幾個基礎鏡像在云原生的世界很吃香,被廣泛應用于各個應用的容器化。

[[421797]]

大多數情況下,我們構建容器鏡像時選擇的基礎鏡像無外乎是 busybox、alpine 和 google/distroless 這幾種,這幾個基礎鏡像在云原生的世界很吃香,被廣泛應用于各個應用的容器化。

那么問題來了,為什么這幾個基礎鏡像如此受歡迎呢?

我們先來看下這幾個基礎鏡像的大小:

  1. 🐳  → podman image ls  
  2. REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE 
  3. docker.io/library/alpine   latest      14119a10abf4  6 days ago    5.87 MB 
  4. docker.io/library/busybox  latest      42b97d3c2ae9  13 days ago   1.46 MB 
  5. 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

例如:

Busybox 容器

很明顯,這些不是我們所熟知的 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 解壓出來:

  1. 🐳  → mkdir image 
  2. 🐳  → tar xvf distroless.tar.gz -C image/ 
  3. 16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar 
  4. e0851a4aa13657fc8dcd01e0e5e08cb817123ccb82e2c604b34f9ec9c1755e3f.json 
  5. 2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/layer.tar 
  6. 2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/VERSION 
  7. 2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c/json 
  8. manifest.json 
  9. repositories 
  10.  
  11. 🐳  → cd image 
  12. 🐳  → ls -lh 
  13. total 3.0M 
  14. -r--r--r--. 1 root root 3.0M Jan  1  1970 16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar 
  15. drwxr-xr-x. 2 root root   50 Sep  3 17:42 2e18de03719583329b7fa8374130e57cc7cddf2b5a487fe4a4988622ca60575c 
  16. -r--r--r--. 1 root root  462 Jan  1  1970 e0851a4aa13657fc8dcd01e0e5e08cb817123ccb82e2c604b34f9ec9c1755e3f.json 
  17. -r--r--r--. 1 root root  213 Jan  1  1970 manifest.json 
  18. -r--r--r--. 1 root root  106 Jan  1  1970 repositories 
  19.  
  20. 🐳  → mkdir rootfs 
  21. 🐳  → tar xf 16679402dc206c982b5552ab8de7d898547100e5468be29d4f67d393c0eadfdb.tar -C rootfs 
  22.  
  23. 🐳  → tree rootfs 
  24. rootfs 
  25. ├── bin 
  26. ├── boot 
  27. ├── dev 
  28. ├── etc 
  29. │   ├── debian_version 
  30. │   ├── default 
  31. │   ├── dpkg 
  32. │   │   └── origins 
  33. │   │       └── debian 
  34. │   ├── group 
  35. │   ├── host.conf 
  36. │   ├── issue 
  37. │   ├── issue.net 
  38. │   ├── nsswitch.conf 
  39. │   ├── os-release 
  40. │   ├── passwd 
  41. │   ├── profile.d 
  42. │   ├── protocols 
  43. │   ├── rpc 
  44. │   ├── services 
  45. │   ├── skel 
  46. │   ├── ssl 
  47. │   │   └── certs 
  48. │   │       └── ca-certificates.crt 
  49. │   └── update-motd.d 
  50. │       └── 10-uname 
  51. ├── home 
  52. │   └── nonroot 
  53. ├── lib 
  54. ├── proc 
  55. ├── root 
  56. ├── run 
  57. ├── sbin 
  58. ├── sys 
  59. ├── tmp 
  60. ├── usr 
  61. │   ├── bin 
  62. │   ├── games 
  63. │   ├── include 
  64. │   ├── lib 
  65. │   │   └── os-release 
  66. │   ├── sbin 
  67. │   │   └── tzconfig 
  68. │   ├── share 
  69. │   │   ├── base-files 
  70. │   │   │   ├── dot.bashrc 
  71. │   │   │   ├── dot.profile 
  72. │   │   │   ├── dot.profile.md5sums 
  73. │   │   │   ├── info.dir 
  74. │   │   │   ├── motd 
  75. │   │   │   ├── profile 
  76. │   │   │   ├── profile.md5sums 
  77. │   │   │   └── staff-group-for-usr-local 
  78. ... 
  79. ... 

該鏡像只有一層,大小為 3MB,也沒有二進制文件,只有一些證書文件和目錄。如果向下滾動,還能看到許可證和時區配置。看來 Distroless 采取的是非常極端的手段,直接把不需要的二進制文件全部拋棄了,只留下一個空鏡像和部分必需品。

總結

由此看來,這幾個基礎鏡像如此受歡迎的主要原因就是體積小。鏡像越小,漏洞就越少,可攻擊面也會大幅減少,而且很容易維護。所以大家構建鏡像時盡量選擇這些鏡像作為基礎鏡像。

引用鏈接

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

 

責任編輯:武曉燕 來源: 云原生實驗室
相關推薦

2014-09-26 14:30:41

2010-12-01 12:31:23

NetCat掃描端口

2017-05-03 14:45:45

MySQL數據恢復

2013-06-08 10:36:47

Linux命令行

2009-07-21 14:16:18

Scalafor表達式

2020-07-02 09:21:40

Java 緩存開發

2013-04-11 10:51:27

2011-10-18 14:11:17

Web開發

2014-05-29 14:44:06

瑞士軍刀綜合征開發者

2022-02-15 10:15:13

Web網絡程序員

2019-06-24 09:57:39

網絡工具調試

2011-08-01 09:43:08

PhoneGap 1.PhoneGap

2023-04-27 07:06:09

Categraf夜鶯

2023-12-25 12:03:42

2021-12-28 09:55:40

UbuntuRescuezillaLinux

2015-09-28 09:46:31

ZooKeeper分布式系統瑞士軍刀

2019-06-27 17:00:09

nc命令 Linux

2017-04-21 09:42:18

4G5G物聯網

2020-11-07 16:30:27

Python開發程序員

2009-09-09 12:10:40

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费视频播放 | www.啪啪.com| 全部免费毛片在线播放网站 | 国产女人与拘做受免费视频 | 久久久91 | 欧美久久久久 | 久久亚洲精品国产精品紫薇 | 欧美8一10sex性hd | 99精品久久久久久 | 亚洲一区二区三区视频 | 亚洲欧美日韩系列 | 午夜免费视频 | 久久国产精品免费一区二区三区 | 欧美日韩国产一区二区三区 | 日韩综合 | 日日夜夜天天干 | 毛片免费观看 | 国产精品高 | 给我免费的视频在线观看 | 国产精品色综合 | 国产精品1区 | 国产精品成人一区 | 成人午夜视频在线观看 | 亚洲精品99999| 日本羞羞影院 | 久久国产精品免费 | 久久伊人亚洲 | 伊人二区 | 日本粉嫩一区二区三区视频 | 91久久久久久 | 久久精品一区二区三区四区 | 91久久久久久久久久久 | 亚洲一区二区久久 | 国户精品久久久久久久久久久不卡 | 91在线免费视频 | 欧美一a | 中文字幕不卡在线88 | 久久精品国产精品青草 | 国产乱码久久久 | 美女福利视频一区 | 国产精品免费观看 |