現(xiàn)代開發(fā)的最佳實踐,尤其是在實現(xiàn)微服務架構(gòu)時,無不涉及使用Docker、Kubernetes和其他容器技術。
容器正在改變企業(yè)部署和使用應用程序的方式。提高開發(fā)和交付效率、可移植性是吸引企業(yè)使用容器的重要原因。容器技術能夠允許開發(fā)者運行軟件而不用擔心操作系統(tǒng)或依賴項。因此,由于已經(jīng)內(nèi)置了相關配置和庫的正式環(huán)境,容器大大簡化了軟件架構(gòu)。
容器化兩大指標
乍一看,這似乎很簡單——我們將應用程序打包在一個容器中,運行它,然后就完成了。但事情并不會那么理想:應用程序的性能會出現(xiàn)下降,云基礎設施的成本也會增加。為了在不擴展云端占用內(nèi)存的情況下有效地構(gòu)建應用程序;需要了解與性能表現(xiàn)息息相關的容器的兩大重要指標:
- 容器內(nèi)存消耗;
- 容器鏡像的大小以及它與應用程序性能的關系。
為軟件應用程序選擇正確的架構(gòu)是產(chǎn)品開發(fā)中最關鍵的步驟之一。這個并不太容易掌握,尤其是微服務體系盛行的今天,難度更大。比較好的方案就是采用行業(yè)中的創(chuàng)新做法,這樣應用程序從現(xiàn)在開始幾年內(nèi)都會是安全的,不需要更換。從這個角度來看,對于應用容器化改造選型和部署過程而言,找到可用的最小微型容器是一個不錯的選擇。
微型容器VS大型容器:執(zhí)行效率更高?
隨著容器的普及、軟件結(jié)構(gòu)向微服務和云的發(fā)展,在持續(xù)交付的業(yè)務環(huán)境中,大型容器逐漸暴露出許多缺點。軟件行業(yè)努力通過優(yōu)化來減少大型容器的缺陷。從歷史上看,在做容器化的過程中,我們會采用原來運行應用程序的操作系統(tǒng)對應的容器。比如應用程序原來是運行在Centos上,那么我們會采用Centos的容器來構(gòu)建我們的應用程序鏡像。這種方法是正確的,因為它提供了安全的逐步遷移。該容器操作系統(tǒng)擁有作為一臺服務器運行所需的所有組件,但對于我們的應用程序來說其實已經(jīng)不再需要了。因此,容器化的下一步工作將是瘦身,將應用程序移植到微型容器。
微型容器是為提高效率而修改的優(yōu)化容器。它仍然包含為軟件應用程序提供更多縮放、隔離和奇偶校驗的所有文件。但是,它是一個改進的容器,鏡像中保留了優(yōu)化數(shù)量的文件。留在微型容器中的重要文件是shell、包管理器和標準C庫。
微容器與無發(fā)行的區(qū)別?
同時,在容器領域中存在“Distroless(無發(fā)行)”的概念,使用Distroless作為基礎鏡像是一種令人興奮的保護容器安全的方式。它僅包含應用程序及其運行時依賴項。Distroless鏡像會將所有未使用的文件提取出來。值得強調(diào)的是microcontainer和Distroless概念的區(qū)別。微型容器仍然包含未使用的文件,因為它們是系統(tǒng)保持完整所必需的。微型容器基于與常規(guī)容器相同的操作系統(tǒng)并實現(xiàn)了所有相同的功能,唯一的區(qū)別是其內(nèi)部文件已得到增強,并且由于開發(fā)人員所做的改進,其尺寸變得更小。微型容器包含優(yōu)化數(shù)量的文件,因此它仍然包含應用程序運行所需的所有文件和依賴項,但格式更輕更小。例如,對于BellSoft Alpaquita,微型容器只承載了啟動OpenJDK應用程序所需的所有文件和OpenJDK運行的標準工具。這個微型容器經(jīng)過了BellSoft團隊的巨大改進,它的小尺寸提供了比Alpine Linux更高級別的安全性??傊⑿腿萜鞯闹饕攸c體現(xiàn)在:
- 它的尺寸更?。?/span>
- 更高的分發(fā)、下載和擴展速度;
- 安全性。微容器的安全性相對于那些較大尺寸的容器有了很大提高。從鏡像中刪除不需要的額外文件有助于降低外部攻擊的可能性。
微容器選擇
如今在最小的容器中存在著相當多的基本鏡像。一個很好的例子是Debian Slim。Debian Slim是最流行的Linux發(fā)行版之一,起源于更大的Debian docker。另一個著名的微型容器是Alpine Linux。這兩個通用基礎鏡像仍然像大型容器一樣包含所有內(nèi)部組件,攜帶的文件大小也得到了改進,因而性能相對更好些。通用基礎鏡像盡管尺寸減小,但它們的行為方式與大型容器相同。Distroless鏡像則截然不同,它通常只攜帶應用程序及其運行時依賴項。Distroless鏡像被大大減少,并被認為是無包管理器的,另外它們的實際用途和操作也不同?;氐轿⑿腿萜?,它們可以更小,指標也可以進一步改進。例如BellSoft (OpenJDK 的主要貢獻者)使用 Alpine Linux 做到了這一點,并且發(fā)布了一個比Alpine 更小的新鏡像——Alpaquita Linux。它更輕更小,完全可以與 OpenJDK 配合使用。作為將 musl 上的端口集成到 OpenJDK 的作者,BellSoft 進一步利用了這一強大的特性并改進了Alpine Linux,在其基礎上創(chuàng)建了 Alpaquita Linux。Alpaquita Linux 除了更小的尺寸外,還將獲得保證及時更新和完全可用的OpenJDK 標準工具。
總結(jié)
綜上,微型容器對云原生應用程序有明顯優(yōu)勢。而大型容器則不同,價值點在于為市場提供更好的通用基礎鏡像解決方案。處于不同轉(zhuǎn)型階段的企業(yè)可以適當予以取舍和部署。
原文鏈接:
https://dzone.com/articles/how-microcontainers-gain-against-large-containers
譯者介紹
崔瑩峰,51CTO社區(qū)編輯,一名70后程序員,擁有10多年工作經(jīng)驗,長期從事 Java 開發(fā),架構(gòu)設計,容器化等相關工作。精通Java,熟練使用Maven、Jenkins等Devops相關工具鏈,擅長容器化方案規(guī)劃、設計和落地。