最近公司在創建一個內部使用的小應用,嘗試使用了Docker這個已經被熱炒很久的Devops神器, 部署了Jenkins,應用和數據庫的服務,體會到了一處打包各處運行的便利。剛開始使用Docker, 有一種深深的感覺,它是一個輕量的虛擬機,再比較一番,它還是跟虛擬機有本質的區別。
Docker并不是輕量的虛擬機
因為Docker和虛擬機都為應用提供隔離的運行環境,并且由于Docker的易用性,很容易把它看成是輕量的虛擬機。但是它們在基礎架構上是完全不同的。
要說明這個,我找了一個例子。我們可以把虛擬機看成是獨棟別墅,作為別墅,它必須有自己的通風,供熱和電力系統等基礎設施,同時還有必須的臥室,客廳,洗手間和廚房等。如果覺得客廳房間不夠,那么你不能共享這些基礎設施,添加一個新的房間,而是要重新買一個房間足夠的別墅。相比而言,docker容器更像是高層住房中的公寓,它們共享整個建筑的基礎設施,可以在一棟住宅中擁有各種不同的戶型(運行各種不同鏡像的容器)。
從上面的比較中我們可以看到,它們雖然都是為應用提供獨立的運行環境,但是他們的構建理念是完全不同的,虛擬機是要在硬件上隔離出完整操作系統的方方面面,但是docker容器是共享操作系統基礎設施,并在docker主機上運行打包好運行環境的應用。所以docker并不是一個虛擬機技術,而是一個應用交付技術。在虛擬機的世界中,抽象的單位是一個包含應用代碼和依賴資源的虛擬機,它打包應用在物理主機上運行依賴的所有資源,生成一個可以在各種主機上運行的二進制產品。在Docker的世界中,抽象的單位是應用,更準確的說是一個服務,一般一個應用都是由多個服務組成。基于Docker容器,我們的應用能更容易的被拆分成細粒度的組件,這種技術會改變我們應用架構的方式。
Docker容器的備份
我們怎么備份Docker容器呢?其實我們并不需要備份容器。在使用Docker時,應用數據并不在保存在容器中,它存儲在位于運行docker的服務器上的命名卷(volume)中[一塊物理存儲空間], 卷可以在不同的容器間共享,我們只需要備份這些卷,并不需要備份容器。所以理想情況下,容器是無狀態并且不可修改的。如果我們想更新應用,需要做的是更新Docker鏡像,同時基于新的鏡像重新創建容器,創建容器只需要花幾秒鐘。
最后
通過以上面的比對,我們可以發現Docker和VM是針對解決不同問題而提出的技術,一個是打包應用運行環境在各種操作系統上運行,一個是打包了部署應用的整個操作系統,并運行在各種服務器上。他們不僅不是一個有你沒我的替代關系,而是互相結合可以發揮更大威力的組合。有了Docker,它將改變部署應用的方式,可以方便的配置出不同的運行環境,隨著配置應用運行環境的成本降低,我們可以將應用拆解成粒度更小的服務,改變我們設計系統的方式。