本文嘗試解釋兩者的不同,不涉及底層知識(shí)。相當(dāng)于科普小知識(shí)。
Docker Container
一個(gè)謹(jǐn)慎的比較docker和vm,個(gè)人覺(jué)得Container像個(gè)一個(gè)迷你的vm
從某種意義上說(shuō),這是正確的。但從另一個(gè)角度來(lái)看,這是非常不準(zhǔn)確的,可能會(huì)讓讀者導(dǎo)致混亂,錯(cuò)誤的假設(shè)。
需要理解的重要相似之處是,這兩種方法都是為部署和運(yùn)行應(yīng)用程序創(chuàng)建隔離環(huán)境的方法。
Virtual machines
VM(VMware)在宿主機(jī)器、宿主機(jī)器操作系統(tǒng)的基礎(chǔ)上創(chuàng)建虛擬層、虛擬化的操作系統(tǒng)、虛擬化的倉(cāng)庫(kù),然后再安裝應(yīng)用;
Containers
容器完全在容器主機(jī)的應(yīng)用程序?qū)又羞\(yùn)行。在UserLAnd[1]中,OSs有內(nèi)核空間,操作系統(tǒng)的核心在其中運(yùn)行。然后是用戶(hù)空間,所有與用戶(hù)活動(dòng)相關(guān)的東西都在這里運(yùn)行。沒(méi)有安裝操作系統(tǒng)。容器共享主機(jī)的內(nèi)核空間,類(lèi)似于主機(jī)中的一個(gè)用戶(hù),LXC所實(shí)現(xiàn)的隔離性主要是來(lái)自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace將container的進(jìn)程, 網(wǎng)絡(luò), 消息, 文件系統(tǒng)和hostname 隔離開(kāi)。但是,cgroup的隔離性要比kvm粒度大,并且很難metric指標(biāo)。比如,磁盤(pán)的IO就很難隔離。導(dǎo)致一個(gè)容器的io增大,這個(gè)主機(jī)都有可能hang。
容器實(shí)際上就是一個(gè)進(jìn)程。當(dāng)它在容器內(nèi)時(shí),感覺(jué)就像一臺(tái)完全獨(dú)立的機(jī)器。我們可以啟動(dòng)新的進(jìn)程,當(dāng)監(jiān)控這些進(jìn)程時(shí),您將只看到容器內(nèi)的進(jìn)程。但是,如果您監(jiān)控主機(jī)進(jìn)程,仍然能夠看到容器中運(yùn)行的所有內(nèi)容。
容器共享主機(jī)。那么他是如何在同一臺(tái)機(jī)器上運(yùn)行Ubuntu和centos呢?
因?yàn)槿萜鲗?shí)際上共享主機(jī)的內(nèi)核。特定的linux發(fā)行版都構(gòu)建在同一個(gè)內(nèi)核之上(盡管版本不同)。所有的包管理器、UI之類(lèi)的東西,以及其他各種軟件,都可以在用戶(hù)空間中運(yùn)行,這些軟件使發(fā)行版獨(dú)一無(wú)二,并創(chuàng)造出不同的Linux風(fēng)格。具有不同發(fā)行版的不同容器可以在同一臺(tái)機(jī)器上運(yùn)行而不會(huì)產(chǎn)生沖突。
當(dāng)涉及到平臺(tái)設(shè)計(jì)時(shí),這個(gè)內(nèi)核共享事實(shí)還有其他重要的含義。例如,windows容器將不能在Linux主機(jī)上運(yùn)行。
不可修改
容器本質(zhì)上是不可變的。 容器操作系統(tǒng)、庫(kù)、實(shí)用程序和應(yīng)用程序在構(gòu)建時(shí)都是凍結(jié)的,在此之后它就不能更改了。所以,不需要以傳統(tǒng)的方式更新容器。重新構(gòu)建和重新部署。雖然有一些缺點(diǎn),但是在可重復(fù)性、簡(jiǎn)化部署和可靠性方面有很大的提高。
鏡像(image)
鏡像其實(shí)是一個(gè)標(biāo)準(zhǔn)的文件包,它表示容器運(yùn)行時(shí)文件系統(tǒng)的狀態(tài)。這可以發(fā)布到注冊(cè)表,也可以用作父鏡像。
大多數(shù)鏡像將構(gòu)建在父鏡像之上(父鏡像通常也構(gòu)建在另一個(gè)鏡像像之上)。基本映像沒(méi)有父鏡像的。
下面是一個(gè)完整的ubuntu鏡像[2]
小結(jié)
簡(jiǎn)而言之,容器化為單個(gè)OS上的工作負(fù)載隔離提供了標(biāo)準(zhǔn)化的方法,而虛擬化為在一臺(tái)服務(wù)器上安裝多個(gè)OSs提供了標(biāo)準(zhǔn)化的方法。它們?cè)跇I(yè)界都很突出,在云計(jì)算中經(jīng)常一起使用。
因?yàn)槿萜鳑](méi)有安裝完整的操作系統(tǒng),所以它的重量更輕,因?yàn)橄螺d和運(yùn)行更快,存儲(chǔ)更小。
舉例對(duì)比兩者的不同
下圖以盡可能簡(jiǎn)單的方式說(shuō)明了上述差異。請(qǐng)注意使用VMs和容器運(yùn)行相同的兩個(gè)工作負(fù)載的堆棧組合。
如果大家理解了上面描述的容器和vm之間的關(guān)鍵區(qū)別,那么第二個(gè)圖將提供對(duì)正在發(fā)生的事情的更深入的信息。大家可以清楚地看到這兩種技術(shù)如何提供工作負(fù)載隔離。
記住,堆棧表示邏輯層次結(jié)構(gòu)。我們知道這些容器都在主機(jī)操作系統(tǒng)上作為唯一的進(jìn)程運(yùn)行,而VM客戶(hù)操作系統(tǒng)是成熟的操作系統(tǒng),可以管理它們自己的進(jìn)程。
現(xiàn)在,讓我們看看vm和容器通常是如何一起使用的。假設(shè)我們想在云中運(yùn)行Python Flask應(yīng)用程序和JAVA Spring應(yīng)用程序。下圖描述了AWS上可行的狀態(tài)。
Amazon EC2是Amazon的托管計(jì)算服務(wù)。這意味著用戶(hù)不需要擔(dān)心服務(wù)器或管理程序。我們只需選擇實(shí)例類(lèi)型(針對(duì)不同工作負(fù)載的不同特性)并部署VM。(國(guó)內(nèi)的同學(xué)們還是使用阿里云吧)
有許多不同的Amazon機(jī)器鏡像可供選擇[3],或者可以創(chuàng)建自己的鏡像。因?yàn)関m比容器更重。
我們可以在許多不同的服務(wù)中共同使用VM鏡像。可以將基本操作系統(tǒng)、包更新、一些腳本、監(jiān)視代理的安裝和配置,以及其他操作和安全工具打包到vm中。
通常使用配置管理工具(如Ansible或Chef)來(lái)管理工作負(fù)載或服務(wù)。Chef已經(jīng)是devops的標(biāo)準(zhǔn)管理工具。
容器編排
下一個(gè)例子提供了一個(gè)非常基本的架構(gòu)圖,了解在云中運(yùn)行容器的基本原理。
容器編排工具用于在平臺(tái)上管理容器,在這個(gè)平臺(tái)上,讓我們感覺(jué)就像是在處理一臺(tái)機(jī)器一樣透明。這是通過(guò)巧妙地管理集群(云中的機(jī)器或vm集群)來(lái)實(shí)現(xiàn)的。它們可以通過(guò)自動(dòng)化資源調(diào)度、擴(kuò)展和工作負(fù)載管理功能來(lái)擴(kuò)展容器的優(yōu)點(diǎn)。Kubernetes是目前最流行的容器編排平臺(tái)。
這些工具在體系結(jié)構(gòu)上很復(fù)雜,很難配置和讓他們良好的運(yùn)行(坑還是比較多的)。但從用戶(hù)的角度來(lái)看,它們非常棒,而且隨著知識(shí)的增長(zhǎng)、反饋的實(shí)現(xiàn)和托管服務(wù)的出現(xiàn),它們?cè)絹?lái)越容易管理。
最后,我們希望獲取Python容器并在本地機(jī)器上運(yùn)行它。 它們?cè)试S我們相對(duì)容易地在機(jī)器上運(yùn)行與生產(chǎn)中完全相同的內(nèi)容。
Docker是一個(gè)本質(zhì)上Linux應(yīng)用程序。不過(guò),Docker提供了易于使用的特點(diǎn),可以在后臺(tái)處理VM的運(yùn)行 。上面顯示了在Mac上部署docker應(yīng)用程序的邏輯架構(gòu)。
阿里的數(shù)據(jù)庫(kù)基本都已經(jīng)做到了docker化,這其中在存儲(chǔ)、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)和docker本身都做了大量的優(yōu)化。要想把整體服務(wù)docker化在技術(shù)上來(lái)講還是很難的。會(huì)用和用好難度是不一樣的。
[1]:https://play.google.com/store/Apps/details?id=tech.ula&hl=en_US 需要翻墻
[2]:https://github.com/tianon/docker-brew-ubuntu-core/blob/9db8c72dd02e8f9fd5dba82ff9266174b088e2e6/bionic/Dockerfile?source=post_page-----94c558905b6----------------------
[3]:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html