還在用Alpine做Docker鏡像?看看大牛怎么說
大家都喜歡Alpine的鏡像,因為它們很輕,攻擊面較小,但也許它們不再是最佳選擇?,F(xiàn)在又到了談?wù)揹istroless版鏡像的時候了。
在 SumUp我們經(jīng)常使用Kubernetes和Docker鏡像,所以我們一直在尋找基礎(chǔ)鏡像的最佳選擇。distroless鏡像并不是什么新東西,但由于某些原因,我覺得它們并沒有得到應(yīng)有的采納。
什么是distroless圖像?
我不得不說這不是什么新東西,我是說真的。它已經(jīng)存在很多年了,你可以在以下內(nèi)容中查看 GoogleContainerTools/distroless:
"distroless無發(fā)行版 "只包含你的應(yīng)用程序和它的運行時依賴。它們不包含軟件包管理器、外殼或任何其他你期望在標(biāo)準(zhǔn)Linux發(fā)行版中找到的程序。
這足以理解你的容器不會有任何東西,但你正在使用的東西。
我為什么要使用它們?
現(xiàn)在每個人都有一個CI和CD管道,但有時需要花費很長時間來構(gòu)建、推送和拉動鏡像。無發(fā)行版的鏡像更輕,這意味著拉動和推送更快。
distroless鏡像不一定會讓你的構(gòu)建步驟更快,但它們會改善拉取和推送的時間。Docker提供了一個最小當(dāng)你使用它作為鏡像的基礎(chǔ)時,它不會創(chuàng)建額外的層。更少的層等于更快的下載和上傳。
更快的管道意味著對開發(fā)人員的反饋更快,花費的CI時間更少,這在你使用像.NET這樣的工具時非常重要。
安全也是一個重要的問題,因為你應(yīng)該盡可能地減少你的攻擊面。如果你不打算使用像sudo或ping這樣的工具,你就不應(yīng)該在你的容器中設(shè)置這些工具。
如果你的代碼有漏洞,你就不太容易受到導(dǎo)致shell的RCE的影響,但RCE仍然在發(fā)生。
- 埃里克-杜蘭
應(yīng)始終避免使用幫助惡意行為者收集更多信息或執(zhí)行特權(quán)升級的工具。你應(yīng)該看一下 erickduran/docker-distroless-pocREADME。
不應(yīng)該使用distroless的場景
說什么時候使用distroless很容易,但什么時候不應(yīng)該使用它們?
如果你想在容器內(nèi)調(diào)試你的應(yīng)用程序,你可以從shell和其他一些安裝的工具中獲益,但distroless沒有這些工具。顯而易見的答案是使用正常的鏡像進行開發(fā),而將無發(fā)行版保留給生產(chǎn)。
在開發(fā)中使用不同的圖像使開發(fā)人員遠(yuǎn)離真實的生產(chǎn)環(huán)境,這并不理想,但在你的CI管道中創(chuàng)建測試步驟,使用與生產(chǎn)中相同的環(huán)境,應(yīng)該可以解決這個問題。對這種權(quán)衡要小心。
那就舉個例子吧?
儲存庫 GoogleContainerTools/distroless有一個關(guān)于如何為Golang工具制作無發(fā)行版distroless鏡像的例子。
這是一個簡單易行的例子,主要是因為Golang產(chǎn)生的二進制文件默認(rèn)沒有運行時的依賴性。
相反,讓我們假設(shè)我們需要創(chuàng)建一個distroless的鏡像來使用ping二進制,因為我們將在我們的一個服務(wù)中使用它來檢查一個主機是否正常。這意味著我們需要找到所有的運行時依賴項,但我將盡可能地保持簡單。
我在Ubuntu中運行了ldd命令,它向我們顯示了它的依賴性,所以我開發(fā)了以下Dockerfile。另外,請注意,并不是每個運行時的依賴都在ldd命令的輸出中,我不得不使用其他方法來發(fā)現(xiàn)它們。
然而,這并不是最聰明的解決方案。上面的Docker文件創(chuàng)建了一個5.44MB的鏡像,我們可以通過使用Alpine而不是Ubuntu來改進它。如果你在Alpine環(huán)境中運行同樣的ldd命令,你也會有更少更輕的依賴性。
它運行良好,只用了1.43MB,比Alpine圖像和我們在第一階段使用Ubuntu建立的鏡像少了約74%的空間。
總結(jié)
標(biāo)題說你應(yīng)該停止使用Alpine,但我想我向你表明,這只是在正確場合做正確選擇的問題。另外,alpine和 scratch將創(chuàng)造出令人驚奇的distroless。
問題是,為你的應(yīng)用程序建立distroless仍然是相當(dāng)手動的,并不像你希望的那樣有趣。由于它需要開發(fā)人員付出更大的努力,所以通常被拋在后面,而支持著名的Alpine鏡像。
我認(rèn)為我們的想法是在生產(chǎn)環(huán)境中以及在進行手動和自動測試時使用distroless。你不想讓開發(fā)人員在調(diào)試應(yīng)用程序時承受更大的壓力。
我希望社區(qū)給予distroless應(yīng)有的關(guān)注,這將導(dǎo)致更多的改進,比如盡可能地自動創(chuàng)建鏡像。