Docker就應該通俗易懂一些

一支彩筆發表於2018-08-24

寫在前面

為了避免浪費各位小夥伴的時間,這篇文章是我個人對Docker的理解和總結。也就是說並非涉及到Docker的實戰。所以如果想了解Docker在開發過程中的作用,可能這篇文章會讓你失望了~

這裡是Docker的官方網站,不過很可惜需要翻牆。

本文主要談一談這幾個點

  • 什麼是容器?
  • 容器與虛擬機器的比較
  • 什麼是Docker?
  • Docker能做什麼?

正文

什麼是容器?

按照Docker文件中的定義:將軟體打包成標準化單元,用於開發,裝運和部署。

Package Software into Standardized Units for Development, Shipment and Deployment

不知道這短短的一句話,小夥伴們是怎麼理解的。如果我們把視線定位到後面倆個詞:裝運部署。其實就相對好理解的多了。想要裝運,那肯定需要載體,就像我們的集裝箱。想要部署,就要有完整的環境,比如我們的Java,需要執行環境。

這倆個概念揉到一起:容器就是蘊涵程式及程式執行環境的合集。(打一個比喻:如果把我們正常的開發體系比作住宅的話;容器就像是房車。獨立且五臟俱全)。

傳統執行環境和容器的比喻

換個我們技術上的圖,來加深一下對容器的理解:

來自官網的圖片

我直接結合自己的理解,畫的圖...

Docker和容器的關係

容器與虛擬機器的比較

其實上述巴拉巴拉說了這麼多,又是裝運,又是部署。說白了不就是隔離而已麼?虛擬機器也可以做啊!

沒錯,其實Docker官方文件也認可了這個說法。並沒有否定:容器和虛擬機器具有類似的資源隔離和分配優勢。 Containers and virtual machines have similar resource isolation and allocation benefits

但是......官網祭出了它的殺器:

but function differently because containers virtualize the operating system instead of hardware. Containers are more portable and efficient.

說白了,容器的技術實現更騷:我不光能隔離;我還能小跑,還能小跳呢。你說氣人不~~

沿用上述的比喻,如果傳統的體系是別墅的話,容器還是房車的話。那麼虛擬機器就是多層的住宅區了~

Docker就應該通俗易懂一些

既然提到了虛擬機器,那麼就讓我們好好的聊一聊容器與虛擬機器的不同。其實從Docker官方的解釋就可以很清楚的看出倆者的不同:

容器:

容器是應用層的抽象,它將程式碼和依賴關係打包在一起。多個容器可以在同一臺機器上執行,並與其他容器共享作業系統核心,每個容器在使用者空間中作為獨立程式執行。容器佔用的空間比VM少(容器映像的大小通常為幾十MB),可以處理更多的應用程式,並且需要更少的VM和作業系統。

虛擬機器:

虛擬機器(VM)是物理硬體的抽象,將一臺伺服器轉變為多臺伺服器。虛擬機器管理程式允許多臺虛擬機器在一臺計算機上執行。每個VM都包含作業系統的完整副本,應用程式,必要的二進位制檔案和庫 - 佔用數十GB。虛擬機器也可能很慢啟動。

說白了,容器是基於作業系統實現的;而虛擬機器則是抽閒的計算機硬體。所以相對來說容器的級別更低一點。所以二者各有千秋,就像Docker官網所說:

在一起使用的容器和VM在部署和管理應用程式時提供了極大的靈活性。(Containers and VMs used together provide a great deal of flexibility in deploying and managing app)

什麼是Docker?

個人覺得上述的那張圖(Docker和容器的關係),可以比較清晰的展現出Docker是什麼~

當然,圖片能直觀的展示,不能具體的描述。接下來讓我們通過文字去進一步深化Docker的概念。

個人的理解:它二者不是包含關係。而是雜糅在一起的。我個人喜歡把“容器”理解成是一種概念,而Docker是“容器”這個概念下的一種實現方式(一整套解決方案。畢竟人家是一家商業公司,要賺錢噠~肯定是提供一整套服務)。

按照Docker官網的介紹(對外zhuangbi):

  • 輕量,在一臺機器上執行的多個Docker容器。可以共享這臺機器的作業系統核心;它們能夠迅速啟動,只需佔用很少的計算和記憶體資源。
  • 標準,Docker容器基於開放式標準,能夠在所有主流Linux版本、Microsoft Windows以及包括VM、裸機伺服器和雲在內的任何基礎設施上執行。
  • 安全,Docker賦予應用的隔離性不僅限於彼此隔離,還獨立於底層的基礎設施。Docker預設提供最強的隔離,因此應用出現問題,也只是單個容器的問題,而不會波及到整臺機器。

說白了,作為一個容器,Docker可以幫我們隔離軟體的執行環境。獨立的資料庫,獨立的軟體執行環境,獨立的伺服器程式。一切都是獨立的,搞崩一個,還有一個,可勁霍霍~

借用百度的一個圖:

Docker就應該通俗易懂一些

Docker能做什麼?

其實,有了上述那些內容,Docker能做什麼已經比較清晰了。借用Docker官網對外“吹牛”的圖:

Docker就應該通俗易懂一些

  • 一致的執行環境:作為開發人員,我們經常會甩鍋給執行環境。現在好了,Docker的映象提供了除核心外完整的執行時環境。這個鍋沒的甩了。
  • 更快速的啟動時間:Docker官方對外宣稱,可以做到秒級、甚至毫秒級的啟動時間。
  • 隔離性:這個就不用多說了...
  • 彈性伸縮,快速擴充套件:也不知道真的假的
  • 遷移方便:同JVM一個道理,可以很輕易的將在一個平臺上執行的應用,遷移到另一個平臺上。
  • 持續交付和部署:使用Docker可以通過定製應用映象來實現持續整合、持續交付、部署。

Docker能做這些內容主要依賴它的三個內容:映象(Docker Image)、容器(Docker Containers)、倉庫(Docker Registry)。

三個概念

映象(Docker Image)

映象是一個構建容器的只讀模板,它包含了容器啟動所需的所有資訊,包括執行程式和配置資料。

容器(Docker Containers)

開發環境真正執行的載體。

倉庫(Docker Registry)

存放映象的地方。

總結

個人理解,映象可以理解成類(Class),它擁有物件的抽象結構。而容器才是我們真正被new出來,能讓我們使用的物件。

更多內容,可以移步官方文件呦,需翻牆

尾聲

以上內容,是我工作以來自己對Docker的理解。如有不當之處,還望各位大佬能夠批評指正~

這裡是一個應屆生/初程式設計師公眾號~~歡迎圍觀

我是一個應屆生,最近和朋友們維護了一個公眾號,內容是我們在從應屆生過渡到開發這一路所踩過的坑,已經我們一步步學習的記錄,如果感興趣的朋友可以關注一下,一同加油~

個人公眾號:IT面試填坑小分隊

相關文章