一、何為Docker
Docker 是一個用於開發、交付和執行應用程式的開放平臺,Docker 使您能夠將應用程式與基礎環境分開,以便您可以快速交付軟體。借用百度百科的話來說,Docker 是一個開源的
應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的
對於開發者來說,開發人員可以利用docker開發和執行應用程式
對於運維人員來說,docker可以部署和管理應用程式。
Docker和容器的關係就類似與VMware和虛擬機器的關係,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。