[ Docker ] 基礎概念

目錄
- 什麼是容器
- 虛擬化和容器技術
- docker 的基本概念java

1. 什麼是容器

容器英文:Container,容器是一種基礎工具;泛指任何能夠用於容納其餘物品的工具,能夠部分或者徹底封閉,被用於容納、儲存、運輸物品;物體能夠被放置在容器中,而容器則能夠保護內容物體。linux

好比,一般用的帶杯蓋的水杯,就是一個容器,它的用途是裝水,更確切的解釋就是將水約束起來,當蓋上杯蓋後,就算水杯裏的水翻江倒海,也不會溢出水杯外。這裏的水杯就是容器,而水則是程序的進程,容器就是將進程約束起來,就算進程異常或者被劫持也不會影響到系統中其餘進程的運行,這就是容器的做用。docker

 

2. 虛擬化和容器技術

經過上面定義的解釋,不難發現容器技術和虛擬化很相似。所以,你們常常將這二者作比較。tomcat

 

經過上圖,虛擬化技術中每一個虛擬機都會有一層GuestOS ,而在容器技術中,則是抽離了 GuestOS安全

 

迴歸到具體的應用中,當須要部署一個 java 程序時,服務器

 

傳統虛擬化的作法:網絡

  建立一臺虛擬機,安裝操做系統,而後部署 tomcat ,部署程序,啓動。架構

容器技術的作法:負載均衡

  拉取鏡像,關聯相關程序,啓動。工具

 能夠發現,容器簡化了程序的部署運行過程。那 容器 和 虛擬化 的具體區別是什麼呢,虛擬化是在底層模擬出各類硬件,CPU,硬盤之類的,而容器 是在軟件層面給資源分組。容器無限接近原生,由於容器用的就是主機系統的進程。

 

傳統的虛擬機如 VMware、KVM 之類的須要模擬整臺機器包括硬件,每臺虛擬機都須要有本身的操做系統,虛擬機一旦被開啓,預分配給它的資源將所有被佔用。每一臺虛擬機包括應用,必要的二進制和庫,以及一個完整的用戶操做系統。

而容器技術是和宿主機共享硬件資源及操做系統,能夠實現資源的動態分配。容器包含應用和其全部的依賴包,可是與其餘容器共享內核。容器在宿主機操做系統中,在用戶空間以分離的進程運行。

 

容器的隔離技術源自 Linux 容器 LXC(linux container),而LXC 又是基於 cgroup 的 namespace,chroot等。

cgroup 對於容器相當重要,cgroup 全稱爲 control group ,是 Linux 內核提供的功能,簡單來講,它的做用就是把系統運行的進程按用戶自定義的羣組區分,也就是說一個容器,就是一個group。

cgroup 有限制使用資源的能力:

 

 

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

Linux 容器是 Linux 發展出的另外一種虛擬化技術,Linux 容器不是模擬一個完整的操做系統,而是對進程進行隔離,至關因而在正常進程的外面套了一個保護層。對於容器裏面的進程來講,它接觸到的各類資源都是虛擬的,從而實現與底層系統的隔離。

 

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 中記錄了容器構建過程,可在集羣中實現快速分發和快速部署

 

從下面這張表格很清楚地看到容器相比於傳統虛擬機的特性的優點所在:

 

 

 

3. Docker 的基本概念

Docker 的三個基本概念

 

 

 

從上圖能夠看到,Docker 中包括三個基本的概念:

  • Image(鏡像)
  • Container(容器)
  • Repository(倉庫)

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

 

Image(鏡像)

Docker 鏡像能夠看做是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。

 

 

從左邊看到了多個只讀層,它們重疊在一塊兒。除了最下面一層,其它層都會有一個指針指向下一層。這些層是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 的架構:

 

 

Docker 使用 C/S 結構,即客戶端/服務器體系結構。 Docker 客戶端與 Docker 服務器進行交互,Docker服務端負責構建、運行和分發 Docker 鏡像。 Docker 客戶端和服務端能夠運行在一臺機器上,也能夠經過 RESTful 、 stock 或網絡接口與遠程 Docker 服務端進行通訊。

 

 

這張圖展現了 Docker 客戶端、服務端和 Docker 倉庫(即 Docker Hub 和 Docker Cloud ),默認狀況下Docker 會在 Docker 中央倉庫尋找鏡像文件,這種利用倉庫管理鏡像的設計理念相似於 Git ,固然這個倉庫是能夠經過修改配置來指定的,甚至能夠建立本身的私有倉庫。

相關文章
相關標籤/搜索