一钦奋、Docker簡介
什么是容器 窥淆?
- 一種虛擬化的方案
- 操作系統(tǒng)級別的虛擬化
- 只能運行相同或相似的內(nèi)核操作系統(tǒng)
- 依賴于Linux內(nèi)核特性:Namespace和Cgroups(Control Group)
容器技術有哪些優(yōu)點 放吩?
從圖中我們很容器看出,容器技術資源占用比較少赞别,由于虛擬機需要模擬硬件的行為滤馍,對CUP和內(nèi)存的損耗比較大岛琼。所以同樣配置的服務器,容器技術就有以下優(yōu)點:
- 資源占用比較少
- CPU/內(nèi)存消耗低
那既然容器有這些優(yōu)點巢株,為什么直到Docker的出現(xiàn)槐瑞,才真正的被關注呢?一個重要原因就是容器技術的復雜性阁苞。容器本身就很復雜困檩,他依賴于Linux內(nèi)核的很多特性,而且他不易安裝那槽,也不易于管理和實現(xiàn)自動化悼沿。而Docker就是為了改變這一切而產(chǎn)生的。
什么是Docker 骚灸?
- 將應用自動部署到容器的開源引擎
- Go語言實現(xiàn)的開源項目显沈,誕生于2013年初,最初發(fā)起者是dotCloud公司
Docker的特點
- 提供簡單輕量的建模方式:簡單逢唤,Docker非常容器上手拉讯,用戶只需要幾分鐘,就能把自己的項目Docker化鳖藕。
- 職責的邏輯分離:使用Docker魔慷,開發(fā)人員只需要關心容器中運行的程序,運維人員只需要關心如何管理容器著恩;Docker設計的目的就是加強開發(fā)人員寫代碼的環(huán)境與應用程序要部署的生成環(huán)境的一致性院尔。
- 快速高效的開發(fā)生命周期:Docker的目標之一是縮短代碼開發(fā)到測試到部署上線的運行周期,讓應用程序具備可移植性喉誊,在容器中開發(fā)邀摆,以容器的形式交付和分發(fā),這樣開發(fā)伍茄、測試栋盹、生產(chǎn),都使用相同的環(huán)境敷矫,這樣也就避免了額外的調(diào)試和部署上的開銷例获,這樣就能有效的縮短產(chǎn)品的上線周期汉额。
- 鼓勵使用面向服務的架構:Docker推薦單個容器只運行一個應用程序或者進程,這樣就形成了一個分布式的應用程序模型榨汤,在這種模式下應用程序或服務都可以表述為一系列內(nèi)部互聯(lián)的容器蠕搜,從而使分布式部署應用程序擴展或調(diào)試都變得非常簡單。這就像我們開發(fā)中常用的思想收壕;高內(nèi)聚妓灌,低耦合,單一任務蜜宪。這樣就能避免在同一服務器上部署不同服務時虫埂,可能帶來的服務之間相互影響。這樣服務運行中出現(xiàn)問題時端壳,也比較容易定位問題的所在告丢。
Docker的使用場景
- 使用Docker容器開發(fā)、測試损谦、部署服務:因為Docker本身非常輕量化岖免,所以本地開發(fā)人員可以構建、運行并分享Docker容器照捡。容器可以在開發(fā)環(huán)境中創(chuàng)建颅湘,然后再提交到測試,最終進入生產(chǎn)環(huán)境栗精。
- 創(chuàng)建隔離的運行環(huán)境:在很多企業(yè)應用中闯参,同一服務的不同版本可能服務于不同的用戶,那么使用Docker非常容易創(chuàng)建不同的生成環(huán)境來運行不同的服務悲立。
- 搭建測試環(huán)境:由于Docker的輕量化鹿寨,所以開發(fā)者很容易利用Docker在本地搭建測試環(huán)境,用來測試程序在不用系統(tǒng)下的兼容性薪夕;甚至搭建集群的部署測試脚草。
- 構建多用戶的平臺即服務(PaaS)基礎設施。
- 提供軟件即服務(SaaS)應用程序原献。
- 高性能馏慨、超大規(guī)模的宿主機部署。
二姑隅、Docker的基本組成
Docker 包含了一下幾個重要主要部分:
- Docker Client 客戶端
- Docker Daemon 守護進程
- Docker Image 鏡像
- Docker Container 容器
- Docker Registry 倉庫
Docker 客戶端 / 守護進程
- Docker是C/S架構的程序:Docker客戶端向Docker服務器端写隶,也就是Docker的守護進程發(fā)出請求,守護進程處理完所有的請求工作并返回結果讲仰。
- Docker 客戶端對服務器端的訪問既可以是本地也可以通過遠程來訪問慕趴。
Docker Image 鏡像
- 鏡像是Docker容器的基石,容器基于鏡像啟動和運行。鏡像就好比容器的源代碼秩贰,保存了用于啟動容器的各種條件霹俺。
- Docker鏡像是一個層疊的只讀文件系統(tǒng)柔吼。
- Docker鏡像使用聯(lián)合加載技術
docker的鏡像是一個層疊的只讀文件系統(tǒng)毒费,最低端是一個引導文件系統(tǒng)(即bootfs),第二層是root文件系統(tǒng)(即rootfs)愈魏,它位于bootfs之上觅玻,可以是一種或多種操作系統(tǒng),比如ubuntu或者centos培漏。在docker中溪厘,root文件系統(tǒng)永遠只能是只讀狀態(tài),并且docker運用聯(lián)合加載技術又會在root文件系統(tǒng)之上加載更多的只讀文件系統(tǒng)牌柄,聯(lián)合加載指的是一次加載多個文件系統(tǒng)畸悬,但是在外面看起來只能看到一個文件系統(tǒng),聯(lián)合加載會將各層文件系統(tǒng)疊加到一起珊佣,這樣最終的文件系統(tǒng)會包含所有的底層文件和目錄蹋宦,docker將這樣的文件系統(tǒng)稱為鏡像。
Docker Container 容器
- 容器通過鏡像來啟動咒锻,Docker的容器是Docker的執(zhí)行來源冷冗,容器中可以運行客戶的一個或多個進程,如果說鏡像是Docker聲明周期中的構建和打包階段惑艇,那么容器則是啟動和執(zhí)行階段蒿辙。
當一個容器啟動時,docker會在該鏡像的最頂層加載一個讀寫文件系統(tǒng)滨巴,也就是一個可寫的文件層思灌,我們在docker運行的程序,就是在這個層中進行執(zhí)行的恭取,當docker第一次啟動一個容器時泰偿,初始的讀寫層是空的,當文件系統(tǒng)發(fā)生變化時秽荤,這些變化都會應用到這一層上甜奄,比如像修改一個文件,該文件首先會從讀寫層下面的只讀層復制到該讀寫層窃款,該文件的只讀版本依然存在课兄,但是已經(jīng)被讀寫層中的該文件副本所隱藏,這就是docker的一個重要技術:寫時復制(copy on write)晨继。每個只讀鏡像層都是只讀的烟阐,永遠不會變化,當創(chuàng)建一個新容器時,docker會構建出一個鏡像棧蜒茄,如下圖所示:
Docker Registry 倉庫
- docker用倉庫來保存用戶構建的鏡像唉擂,倉庫分為公有和私有兩種,Docker公司提供了一個公有的倉庫Docker Hub。
三檀葛、Docker 依賴的 Linux內(nèi)核特性
Docker依賴于Linux內(nèi)核的兩個重要特性:
- Namespaces 命名空間
- Control groups (cgroups) 控制組
Namespaces 命名空間
很多編程語言都包含了“命名空間”的概念玩祟,我們可以認為“命名空間”是一種“封裝”的概念, 而“封裝”本身實際上實現(xiàn)的是代碼的隔離屿聋。而在操作系統(tǒng)中空扎,命名空間提供的是系統(tǒng)資源的隔離,而系統(tǒng)資源包括了進程润讥、網(wǎng)絡转锈、文件系統(tǒng)等。
我們從Docker公開的文檔來看楚殿,它使用了5種命名空間:
- PID(Process ID) 進程隔離
- NET(Network)管理網(wǎng)絡接口
- IPC(InterProcess Communication)管理跨進程通信的訪問
- MNT(Mount)管理掛載點
- UTS(Unix Timesharing System) 隔離內(nèi)核和版本標識
那么撮慨,這些隔離的資源,是如何被管理起來的呢脆粥?這就需要用到——Control groups(cgroup)控制組了砌溺。
Control groups (cgroups) 控制組
Control groups是Linux內(nèi)核提供的,一種可以限制冠绢、記錄抚吠、隔離進程組所使用的物理資源的機制。
最初是由google工程師提出弟胀,并且在2007年時被Linux的內(nèi)核的2.6.24版本引進楷力。可以說孵户,Control groups就是為容器而生的萧朝,沒有Control groups就沒有容器技術的今天。
Control groups提供了以下功能:
資源限制:例如夏哭,memory(內(nèi)存)子系統(tǒng)可以為進程組設定一個內(nèi)存使用的上限检柬,一旦進程組使用的內(nèi)存達到了限額,該進程組再發(fā)出內(nèi)存申請時竖配,就會發(fā)出“out of memory”(內(nèi)存溢出)的警告何址。
優(yōu)先級設定:它可以設定哪些進程組可以使用更大的CPU或者磁盤IO的資源。
資源計量:它可以計算進程組使用了多少系統(tǒng)資源进胯。尤其是在計費系統(tǒng)中用爪,這一點十分重要。
資源控制:它可以將進程組掛起或恢復胁镐。
Namespace 和 cgroup帶給Docker的能力
到這里我們了解了Namespace和CGroup的概念和職能偎血,而這兩個特性帶給了Docker哪些能力呢诸衔?如下:
文件系統(tǒng)隔離:首先是文件系統(tǒng)的隔離,每個Docker的容器颇玷,都可以擁有自己的root文件系統(tǒng)笨农。
進程隔離:每個容器都運行在自己的進程環(huán)境中。
網(wǎng)絡隔離:容器間的虛擬網(wǎng)絡接口和IP地址都是分開的帖渠。
資源的隔離和分組:使用cgroups將cpu和內(nèi)存之類的資源獨立分配給每個Docker容器谒亦。