一文了解Docker基本概念

一、何為Docker

Docker 是一個用於開發、交付和運行應用程式的開放平台,Docker 使您能夠將應用程式與基礎環境分開,以便您可以快速交付軟體。借用百度百科的話來說,Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux或Windows作業系統的機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。

對於開發者來說,開發人員可以利用docker開發和運行應用程式

對於運維人員來說,docker可以部署和管理應用程式。

 Docker和容器的關係就類似與VMware和虛擬機的關係,Docker類似於VMware,容器類似於虛擬機。

 

二、為什麼用Docker

有人會問,既然Docker以及容器分別與VMware和虛擬機類似,那麼為什麼還會用到Docker,他們之間有什麼差別?

1、通過上圖可以發現,每個虛擬機下,都要安裝一個作業系統,而容器是不需要的,它只需要軟體工作所需的庫資源和設置,他是直接運行在作業系統上面,一個作業系統之上可以有多個容器運行,容器不僅比虛擬機更輕量,更快速,還起到了與虛擬機差不多的功能,並且保證了在任何環境中的軟體能夠始終如一的運行。

2、藉助Docker,你可以像管理應用程式一樣管理基礎架構

3、藉助Docker可以實現程式的快速部署和分發,以及降低配置開發環境、生產環境複雜程度和成本。

4、更高效的利用系統資源 由於容器不需要進行硬體虛擬以及運行完整作業系統等額外開銷,Docker 對系統資源的利用 率更高。無論是應用執行速度、記憶體損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運行更多數量的應用。

5、更快速的啟動時間 傳統的虛擬機技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由於直接運行於宿主 內核,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。

 

三、Docker架構

 

Docker是一個客戶端-服務端(CS)應用程式

服務端:一個長時間運行的守護進程(Docker Daemon),Docker Daemon偵聽 Docker API 請求並管理 Docker 對象,例如鏡像、容器、網路和卷。

註:不過現在越來越多的功能早已從daemon中拆解出來並被模組化,感興趣的小夥伴可以去多多了解。

客戶端:命令行介面CLI,Docker 用戶與 Docker 交互的主要方式。

通訊:Docker 客戶端和守護進程使用 REST API、UNIX 套接字或網路介面進行通訊

 

四、Docker對象

鏡像:對於 Linux 而言,內核啟動後,會掛載 root 文件系統為其提供用戶空間支援。而 Docker 鏡像(Image),就相當於是一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包含

了完整的一套 Ubuntu 16.04 最小系統的 root 文件 系統。Docker鏡像(Image)是一個只讀模板,一個Docker的可執行文件,鏡像可以用來創建Docker容器,一個鏡像可以創建很多容

器。鏡像在構建之後其內容不可改變。

Docker鏡像由一層層layer組成,我們稱之為鏡像層,最後一層也是最上面的一層我們稱之為容器層

鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪

除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。

每一層都對應這DockerFile中的一條指令,通常最後一層為CMD層或者ENTRYPOINT層,這一層是R/W的,即容器層。

Docker鏡像採用這種分層機構最大的一個好處就是共享資源。

比如:有多個鏡像都從相同的base鏡像構建而來,那麼宿主機只需在磁碟上保存一份base鏡像,同時記憶體中也只需要載入一份base鏡像,就可以為所有容器服務了。而且鏡像的每一

層都可以被共享。

容器:Docker利用容器(Container)獨立運行的一個或一組應用。容器是鏡像創建的運行實例。

它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。

可以把容器看作是一個簡易版的Linux環境(包括root許可權、進程空間、用戶空間和網路空間等)和運行在其中的應用程式。

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

每一個容器運行時,是以鏡像為基礎層, 在其上創建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而準備的存儲層為容 器存儲層。 容器存儲層的生存周期和容器一

樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存 於容器存儲層的資訊都會隨容器刪除而丟失。

網路:外部或者容器間訪問的網路方式,如host模式,bridge模式

數據卷:容器與宿主機之間、容器與容器之間共享存儲方式,類似於虛擬機與主機之間的共享文件目錄。

Docker倉庫

倉庫(Repository)是集中存放鏡像文件的場所。

倉庫分為私有倉庫和公有倉庫兩種形式

DockerHub類似與github,不過前者是存放鏡像,後者是存放程式碼

 

五、Docker底層使用的技術

1、Docker使用go語言來實現的

2、Docker利用Linux內核的幾個特性來實現功能

2.1、利用linux的命名空間(NameSpaces)為Docker容器提供系統層面的隔離

  • 進程號隔離:每一個容器內運行的第一個進程,進程號總是從1開始;
  • 網路隔離:容器內的網路與宿主機或其他容器的網路是隔離的,分開的;
  • 進程隔離:容器中的進程與宿主機或其他容器中的進程是相互隔離的,通訊需要藉助網路;
  • 文件系統掛載隔離:容器擁有自己單獨的工作目錄;
  • 內核以及系統版本號隔離:容器查看內核版本號或系統版本號時,查看的是容器的,而非宿主機的。

2.2、利用linux控制組(Control Groups)為Docker提供硬體層面的隔離

  • 控制組能控制應用程式所使用的硬體資源;
  • 基於該性質,控制組幫助docker引擎將硬體資源共享給容器使用,並且加以約束和限制。如控制容器所使用的記憶體大小;
  • 控制組提供了很多有用的特性;以及確保各個容器可以公平地分享主機的記憶體、CPU、磁碟 IO 等 資源;
  • 控制組確保了當容器內的資源使用產生壓力時不會連累主機系統。

2.3、利用Linux的聯合文件系統(Union File Systems)利用分層(layer)思想管理鏡像和容器

  • 這也意味著Docker只能在Linux上運行之所以能夠在windows和Mac上運行Docker,其實本質上是藉助了虛擬化技術

2.4容器格式

  • 最初,Docker 採用了 LXC 中的容器格式。從 0.7 版本以後開始去除 LXC,轉而使用自行開發的 libcontainer,從 1.11 開始,則進一步演進為使用 runC 和 containerd。
Tags: