在云計(jì)算中,所謂的虛擬化技術(shù)一般可以分為虛擬機(jī)技術(shù)和容器技術(shù),虛擬機(jī)即為Virtual Machine,VM,容器即為Container。那么什么是Docker 虛擬化技術(shù)呢?我們一起來(lái)看一下:
Docker是一種輕量級(jí)的虛擬化技術(shù),相較于傳統(tǒng)虛擬機(jī),Docker容器是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng),而傳統(tǒng)方式則是在硬件的基礎(chǔ)上,虛擬出自己的系統(tǒng),再在系統(tǒng)上部署相關(guān)的APP應(yīng)用。同時(shí)是一個(gè)開源的應(yīng)用容器運(yùn)行環(huán)境搭建平臺(tái),可以讓開發(fā)者以便捷方式打包應(yīng)用到一個(gè)可移植的容器中,然后安裝至任何運(yùn)行Linux或Windows等系統(tǒng)的服務(wù)器上。
相較于傳統(tǒng)虛擬機(jī),Docker容器具有以下三大特點(diǎn):
1、輕量化:
一臺(tái)主機(jī)上運(yùn)行的多個(gè)Docker容器可以共享主機(jī)操作系統(tǒng)內(nèi)核;啟動(dòng)迅速,只需占用很少的計(jì)算和內(nèi)存資源。
2、標(biāo)準(zhǔn)開放:
Docker容器基于開放式標(biāo)準(zhǔn),能夠在所有主流Linux版本、Microsoft Windows以及包括VM、裸機(jī)服務(wù)器和云在內(nèi)的任何基礎(chǔ)設(shè)施上運(yùn)行。
3、安全可靠:
Docker賦予應(yīng)用的隔離性不僅限于彼此隔離,還獨(dú)立于底層的基礎(chǔ)設(shè)施。Docker默認(rèn)提供最強(qiáng)的隔離,因此應(yīng)用出現(xiàn)問(wèn)題,也只是單個(gè)容器的問(wèn)題,而不會(huì)波及到整臺(tái)主機(jī)。
讓我們通過(guò)回顧部署方式的過(guò)程,看看為什么容器如此有用。
一、應(yīng)用部署方式經(jīng)歷的各個(gè)階段
1. 傳統(tǒng)部署階段
早期,我們?cè)谖锢矸?wù)器上運(yùn)行應(yīng)用程序。沒(méi)有辦法為物理服務(wù)器中的應(yīng)用程序定義資源邊界,這導(dǎo)致了資源分配問(wèn)題。例如,如果在物理服務(wù)器上運(yùn)行多個(gè)應(yīng)用程序,則可能會(huì)出現(xiàn)一個(gè)應(yīng)用程序占用大部分資源的情況,從而導(dǎo)致其他應(yīng)用程序性能不佳。解決方案是在不同的物理服務(wù)器上運(yùn)行每個(gè)應(yīng)用程序。但由于資源未得到充分利用,這種方法無(wú)法擴(kuò)展,而且組織維護(hù)許多物理服務(wù)器的成本很高。
傳統(tǒng)模式部署最大的問(wèn)題是造成資源浪費(fèi)。
2. 虛擬化部署階段
在虛擬化技術(shù)被引入后,虛擬化技術(shù)允許我們?cè)趩蝹€(gè)物理服務(wù)器的 CPU 上運(yùn)行多個(gè)虛擬機(jī)(VM)。虛擬化允許應(yīng)用程序在虛擬機(jī)之間隔離,不僅避免了資源沖突而且還能提供一定程度的安全性,因?yàn)橐粋€(gè)應(yīng)用程序的信息不能被另一個(gè)應(yīng)用程序自由訪問(wèn)。
虛擬化允許我們更好地利用物理服務(wù)器中的資源,有更好的可伸縮性,因?yàn)榭梢暂p松地添加或更新應(yīng)用程序,降低硬件成本等等。通過(guò)虛擬化技術(shù),我們可以將一組物理資源表示為一次性虛擬機(jī)的集群。
每個(gè)VM都是在虛擬化硬件之上運(yùn)行所有組件(包括自己的操作系統(tǒng))的完整機(jī)器。
3、容器化部署階段
容器類似于 VM,但它們具有松散的隔離屬性,以便在應(yīng)用程序之間共享操作系統(tǒng)。容器的本質(zhì)是進(jìn)程(使用了 NameSpace 做隔離,Cgroups 做限制, rootfs 做文件系統(tǒng)的特殊進(jìn)程),因此,容器被認(rèn)為是比 VM 更加輕量級(jí)的。與虛擬機(jī)類似,容器有自己的文件系統(tǒng)、CPU共享、內(nèi)存、進(jìn)程空間等。由于它們與底層基礎(chǔ)設(shè)施分離,所以它們可以跨云和操作系統(tǒng)版本移植。
容器技術(shù)可以達(dá)到企業(yè)脫離云廠商的強(qiáng)制綁(綁)定(架)。
二、容器的作用有哪些?解決了現(xiàn)實(shí)中的哪些問(wèn)題
廣泛對(duì)容器歸納總結(jié)為:
1、容器是一種基于操作系統(tǒng)能力的隔離技術(shù)。
2、容器的本質(zhì)是一組收到資源限制,彼此之間相互隔離的過(guò)程。
容器共享宿主機(jī)的內(nèi)核,資源占用小,輕量化,對(duì)應(yīng)用有好。
3、Docker 是目前主流的容器化工具,Kubernetes(k8s) 是主流的容器編排管理工具。
4、Docker 是基于Linux 內(nèi)核的2項(xiàng)功能實(shí)現(xiàn)的:
Namespace:
我們知道 Linux 中的PID、IPC、網(wǎng)絡(luò)等資源是全局的,而 Namespace 機(jī)制是一種資源隔離方案,在該機(jī)制下這些資源就不再是全局的了,而是屬于某個(gè)特定的 NameSpace,各個(gè) Namespace 下的資源互不干擾,這就使得每個(gè) Namespace 看上去就像一個(gè)獨(dú)立的操作系統(tǒng)一樣,但是只有 Namespace 是不夠。
Control groups:
雖然有了 NameSpace 技術(shù)可以實(shí)現(xiàn)資源隔離,但進(jìn)程還是可以不受控的訪問(wèn)系統(tǒng)資源,比如 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等,為了控制容器中進(jìn)程對(duì)資源的訪問(wèn),Docker 采用 control groups 技術(shù)(也就是cgroup),有了 cgroup 就可以控制容器中進(jìn)程對(duì)系統(tǒng)資源的消耗了,比如你可以限制某個(gè)容器使用內(nèi)存的上限、可以在哪些 CPU 上運(yùn)行等等。
容器解決了什么問(wèn)題:
其實(shí)通過(guò)開始 應(yīng)用部署方式的變革歷程 講解的內(nèi)容就可以歸納總結(jié)容器主要解決的問(wèn)題(也是其好處):
1、解決了上線流程繁瑣問(wèn)題
2、解決了資源利用率低問(wèn)題
3、解決了擴(kuò)容 / 縮容 不及時(shí)問(wèn)題
4、解決了服務(wù)器環(huán)境臃腫問(wèn)題
5、解決了環(huán)境不一致問(wèn)題
三、虛擬機(jī)和容器的區(qū)別
虛擬機(jī)
虛擬機(jī)(VM)最恰當(dāng)?shù)拿枋鍪切Х挛锢碛布蛴?jì)算系統(tǒng)功能的軟件程序。它運(yùn)行在名為管理程序的仿真軟件之上,通過(guò)軟件環(huán)境復(fù)制底層物理硬件資源的功能。這些資源可以稱為東家機(jī)(host machine),而在管理程序上運(yùn)行的虛擬機(jī)通常稱為賓客機(jī)(guest machine)。
容器
容器化在操作系統(tǒng)級(jí)別創(chuàng)建抽象概念,以便應(yīng)用程序的單個(gè)模塊化功能可用獨(dú)立運(yùn)行。因此,幾個(gè)孤立的工作負(fù)載 — 容器 — 可以使用相同的物理資源動(dòng)態(tài)運(yùn)行。容器不太嚴(yán)格的技術(shù)定義可以是:一個(gè)軟件單元,雖然是輕量級(jí)的,但仍可將代碼、其依賴項(xiàng)和配置完全捆綁到一個(gè)映像中。
Namespaces是 Linux 中的一個(gè)高級(jí)概念,每個(gè) Namespaces 都有自己的獨(dú)立資源,而不需要底層硬件的實(shí)際分區(qū)。Namespaces 用于虛擬化底層操作系統(tǒng)。
總結(jié)
虛擬機(jī):
提升服務(wù)器資源利用率
提供一個(gè)完全隔離的環(huán)境(OS級(jí)別)
容器:
容器提供一個(gè)基本的獨(dú)立環(huán)境,實(shí)現(xiàn)容器隔離、資源限制。
容器主要解決應(yīng)用層面的問(wèn)題,達(dá)到應(yīng)用快速部署、高效管理。
個(gè)人感覺(jué)我們不應(yīng)該單純的進(jìn)行虛擬機(jī)和容器來(lái)對(duì)比,因?yàn)閺奈覀兩鲜龅目偨Y(jié)與對(duì)比中可以發(fā)現(xiàn):
他們的側(cè)重目的點(diǎn)和作用不同,之所以被大家拿出來(lái)對(duì)比,因?yàn)樗麄兌际翘摂M化的手段。
其實(shí)在云平臺(tái)中,我覺(jué)得下面這個(gè)圖(圖片由bluetata原創(chuàng)轉(zhuǎn)載請(qǐng)注明出處)更能體現(xiàn) 虛擬機(jī)和 容器的關(guān)系,他們是相輔相成相互合作的,有著不同的分工:
如果要真拿虛擬機(jī)和容器進(jìn)行對(duì)比的話,總結(jié)起來(lái)的對(duì)比表格可以參照如下:
Docker 是一個(gè)開源項(xiàng)目,誕生于 2013 年初,最初是 dotCloud 公司內(nèi)部的一個(gè)業(yè)余項(xiàng)目。它基于 Google 公司推出的 Go 語(yǔ)言實(shí)現(xiàn)。項(xiàng)目后來(lái)加入了 Linux 基金會(huì),遵從了 Apache 2.0 協(xié)議,項(xiàng)目代碼在 GitHub 上進(jìn)行維護(hù)。
Docker項(xiàng)目只是容器技術(shù)的其中一種實(shí)現(xiàn),因?yàn)樗枪芾砣萜鞯淖盍餍械墓ぞ撸猿蔀榱巳萜骷夹g(shù)的代名詞,其他著名的容器工具還包括:rkt、Podman、LXC、containerd、Buildah 等。
Docker 使用客戶端-服務(wù)器 (C/S) 架構(gòu)模式,也就是分為客戶端(Client)和服務(wù)端(Server)。
Docker 主要的架構(gòu)組成如下:
1. Docker Client 客戶端
Docker Client 通過(guò)命令行或者其他工具使用 Docker API/SDK與 Docker daemon 通信。例如:當(dāng)使用docker run 命令時(shí),Docker Client 將其發(fā)送到 dockerd 來(lái)實(shí)現(xiàn)相應(yīng)的功能。
總結(jié)起來(lái) Docker Client 客戶端的一些特征
Docker Client 可以與多個(gè) Docker daemon 進(jìn)行交互。
Docker Client 客戶端通過(guò)命令行或者其他工具使用 Docker API。
Docker Client 客戶端和服務(wù)器通過(guò) Socket 或 RESTful API 進(jìn)行通信。
Docker Client 客戶端可以連接本地或者遠(yuǎn)程的守護(hù)進(jìn)程。
2. Docker Host 主機(jī)
一個(gè)物理或者虛擬的機(jī)器用于執(zhí)行 Docker 守護(hù)進(jìn)程和容器。
3. Docker Daemon 守護(hù)進(jìn)程
Docker daemon (dockerd) 監(jiān)聽 Docker API 請(qǐng)求并管理 Docker 對(duì)象,如鏡像、容器、網(wǎng)絡(luò)和卷。
例如:接收并處理 docker client 發(fā)送的請(qǐng)求。daemon 在后臺(tái)啟動(dòng)一個(gè)server,server 負(fù)責(zé)接受docker client 發(fā)送的請(qǐng)求;接受請(qǐng)求后,server 通過(guò)路由與分發(fā)調(diào)度,找到相應(yīng)的 handler 來(lái)執(zhí)行請(qǐng)求。
4. Docker Container 容器
類似于一個(gè)輕量級(jí)的沙盒,可以將其看作一個(gè)極簡(jiǎn)的 Linux 系統(tǒng)環(huán)境(包括 root 權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)。基于 Docker 鏡像被創(chuàng)建,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體;容器可以被創(chuàng)建、啟動(dòng)、停止、刪除、暫停等。容器是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用。
5. Docker Images 鏡像
Docker鏡像里包含了打包的應(yīng)用程序及其所依賴的環(huán)境、可用的文件系統(tǒng)和其他元數(shù)據(jù)。Docker 鏡像是用于創(chuàng)建 Docker 容器的模板。
6. Docker Registry 倉(cāng)庫(kù)
倉(cāng)庫(kù)用來(lái)存儲(chǔ) Docker 鏡像,分為公有倉(cāng)庫(kù)和私有倉(cāng)庫(kù)。可以上傳鏡像到一個(gè)鏡像倉(cāng)庫(kù),然后下載到另外一臺(tái)電腦上并運(yùn)行它。
Docker Hub 是一個(gè) Docker 官方維護(hù)的公共倉(cāng)庫(kù),Docker 默認(rèn)從 Docker Hub 來(lái)查找鏡像。我們也可以維護(hù)自己私有的鏡像托管服務(wù)。
使用docker pull或docker run命令時(shí),所需的圖像將從配置的倉(cāng)庫(kù)中提取。使用該docker push命令時(shí),會(huì)將鏡像推送到配置的倉(cāng)庫(kù)中。
(1)作為云主機(jī)使用
相比虛擬機(jī)來(lái)說(shuō),容器使用的是一系列非常輕量級(jí)的虛擬化技術(shù),使得其啟動(dòng)、部署、升級(jí)跟管理進(jìn)程一樣迅速,用起來(lái)靈活又感覺(jué)跟虛擬機(jī)一樣沒(méi)什么區(qū)別,所以有些人直接使用 Docker 的 Ubuntu 等鏡像創(chuàng)建容器,當(dāng)作輕量的虛擬機(jī)來(lái)使用。
(2)作為服務(wù)使用
如果你僅僅把 Docker 容器當(dāng)作一個(gè)輕量的固定虛擬機(jī)用,那其實(shí)只能算是另類用法,Docker 容器最重要價(jià)值在于提供一整套平臺(tái)無(wú)關(guān)的標(biāo)準(zhǔn)化技術(shù),簡(jiǎn)化服務(wù)的部署、升級(jí)、維護(hù),只要把需要運(yùn)維的各種服務(wù)打包成標(biāo)準(zhǔn)的集裝箱,就可以在任何能運(yùn)行 Docker 的環(huán)境下跑起來(lái),達(dá)到開箱即用的效果,這個(gè)特點(diǎn)才是 Docker 容器風(fēng)靡全球的根本原因。
Web應(yīng)用服務(wù)
持續(xù)集成和持續(xù)部署
(3)微服務(wù)架構(gòu)使用
如果說(shuō)上面兩種應(yīng)用場(chǎng)景還不足以體現(xiàn)出與傳統(tǒng)的 PaaS 平臺(tái)相比的巨大優(yōu)勢(shì)的話,那么對(duì)微服務(wù)的架構(gòu)這種復(fù)雜又靈活的使用場(chǎng)景的無(wú)縫支持絕對(duì)具有革命意義。
微服務(wù)架構(gòu)將傳統(tǒng)分布式服務(wù)繼續(xù)拆分解耦,形成一些更小服務(wù)模塊,服務(wù)模塊之間獨(dú)立部署升級(jí),這些特性與容器的輕量、高效部署不謀而合。
四、企業(yè)如何實(shí)施容器
企業(yè)不必羞于向工具池中添加容器。想要利用它?以下是開始利用容器的一些方法:
1、洞悉您的當(dāng)前環(huán)境。分析您的應(yīng)用,核查最適合它們的環(huán)境。您是重構(gòu)現(xiàn)有應(yīng)用還是構(gòu)建全新應(yīng)用?如果您對(duì)重構(gòu)感興趣,請(qǐng)從無(wú)需與其他應(yīng)用交互便可運(yùn)行的獨(dú)立應(yīng)用入手。
2、培養(yǎng)推廣者。貴組織中的某個(gè)人(或很多人)可能都對(duì)容器化策略有自己的一兩個(gè)想法。與他們交談,向他們學(xué)習(xí),并考慮讓他們成為這項(xiàng)活動(dòng)的推廣者。
3、指定一個(gè)項(xiàng)目。確定一個(gè)起步的小項(xiàng)目,指定項(xiàng)目組,并設(shè)立大致的項(xiàng)目目標(biāo)。評(píng)估沿途的變化。
4、鼓勵(lì)參加培訓(xùn)。學(xué)好新技術(shù)需要一定的時(shí)間。考慮參加相關(guān)課程培訓(xùn),或者至少給開發(fā)者留出專門的學(xué)習(xí)時(shí)間。
如果企業(yè)希望借助DevOps來(lái)加速連續(xù)發(fā)布基于微服務(wù)的分布式應(yīng)用功能,則會(huì)繼續(xù)加大容器化投資,尤其是在無(wú)法依靠虛擬化實(shí)現(xiàn)該等目標(biāo)的領(lǐng)域。
點(diǎn)擊了解相關(guān)課程——虛擬化容器技術(shù)Docker+K8s