架构杂谈《七》
容器VS虛擬機(jī)
一、什么是虛擬機(jī)
虛擬機(jī)(Virtual Machine)指通過軟件模擬的具有完整硬件系統(tǒng)功能的、運(yùn)行在一個(gè)完全隔離環(huán)境中的完整計(jì)算機(jī)系統(tǒng)。
虛擬系統(tǒng)通過生成現(xiàn)有操作系統(tǒng)的全新虛擬鏡像,它具有真實(shí)windows系統(tǒng)完全一樣的功能,進(jìn)入虛擬系統(tǒng)后,所有操作都是在這個(gè)全新的獨(dú)立的虛擬系統(tǒng)里面進(jìn)行,可以獨(dú)立安裝運(yùn)行軟件,保存數(shù)據(jù),擁有自己的獨(dú)立桌面,不會(huì)對(duì)真正的系統(tǒng)產(chǎn)生任何影響 ,而且具有能夠在現(xiàn)有系統(tǒng)與虛擬鏡像之間靈活切換的一類操作系統(tǒng)。虛擬系統(tǒng)和傳統(tǒng)的虛擬機(jī)(Parallels Desktop ,Vmware,VirtualBox,Virtual pc)不同在于:虛擬系統(tǒng)不會(huì)降低電腦的性能,啟動(dòng)虛擬系統(tǒng)不需要像啟動(dòng)windows系統(tǒng)那樣耗費(fèi)時(shí)間,運(yùn)行程序更加方便快捷;虛擬系統(tǒng)只能模擬和現(xiàn)有操作系統(tǒng)相同的環(huán)境,而虛擬機(jī)則可以模擬出其他種類的操作系統(tǒng);而且虛擬機(jī)需要模擬底層的硬件指令,所以在應(yīng)用程序運(yùn)行速度上比虛擬系統(tǒng)慢得多。
流行的虛擬機(jī)軟件有VMware(VMWare ACE)、Virtual Box和Virtual PC,它們都能在Windows系統(tǒng)上虛擬出多個(gè)計(jì)算機(jī)。
以上內(nèi)容來自?百度百科
總結(jié)下:
虛擬機(jī)用于為用戶提供一個(gè)完整的系統(tǒng)鏡像,常見的虛擬機(jī)有VMware、Virtual Box、KVM等。虛擬機(jī)技術(shù)可以為每個(gè)用戶分配虛擬化后的CPU、內(nèi)存和I/O等設(shè)備資源,但是為了能運(yùn)行應(yīng)用程序,除了需要部署應(yīng)用程序本身及其依賴外,還需要安裝整個(gè)操作系統(tǒng)和驅(qū)動(dòng)。
二、什么是容器
容器是一種輕量級(jí)、可移植的為應(yīng)用程序提供了隔離的運(yùn)行空間。每個(gè)容器內(nèi)都包含一個(gè)獨(dú)享的完整用戶環(huán)境,并且一個(gè)容器內(nèi)的環(huán)境變動(dòng)不會(huì)影響其他容器的運(yùn)行環(huán)境,可以使應(yīng)用程序在幾乎任何地方以相同的方式運(yùn)行(如 在開發(fā)人員自己的本子上創(chuàng)建并測試好的容器無須任何修改就能在生產(chǎn)環(huán)境中的虛擬機(jī)、物理服務(wù)器或者云上運(yùn)行)
在技術(shù)方面,容器是通過一系列系統(tǒng)級(jí)別的機(jī)制來實(shí)現(xiàn)的(如:通過Linux Namespaces進(jìn)行空間隔離,通過文件系統(tǒng)的掛載點(diǎn)來決定容器可以訪問哪些文件;通過cgroups 來確定每個(gè)容器可以利用多少資源),容器之間通過共享同一個(gè)系統(tǒng)內(nèi)核來提升內(nèi)存的使用率。
三、容器與虛擬機(jī)的區(qū)別
容器是對(duì)應(yīng)用層的抽象,它把應(yīng)用程序的代碼和相關(guān)依賴打包在一起執(zhí)行,多個(gè)容器可以在同一臺(tái)物理機(jī)上互不影響地獨(dú)立運(yùn)行,并且共享操作系統(tǒng)內(nèi)核。啟動(dòng)快、占用空間少。而虛擬機(jī)是物理硬件層上的虛擬化,系統(tǒng)管理程序使虛擬機(jī)能夠運(yùn)行在同一臺(tái)物理機(jī)上,但是每臺(tái)虛擬機(jī)必須包括一整套操作系統(tǒng)、應(yīng)用程序和各種依賴庫等。啟動(dòng)慢、占用空間大。
四、容器主要解決的問題
容器有輕量級(jí)、可隔離性和可移植等特性,所以應(yīng)用程序的容器化使得應(yīng)用程序具備了超強(qiáng)的可移植性。
在 Web 1.0 時(shí)代,信息是單向的,交互只在人與網(wǎng)絡(luò)之間進(jìn)行,大多人上網(wǎng)是為了看新聞,因此應(yīng)用程序相對(duì)簡單,一般采用 LAMP。( Linux-Apache-MySQL-PHP )的三層架構(gòu)(Presentation 、 Application 、 Data ),只需要部署到有限的幾臺(tái)物理服務(wù)器上;在如今的 Web2.0甚至 Web 3.0 時(shí)代,互聯(lián)網(wǎng)連接一切,包括連接人與人、人與物、物與物,系統(tǒng)架構(gòu)較 10 年前己經(jīng)變得非常復(fù)雜,開發(fā)人員通常使用多種服務(wù)構(gòu)建和組裝應(yīng)用,比如分布式消息隊(duì)列 Kafka、分布式緩存 Redis、分布式文件系統(tǒng) HDFS 或 Spring Cloud 或 Azure Service Fabric等。復(fù)雜應(yīng)用系統(tǒng)的相應(yīng)部署環(huán)境也變得非常復(fù)雜,可能會(huì)部署到不同的環(huán)境中,比如開發(fā)服務(wù)器、測試服務(wù)器和生產(chǎn)服務(wù)器,服務(wù)器也可能是虛擬服務(wù)器、私有云或公有云等,如下圖:
因?yàn)榇嬖诟鞣N服務(wù)和環(huán)境,所以開發(fā)人員在編寫代碼時(shí)需要考慮不同的運(yùn)行環(huán)境,運(yùn)維人員則需要為不同的服務(wù)和平臺(tái)進(jìn)行各種配置,對(duì)于他們雙方來說,這些都是艱巨的任務(wù),那么如何讓每種服務(wù)在所有的部署環(huán)境中順利運(yùn)行呢?容器就很好地幫我們解決了這個(gè)難題。
我們先聯(lián)想下幾十年前的運(yùn)輸行業(yè),在每一次運(yùn)輸中,貨主與承運(yùn)方都會(huì)擔(dān)心貨物因種類不同而受損,比如易碎的東西被錯(cuò)誤地壓在了最下面。另 一方面,在運(yùn)輸過程中需要使用不同的交通工具,比如貨物先被裝上卡車運(yùn)到碼頭,再被裝上船,到岸后又被卸下船,再被裝上火車 ,到達(dá)目的地再被卸下 。其中的大部分時(shí)間都花費(fèi)在對(duì)不同物品的裝貨、卸貨上,而且搬上搬下還容易損壞物品 。幸運(yùn)的是,集裝箱的發(fā)明解決了這個(gè)難題 :任何貨物,不管是床墊還是機(jī)器,都被放在各自的集裝箱中,集裝箱在整個(gè)運(yùn)輸過程中都是密封的,只有到達(dá)目的地才被打開。標(biāo)準(zhǔn)集裝箱可以被高效地裝卸、重疊和長途運(yùn)輸?,F(xiàn)代化的起重機(jī)可以方便地在卡車、輪船和火車之間移動(dòng)集裝箱,集裝箱被譽(yù)為運(yùn)輸業(yè)與世界貿(mào)易的最重要的發(fā)明。
Docker 將集裝箱思想運(yùn)用到對(duì)軟件的打包上,為代碼提供了 一個(gè)基于容器的標(biāo)準(zhǔn)化運(yùn)輸系統(tǒng),可以將任何應(yīng)用及其依賴打包成一個(gè)輕量級(jí)、可移植、自包含的容器,可以運(yùn)行在幾乎所有操作系統(tǒng)上。
五、Docker的優(yōu)勢(shì)
1)、Docker 在開發(fā)方面的優(yōu)勢(shì)
每個(gè)人的開發(fā)環(huán)境都不一樣,由于在開發(fā)過程中會(huì)不斷地切換項(xiàng)目工程,所以每次都要不斷的重復(fù)修改和設(shè)置開發(fā)環(huán)境,而Docker可以使這一過程變得自動(dòng)化,讓開發(fā)人員更加關(guān)注軟件開發(fā)(比如:開發(fā)人員使用Docker后就不需要單獨(dú)安裝和配置數(shù)據(jù)庫,也不需要擔(dān)心不同版本的沖突問題),容器化的應(yīng)用更容易構(gòu)建、分享和運(yùn)行,如果團(tuán)隊(duì)有新的同事加入,也不需要花費(fèi)好幾個(gè)小時(shí)講解如何搭建環(huán)境及安裝軟件和相關(guān)的配置,只需要花費(fèi)幾分鐘安裝Docker就能編譯和調(diào)試程序了。
2)、Docker 在運(yùn)維方面的優(yōu)勢(shì)
Docker 使軟件的發(fā)布更加高效,不管是更新版本還是修復(fù) Bug,都能快速發(fā)布完成,并且能瞬間伸縮擴(kuò)展。Docker 能夠?qū)崿F(xiàn)自動(dòng)化的編譯、打包、測試和部署,運(yùn)維人員不再需要WiKi 、 README 、 CleckList 文檔,因?yàn)?Docker 在開發(fā)、測試和生產(chǎn)環(huán)境中都使用了相同的鏡像,所以更新時(shí)不會(huì)出現(xiàn)不一致的問題。
3)、Docker 在容器和虛擬機(jī)方面的優(yōu)勢(shì)
Docker 使容器和虛擬機(jī)相結(jié)合( Docker Machine 實(shí)現(xiàn)了容器和虛擬機(jī)的有效結(jié)合),使部署和管理應(yīng)用變得更加靈活 。我們可以在虛擬機(jī)中啟動(dòng)一個(gè)容器,這里的虛擬機(jī)并不是由 Docker控制的,而是通過現(xiàn)有的虛擬化管理設(shè)施來控制的 。一旦系統(tǒng)實(shí)例啟動(dòng),就可以通過安裝 Docker來運(yùn)行容器并進(jìn)行其他特殊設(shè)置。同時(shí)由于不同的容器運(yùn)行在不同的虛擬機(jī)上,容器之間也能有很好的隔離。
說明:
1、參考書籍:《分布式服務(wù)架構(gòu):原理、設(shè)計(jì)與實(shí)戰(zhàn)》
2、如有不合適的地方請(qǐng)反饋。綜合后更改。
總結(jié)
- 上一篇: 理想化的DevOps团队里只需要有Dev
- 下一篇: 坚持一个好习惯该有多难?