今早〈從 Ansible 到 Docker:混血模式〉演講過後,有人在聊天室提問:

請問為什麼要追求最小化的 Docker image?

記得去年我在 Docker Taipei 社群主講〈追求極簡化 Docker image 之路〉的時候,曾如此開場:

部分原因是「純技術性的探討」。

經過這番探討,對 Docker 底層機制會掌握得更深刻,有助於更善用 Docker,也很自然會理解 Docker 與 VM 的明顯差別在哪裡。

這是極度保守的理由。因為在當時,「極簡化 Docker」的實施手法不方便,地雷又多,投入成本高於獲得的效益。因此,除非為了純技術性的探討(技術狂的浪漫?),否則似乎不太值得鼓吹。

一年後的今天,「極簡化 Docker」的實施手法已經更成熟了,我們也看到更多官方的 Docker image 也額外提供以 Alpine 為 base image 的選項。對於這議題,不再能單純用「技術者的狂熱」來看待。

一年後的今天,有更多好的理由。

我就在此簡答一下,追求極簡化 Docker image,除了技術性的狂熱之外,還有什麼實質上的好處?

  

其一、在某些受限的硬體資源(如:儲存空間、網路頻寬),不佳的軟體執行環境(如:layered file system 實作品質不佳),精簡的 image 是很有吸引力的。

  

其二、越大的 image,隱含的黑盒子越多,資安風險也越高。

口說無憑,請用 Peekr 針對幾個常見的 base image 做一番安全掃描:

看得出來哪一個的資安風險較大、哪一個較小了嗎?

  

其三、如果你用的是傳統世界的 host OS,而不是像 CoreOS、Rancher 這類所謂的 “container OS",那麼,base image 與 host OS 可能會有一大堆重複的東西,這也是一種浪費。

寶貴的 Docker image,應該只放與 app 直接相關的東西;為什麼還要塞一大堆和 host OS 重複、且和 app 沒有直接關係的東西呢?

  

簡單給三個思考的方向,供大家參考。