如何調整Docker裡面的Image 大小?

danny_2018發表於2018-08-29

在過去幾年的發展過程中,Docker獲得業界的高度認可。因其能夠簡化部署,被廣泛應用於企業應用開發場景中。

Docker給開發者帶來的最直接好處是,可以打包他們的應用,將所有應用都捆綁在一個封套中,然後釋出到任何流行的Linux機器上。並且,Docker能實現虛擬化,各種應用之間不需要任何介面。也就是,我們常說的“開箱即用”,無需大量安裝或者配置相關的軟體、硬體等。

而Docker Image就是Docker 映象。Docker映象是一個只讀的模板。比如一個映象可以包含Ubuntu系統以及安裝在Ubuntu上的Apache Web伺服器和你自己的應用。映象是用來建立容器的。Docker提供了一個簡單的方式用以建立新的映象或者更新現存的映象,甚至你可以下載其他地方提供的映象。
由於Docker使用一個統一檔案系統,Docker映象其實就是一堆檔案的集合,並不是像VM那樣的是一個作業系統。映象可以簡單到只有一個程式檔案,比如如果你寫了一個簡單的hello world程式放到一個空的映象中,那麼整個映象的大小,就是你編譯後的二進位制檔案的大小。

Docker Image 小是很有好處的,可以不用不浪費自己的SSD空間,來處理數十億位元組的Docker資料。

有時候,因企業業務規模化發展,Docker Image 變得非常大。技術開發人員不得不想辦法,調整Image 大小。如何不斷最佳化應用,最終讓Image 大小減少到原來的一半?
第一步,Image 分層。使用Ubuntu作為基礎映象,搭建一個 Java執行環境。如果你有相關應用,還要整合第三方的結果檢查工具。比如:安裝Mono,透過NPM安裝 TSLint和 ESLint,以便於我們獲得更大的映象處理能力。

第二步,核查BUG。之前,Image 的大小為1GB大。然而,在一次常規的拉取中,技術人員希望下載的資料量與源資料大小大相同,因為基本Image (Ubuntu、Java、…)還要保持穩定。但我的控制檯顯示,出現了異樣:

貌似有資料被多次下載。因為這是最後一層,所以這些都是真正的分發檔案。檢查Dockerfile後發現,所有目錄都是經過編輯的。在傳統的部署設定中,安全的操作方式是,Docker必須新增一個新的映映象層,並且包含所有分發檔案以及所有權資訊。
在實際的Docker構建之前,透過調整所有權資訊,很容易擺脫chown呼叫,從而讓最終的Image 節省了300MB。

第三步,繼續刪減位元組。檔案產生的大小是670 MB,這只是開始,還有一定的刪減空間。當OpenJDK被用於Java執行時,它附帶了一些開發和GUI工具。把沒有用的OpenJRE替換掉,可以立即節省將近100 MB的記憶體。然後執行StyleCop,並從Mono中的 .NET PDB 檔案中閱讀資訊。Mono已經被安裝在mono-complete 包中,透過強依賴關係,例如透過一個完整的MonoDevelop,來實現更多兆位元組的刪減。不管是ESLint,還是TSLint,都只是在NodeJS執行時才能啟動。

最終,我們把所有應用分別新增到Docker Image中,影像大小由1GB減少到480MB。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31547898/viewspace-2213088/,如需轉載,請註明出處,否則將追究法律責任。

相關文章