一、Docker產生背景以及歷史
衆所周知,Linux在早已存在LXC(Linux Container)的概念。LXC即系統默認利用namespace和cgroup實現的輕量級虛擬化機。LXC利用namespace實現類似於虛擬機的分隔,利用cgroup實現資源分配。現在流行的容器引擎有docker和rocket,其中出名的則爲docker。docker公司發展是有dotCloud公司內部項目演化而來。
可以理解,docker就是一款容器引擎,利用其相關的工具實現容器、鏡像的管理和應用。
由上圖可見,容器生態十分豐富,從最底層的物理硬件,到虛擬化的雲平臺,到操作系統,到容器引擎,到編排服務工具以及開發流等。完整的容器生態將給整個雲生態帶來各個層面的改變,更加快捷、高效、省心的運維等。
容器是一種輕量級的虛擬化技術,那麼與傳統虛擬機的區別呢?
由上圖可見,左圖虛擬機的Guest OS層和Hypervisor層在docker中被Docker Engine層所替代。虛擬機的Guest OS即爲虛擬機安裝的操作系統,它是一個完整操作系統內核;虛擬機的Hypervisor層可以簡單理解爲一個硬件虛擬化平臺,它在Host OS是以內核態的驅動存在的。
虛擬機實現資源隔離的方法是利用獨立的OS,並利用Hypervisor虛擬化CPU、內存、IO設備等實現的。例如,爲了虛擬CPU,Hypervisor會爲每個虛擬的CPU創建一個數據結構,模擬CPU的全部寄存器的值,在適當的時候跟蹤並修改這些值。需要指出的是在大多數情況下,虛擬機軟件代碼是直接跑在硬件上的,而不需要Hypervisor介入。只有在一些權限高的請求下,Guest OS需要運行內核態修改CPU的寄存器數據,Hypervisor會介入,修改並維護虛擬的CPU狀態。
由上可以對比虛擬機和容器的區別,那麼實際中性能對比如何,下表所示
特性 |
容器 |
虛擬機 |
啓動 |
秒級(1s) |
幾十秒級(18s) |
硬盤使用 |
一般爲MB(195MB) |
一般爲GB(41GB) |
性能 |
接近原生 |
弱於宿主 |
系統支持量 |
上千個 |
一般幾十個 |
由此可見,容器在某些領域有如下表所示的優勢。
優勢 |
---|
更高效的利用系統資源 |
更快速的啓動時間 |
一致的運行時環境 |
持續交付和部署 |
更輕鬆的遷移 |
更輕鬆的維護和擴展 |
二、Docker基本概念
容器是一個或多個進程及這些進程所能訪問的資源的集合。下圖可以形象的說明容器的分層的概念。
docker主要包含三個概念
1、鏡像
鏡像可以理解爲一個或多個應用組成的一個“虛擬機”模板。用戶可以直接利用此鏡像直接啓動虛擬機,不需要自己額外進行相關部署。例如,我希望部署一個gitlab環境,我可以直接從倉庫中將gitlab倉庫部署到本地即可實現之前複雜的部署過程。目前鏡像包括三大類:基礎鏡像(即OS層),應用鏡像(基礎鏡像上添加的應用,例如tomcat),場景應用鏡像(包含多個複雜的應用的鏡像)。
由上可見,鏡像有分層的概念。
最基礎的爲基礎鏡像,即運行時環境和基礎的OS環境,例如目前中標麒麟高級服務器操作系統的鏡像也存在共有的容器倉庫中;
其次爲上一層,即在OS層上部署一層新的應用,然後打成鏡像發佈,此時對外的則直接爲應用本身;
鏡像中上層對下層是隻讀權限,沒有修改權限,即如果你已經確定好基礎層,此時在第二層應用是希望修改,已經不可能了。這種屬性保證了鏡像的不可修改性,有利於保持特定環境,易於環境遷移。
2、容器
容器可以理解爲鏡像的一個實例,假如鏡像是一個結構體類型,容器則是其中某個臨時的實例對象。由此可見,容器是臨時的,其中內部的數據是隨着容器銷燬而消失的。
3、鏡像倉庫
鏡像倉庫則更容易理解,即爲存儲鏡像的一個倉庫。有已經公開的dockerhub,也可以自己創建自己的私有倉庫。有了倉庫後,我們則可以類似於git的方式獲取、上傳鏡像。
上面三個爲容器使用中最重要的三個概念,三個流程圖可以參考下圖所示
三、Docker的應用場景
1、微服務架構(現在回更多融合k8s一起)
2、雲化的應用
本文的主要目的就是了解docker入門知識,後續具體原理請參考後面相關博文。