文章首發於微信公衆號《程序員果果》 地址:mp.weixin.qq.com/s/8VM-c_Ukx… 程序員
1、Docker簡介
什麼是容器 ?
一種虛擬化的方案
操做系統級別的虛擬化
只能運行相同或類似的內核操做系統
依賴於Linux內核特性:Namespace和Cgroups(Control Group)
容器技術有哪些優勢 ?
從圖中咱們很容器看出,容器技術資源佔用比較少,因爲虛擬機須要模擬硬件的行爲,對CUP和內存的損耗比較大。因此一樣配置的服務器,容器技術就有如下優勢:docker
那既然容器有這些優勢,爲何直到Docker的出現,才真正的被關注呢?一個重要緣由就是容器技術的複雜性。容器自己就很複雜,他依賴於Linux內核的不少特性,並且他不易安裝,也不易於管理和實現自動化。而Docker就是爲了改變這一切而產生的。編程
什麼是Docker ?
將應用自動部署到容器的開源引擎
Go語言實現的開源項目,誕生於2013年初,最初發起者是dotCloud公司
Docker的特色
提供簡單輕量的建模方式 :簡單,Docker很是容器上手,用戶只須要幾分鐘,就能把本身的項目Docker化。
職責的邏輯分離 :使用Docker,開發人員只須要關心容器中運行的程序,運維人員只須要關心如何管理容器;Docker設計的目的就是增強開發人員寫代碼的環境與應用程序要部署的生成環境的一致性。
快速高效的開發生命週期 :Docker的目標之一是縮短代碼開發到測試到部署上線的運行週期,讓應用程序具有可移植性,在容器中開發,以容器的形式交付和分發,這樣開發、測試、生產,都使用相同的環境,這樣也就避免了額外的調試和部署上的開銷,這樣就能有效的縮短產品的上線週期。
鼓勵使用面向服務的架構 :Docker推薦單個容器只運行一個應用程序或者進程,這樣就造成了一個分佈式的應用程序模型,在這種模式下應用程序或服務均可以表述爲一系列內部互聯的容器,從而使分佈式部署應用程序擴展或調試都變得很是簡單。這就像咱們開發中經常使用的思想;高內聚,低耦合,單一任務。這樣就能避免在同一服務器上部署不一樣服務時,可能帶來的服務之間相互影響。這樣服務運行中出現問題時,也比較容易定位問題的所在。
Docker的使用場景
使用Docker容器開發、測試、部署服務 :由於Docker自己很是輕量化,因此本地開發人員能夠構建、運行並分享Docker容器。容器能夠在開發環境中建立,而後再提交到測試,最終進入生產環境。
建立隔離的運行環境 :在不少企業應用中,同一服務的不一樣版本可能服務於不一樣的用戶,那麼使用Docker很是容易建立不一樣的生成環境來運行不一樣的服務。
搭建測試環境 :因爲Docker的輕量化,因此開發者很容易利用Docker在本地搭建測試環境,用來測試程序在不用系統下的兼容性;甚至搭建集羣的部署測試。
構建多用戶的平臺即服務(PaaS)基礎設施 。
提供軟件即服務(SaaS)應用程序 。
高性能、超大規模的宿主機部署 。
2、Docker的基本組成
Docker 包含了一下幾個重要主要部分:ubuntu
Docker Client 客戶端
Docker Daemon 守護進程
Docker Image 鏡像
Docker Container 容器
Docker Registry 倉庫
Docker 客戶端 / 守護進程
Docker是C/S架構的程序:Docker客戶端向Docker服務器端,也就是Docker的守護進程發出請求,守護進程處理完全部的請求工做並返回結果。
Docker 客戶端對服務器端的訪問既能夠是本地也能夠經過遠程來訪問。
Docker Image 鏡像
鏡像是Docker容器的基石,容器基於鏡像啓動和運行。鏡像就比如容器的源代碼,保存了用於啓動容器的各類條件。
Docker鏡像是一個層疊的只讀文件系統。
Docker鏡像使用聯合加載技術
docker的鏡像是一個層疊的只讀文件系統,最低端是一個引導文件系統(即bootfs),第二層是root文件系統(即rootfs),它位於bootfs之上,能夠是一種或多種操做系統,好比ubuntu或者centos。在docker中,root文件系統永遠只能是隻讀狀態,而且docker運用聯合加載技術又會在root文件系統之上加載更多的只讀文件系統,聯合加載指的是一次加載多個文件系統,可是在外面看起來只能看到一個文件系統,聯合加載會將各層文件系統疊加到一塊兒,這樣最終的文件系統會包含全部的底層文件和目錄,docker將這樣的文件系統稱爲鏡像。centos
Docker Container 容器
容器經過鏡像來啓動,Docker的容器是Docker的執行來源,容器中能夠運行客戶的一個或多個進程,若是說鏡像是Docker聲明週期中的構建和打包階段,那麼容器則是啓動和執行階段。
當一個容器啓動時,docker會在該鏡像的最頂層加載一個讀寫文件系統,也就是一個可寫的文件層,咱們在docker運行的程序,就是在這個層中進行執行的,當docker第一次啓動一個容器時,初始的讀寫層是空的,當文件系統發生變化時,這些變化都會應用到這一層上,好比像修改一個文件,該文件首先會從讀寫層下面的只讀層複製到該讀寫層,該文件的只讀版本依然存在,可是已經被讀寫層中的該文件副本所隱藏,這就是docker的一個重要技術:寫時複製(copy on write)。每一個只讀鏡像層都是隻讀的,永遠不會變化,當建立一個新容器時,docker會構建出一個鏡像棧,以下圖所示:服務器
Docker Registry 倉庫
docker用倉庫來保存用戶構建的鏡像,倉庫分爲公有和私有兩種,Docker公司提供了一個公有的倉庫Docker Hub。
3、Docker 依賴的 Linux內核特性
Docker依賴於Linux內核的兩個重要特性:微信
Namespaces 命名空間
Control groups (cgroups) 控制組
Namespaces 命名空間
不少編程語言都包含了「命名空間」的概念,咱們能夠認爲「命名空間」是一種「封裝」的概念, 而「封裝」自己實際上實現的是代碼的隔離。而在操做系統中,命名空間提供的是系統資源的隔離,而系統資源包括了進程、網絡、文件系統等。網絡
咱們從Docker公開的文檔來看,它使用了5種命名空間:架構
PID(Process ID) 進程隔離
NET(Network)管理網絡接口
IPC(InterProcess Communication)管理跨進程通訊的訪問
MNT(Mount)管理掛載點
UTS(Unix Timesharing System) 隔離內核和版本標識
那麼,這些隔離的資源,是如何被管理起來的呢?這就須要用到——Control groups(cgroup)控制組了。運維
Control groups (cgroups) 控制組
Control groups是Linux內核提供的,一種能夠限制、記錄、隔離進程組所使用的物理資源的機制。 最初是由google工程師提出,而且在2007年時被Linux的內核的2.6.24版本引進。能夠說,Control groups就是爲容器而生的,沒有Control groups就沒有容器技術的今天。
Control groups提供瞭如下功能:
資源限制 :例如,memory(內存)子系統能夠爲進程組設定一個內存使用的上限,一旦進程組使用的內存達到了限額,該進程組再發出內存申請時,就會發出「out of memory」(內存溢出)的警告。
優先級設定 :它能夠設定哪些進程組可使用更大的CPU或者磁盤IO的資源。
資源計量 :它能夠計算進程組使用了多少系統資源。尤爲是在計費系統中,這一點十分重要。
資源控制 :它能夠將進程組掛起或恢復。
Namespace 和 cgroup帶給Docker的能力
到這裏咱們瞭解了Namespace和CGroup的概念和職能,而這兩個特性帶給了Docker哪些能力呢?以下:
文件系統隔離 :首先是文件系統的隔離,每一個Docker的容器,均可以擁有本身的root文件系統。
進程隔離 :每一個容器都運行在本身的進程環境中。
網絡隔離 :容器間的虛擬網絡接口和IP地址都是分開的。
資源的隔離和分組 :使用cgroups將cpu和內存之類的資源獨立分配給每一個Docker容器。
歡迎掃碼或微信搜索公衆號《程序員果果》關注我,關注有驚喜~