最近一些天一直在折騰Docker的使用并且看了一些資料,抛開Docker的一些技術細節不說個人覺得這東西無論對個人開發者還是企業來說都是一個巨大的技術變革,值得個人開發者和企業注意到這個東西。這裡随便談談個人對Docker的一些設計思路的認識。
傳統我們對計算機系統的認知都是應用程式運作在作業系統上,系統的服務和資源對應用程式的運作提供支撐,這是我們最傳統的應用程式的運作模式。後來伺服器端和用戶端的環境越來越複雜,不少應用程式需要系統做各種的配置以适用應用程式的需求,這些針對應用程式的配置可以統稱為環境,就是說應用一定要運作在一定的環境中。而以往大量的問題就出現在這個環境問題中,不同的系統版本、不同的底層庫和依賴庫、不同的硬體、不同的配置檔案選項,此類問題過去一直在困擾着開發者和運維人員。不說伺服器環境的複雜,就說在用戶端的應用,不同的浏覽器的相容問題,IE6不知道消耗了多少開發人員的精力。過往也有不少的技術出來在一定程度上解決此類問題,服務端的技術和用戶端的技術都有,個人覺得這種問題在未來很長時間依舊會是個大問題,沒有完全解決但是會在一定程度上減輕。
Docker技術的出現在伺服器端可以說提供了一個前所未有的方案,可以解決非常多的環境問題而且對于性能的損失代價卻非常少。在談Docker之前先談一下虛拟機和作業系統,虛拟機的實作方式非常多樣但是核心思路就是在宿主作業系統上完全模拟cpu記憶體等硬體,在此之上完整運作另外一個作業系統,把程式完全運作在虛拟出來的作業系統中,這樣虛拟系統的映像包含了應用程式運作所需要的全部環境和依賴,這卻實是一個非常好的方案,但是這個方案最大的問題是資源的消耗實在太多了,cpu模拟指令速度不提,其中也有二進制翻譯和虛拟化等技術進行加速,但是很多庫的運作卻要在系統中反複加載到不同的記憶體中,這種方案在生産環境的浪費基本上不可承受。再談談作業系統的最基本原理,作業系統最基本的工作原理就是把硬體等各種資源管理起來,對上層提供一些規範的系統接口。這些接口實際上在不同的系統更新過程中變化很小,這是為了保持應用程式的二進制相容或是源代碼級别的相容性。我們的應用程式一般都是直接或是間接去調用系統的這一組接口去完成功能。現在思路轉變一下,我們的應用程式依賴的東西或是這些接口或是依賴這些接口的一些中間層,實際上把這些東西全部打包在一起,再去調用系統的接口我們的程式肯定是能正常運作的。就是說我們把系統除了實作了系統調用的核心部分的功能全部剝離出去之後打包,讓一個宿主系統提供全部這些服務。我們打包後的這個東西本身也會像是一個作業系統一定運作起來而且效率極高,因為這裡面沒有任何的中間層和模拟層,全部指令全是直接在主控端器上運作的并且調用宿主的系統調用。
Docker本身的設計就是基于此隔離特性設計的,具體技術細節此處不談,估計随着Linux與Docker之間的融合加深,Docker的特性還會得到不到的增強,目前Docker還是存在一些普遍的不靈活之處的問題的,不過在未來這些問題都可以解決。Docker官方提供了各種操作手冊,在使用Docker融入到自己的開發任務中時本着怎樣的思路和工作流呢?個人提供一點建議僅供參考。在使用中我把Docker看做是一個把應用打包的工具而不是把資料打包的工具,一個應用程式的完部功能基本由它本身的功能和輸入給它的資料和它輸出的資料決定,那麼我就把應用除了輸入和輸出的部分打包起來成為鏡像,在使用的時候把輸入和輸出都通過其它的方式配置進去,比如通過卷、變量、配置檔案的方式。這樣應用就被獨立打包起來,在所在要使用到的地方直接拉取運作就可以了,自己關心的隻是配置檔案和應用産生的資料之類的問題,這可以解決巨大的維護成本并節約時間。
個人認為以後Docker的設計思想就是把應用打包成為一個無狀态的函數,使用者隻需要關心函數的輸入和輸出就可以了,有各種服務商隻關心提供标準的函數運作環境。這樣大家各司其職,極大重塑軟體行業的開發和運維模式。