Docker入門 總結

Docker 是什麼?

我們在理解 Docker 之前,首先得先區分清楚兩個概念,容器和虛擬機。

可能很多讀者朋友都用過虛擬機,而對容器這個概念比較的陌生。我們用的傳統虛擬機如 VMware , VisualBox 之類的需要模擬整臺機器包括硬件。

每臺虛擬機都需要有自己的操作系統,虛擬機一旦被開啓,預分配給它的資源將全部被佔用。

每一臺虛擬機包括應用,必要的二進制和庫,以及一個完整的用戶操作系統。

而容器技術是和我們的宿主機共享硬件資源及操作系統,可以實現資源的動態分配。

容器包含應用和其所有的依賴包,但是與其他容器共享內核。容器在宿主機操作系統中,在用戶空間以分離的進程運行。

容器技術是實現操作系統虛擬化的一種途徑,可以讓您在資源受到隔離的進程中運行應用程序及其依賴關係。

通過使用容器,我們可以輕鬆打包應用程序的代碼、配置和依賴關係,將其變成容易使用的構建塊,從而實現環境一致性、運營效率、開發人員生產力和版本控制等諸多目標。

容器可以幫助保證應用程序快速、可靠、一致地部署,其間不受部署環境的影響。

容器還賦予我們對資源更多的精細化控制能力,讓我們的基礎設施效率更高。

通過下面這幅圖,我們可以很直觀的反映出這兩者的區別所在:

Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。

而 Linux 容器是 Linux 發展出的另一種虛擬化技術,簡單來講, Linux 容器不是模擬一個完整的操作系統,而是對進程進行隔離,相當於是在正常進程的外面套了一個保護層。

對於容器裏面的進程來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。

Docker 將應用程序與該程序的依賴,打包在一個文件裏面。運行這個文件,就會生成一個虛擬容器。

程序在這個虛擬容器裏運行,就好像在真實的物理機上運行一樣。有了 Docker ,就不用擔心環境問題。

總體來說,Docker 的接口相當簡單,用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的代碼一樣。

 

Docker 的優勢

Docker 相比於傳統虛擬化方式具有更多的優勢:

Docker 啓動快速屬於秒級別。虛擬機通常需要幾分鐘去啓動。
Docker 需要的資源更少。Docker 在操作系統級別進行虛擬化,Docker 容器和內核交互,幾乎沒有性能損耗,性能優於通過 Hypervisor 層與內核層的虛擬化。
Docker 更輕量。Docker 的架構可以共用一個內核與共享應用程序庫,所佔內存極小。同樣的硬件環境,Docker 運行的鏡像數遠多於虛擬機數量,對系統的利用率非常高。
與虛擬機相比,Docker 隔離性更弱。Docker 屬於進程之間的隔離,虛擬機可實現系統級別隔離。
安全性。Docker 的安全性也更弱,Docker 的租戶 Root 和宿主機 Root 等同,一旦容器內的用戶從普通用戶權限提升爲 Root 權限,它就直接具備了宿主機的 Root 權限,進而可進行無限制的操作。
虛擬機租戶 Root 權限和宿主機的 Root 虛擬機權限是分離的,並且虛擬機利用如 Intel 的 VT-d 和 VT-x 的 ring-1 硬件隔離技術。

這種隔離技術可以防止虛擬機突破和彼此交互,而容器至今還沒有任何形式的硬件隔離,這使得容器容易受到攻擊。

可管理性。Docker 的集中化管理工具還不算成熟。各種虛擬化技術都有成熟的管理工具,例如 VMware vCenter 提供完備的虛擬機管理能力。
高可用和可恢復性。Docker 對業務的高可用支持是通過快速重新部署實現的。
虛擬化具備負載均衡,高可用,容錯,遷移和數據保護等經過生產實踐檢驗的成熟保障機制, VMware 可承諾虛擬機 99.999% 高可用,保證業務連續性。
快速創建、刪除。虛擬化創建是分鐘級別的,Docker 容器創建是秒級別的,Docker 的快速迭代性,決定了無論是開發、測試、部署都可以節約大量時間
交付、部署。虛擬機可以通過鏡像實現環境交付的一致性,但鏡像分發無法體系化。Docker 在 Dockerfile 中記錄了容器構建過程,可在集羣中實現快速分發和快速部署。
我們可以從下面這張表格很清楚地看到容器相比於傳統虛擬機的特性的優勢所在:

Docker 的三個基本概念

從上圖我們可以看到,Docker 中包括三個基本的概念:
 

  1. Image(鏡像)
  2. Container(容器)
  3. Repository(倉庫)

鏡像是 Docker 運行容器的前提,倉庫是存放鏡像的場所,可見鏡像更是 Docker 的核心。

Image(鏡像)

那麼鏡像到底是什麼呢?Docker 鏡像可以看作是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。

鏡像不包含任何動態數據,其內容在構建之後也不會被改變。鏡像(Image)就是一堆只讀層(read-only layer)的統一視角,也許這個定義有些難以理解,下面的這張圖能夠幫助讀者理解鏡像的定義:

 

 從左邊我們看到了多個只讀層,它們重疊在一起。除了最下面一層,其他層都會有一個指針指向下一層。這些層是 Docker 內部的實現細節,並且能夠在主機的文件系統上訪問到。

統一文件系統(Union File System)技術能夠將不同的層整合成一個文件系統,爲這些層提供了一個統一的視角。
 

這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。我們可以在圖片的右邊看到這個視角的形式。


Container(容器)

容器(Container)的定義和鏡像(Image)幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。

由於容器的定義並沒有提及是否要運行容器,所以實際上,容器 = 鏡像 + 讀寫層。

 


Repository(倉庫)

Docker 倉庫是集中存放鏡像文件的場所。鏡像構建完成後,可以很容易的在當前宿主上運行。

但是, 如果需要在其他服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry(倉庫註冊服務器)就是這樣的服務。

有時候會把倉庫(Repository)和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。

Docker 倉庫的概念跟 Git 類似,註冊服務器可以理解爲 GitHub 這樣的託管服務。

實際上,一個 Docker Registry 中可以包含多個倉庫(Repository),每個倉庫可以包含多個標籤(Tag),每個標籤對應着一個鏡像。

所以說,鏡像倉庫是 Docker 用來集中存放鏡像文件的地方,類似於我們之前常用的代碼倉庫。

通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標籤就常用於對應該軟件的各個版本 。

我們可以通過<倉庫名>:<標籤>的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標籤,將以 Latest 作爲默認標籤。

倉庫又可以分爲兩種形式:

Public(公有倉庫)

Private(私有倉庫)

 

Docker Registry 公有倉庫是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。

一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。

除了使用公開服務外,用戶還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做爲私有 Registry 服務。

當用戶創建了自己的鏡像之後就可以使用 Push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 Pull 下來就可以了。

我們主要把 Docker 的一些常見概念如 Image,Container,Repository 做了詳細的闡述,也從傳統虛擬化方式的角度闡述了 Docker 的優勢。

我們從下圖可以直觀地看到 Docker 的架構:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章