提起Docker,我們不得不說說容器技術(shù)。容器技術(shù)這幾年一直是最熱門的話題,如果你還不知道說明你真的out了。為什么容器這么火呢,那是因?yàn)槿萜骷夹g(shù)給我們帶來了很多方便的地方,節(jié)約了不少成本,不管是在運(yùn)維還是開發(fā)上。而如今最熱門的開源容器工具就是docker了。
讓我們先聊聊歷史,在很久很久以前,想要在線上服務(wù)器部署一個(gè)應(yīng)用,首先需要購買一個(gè)物理服務(wù)器,在服務(wù)器安裝一個(gè)操作系統(tǒng),然后安裝好應(yīng)用所需要的各種依賴環(huán)境,最后才可以進(jìn)行應(yīng)用的部署,而且一臺(tái)服務(wù)器只能部署一個(gè)應(yīng)用。這就是我們所說的傳統(tǒng)IT。
如下圖
這就造成了以下幾個(gè)明顯問題:
部署應(yīng)用非常慢
需要花費(fèi)的成本非常高
而且容易造成資源的浪費(fèi),因?yàn)橥粋€(gè)應(yīng)用使用不了一個(gè)服務(wù)器的資源
難于遷移和擴(kuò)展
可能會(huì)被限定硬件廠商,因?yàn)槟菚r(shí)候有不同硬件平臺(tái)
虛擬化技術(shù)出現(xiàn)以后,對(duì)于這種問題有所改變,虛擬化技術(shù)會(huì)在本地操作系統(tǒng)之上加多一層 Hypervisor層,Hypervisor是一種運(yùn)行在物理服務(wù)器和操作系統(tǒng)之間的中間軟件層,可以虛擬化硬件資源,例如cpu、硬盤、內(nèi)存資源等。然后我們可以基于通過虛擬化出來的資源之上安裝操作系統(tǒng),這也就是所謂的虛擬機(jī)。
通過Hypervisor層,我們可以創(chuàng)建不同的虛擬機(jī),并且可以限定每個(gè)虛擬機(jī)的物理資源,并且每個(gè)虛擬機(jī)都是分離、獨(dú)立的。例如A虛擬機(jī)給它使用2個(gè)CPU、8G內(nèi)存、100G磁盤,B虛擬機(jī)給它使用4個(gè)CPU、16G內(nèi)存、500g磁盤等等,這樣就可以實(shí)現(xiàn)物理資源利用率的最大化。
如此一來:
一臺(tái)物理機(jī)就可以部署多個(gè)應(yīng)用
每個(gè)應(yīng)用都可以獨(dú)立運(yùn)行在一個(gè)虛擬機(jī)里
如下圖
虛擬化技術(shù)的優(yōu)點(diǎn):
資源池——一個(gè)物理機(jī)的資源分配到了不同的虛擬機(jī)里
很容易擴(kuò)展——增加物理機(jī)或者虛擬機(jī)即可,因?yàn)樘摂M機(jī)是可以復(fù)制的
很容易云化——亞馬孫AWS,阿里云,谷歌云等
即然虛擬化技術(shù)已經(jīng)很強(qiáng)大了,為什么還需要容器技術(shù)呢?這就涉及到虛擬化技術(shù)所帶來的局限性了,每一個(gè)虛擬機(jī)都是一個(gè)完整的操作系統(tǒng),所以需要給其分配物理資源,當(dāng)虛擬機(jī)數(shù)量增多時(shí),操作系統(tǒng)本身消耗的資源勢(shì)必增多
以上所提到的這個(gè)問題還不是真正促使容器技術(shù)出現(xiàn)的根本原因,真正使容器技術(shù)出現(xiàn)的是開發(fā)和運(yùn)維所面臨的挑戰(zhàn):
上圖中可以看到開發(fā)與運(yùn)維的環(huán)境都比較復(fù)雜,一個(gè)應(yīng)用可能由多個(gè)服務(wù)組成,每個(gè)服務(wù)都有其獨(dú)特的依賴。同時(shí)應(yīng)用可能會(huì)需要部署到多種不同的環(huán)境中。這使得一個(gè)應(yīng)用在“開發(fā)-測試-部署-運(yùn)維”的過程中需要進(jìn)行大量的運(yùn)行環(huán)境適配工作。而容器技術(shù)正是解決了這種環(huán)境不一致的問題:
容器可以幫我們把開發(fā)環(huán)境及應(yīng)用整個(gè)打包帶走,打包好的容器可以在任何的環(huán)境下運(yùn)行,這樣就可以解決開發(fā)與運(yùn)維環(huán)境不一致的問題了,所以:
容器解決了開發(fā)和運(yùn)維之間的矛盾
在開發(fā)和運(yùn)維之間搭建了一個(gè)橋梁,是實(shí)現(xiàn)devops的最佳解決方案
了解了容器解決了什么問題,那讓我們用簡單的幾句話說明什么是容器
對(duì)軟件和其依賴環(huán)境的標(biāo)準(zhǔn)化打包
應(yīng)用之間相互隔離
共享一個(gè)OS Kernel
可以運(yùn)行在很多主流操作系統(tǒng)上
那么問題來了,容器和虛擬機(jī)的區(qū)別:
現(xiàn)在讓我們比較一下:
當(dāng)然,我們還可容器可以和虛擬機(jī)結(jié)合在一起使用,而且這也是目前主流的做法。
說說Docker
Docker也是容器技術(shù)的一種實(shí)現(xiàn),也是目前比較主流的開源的容器實(shí)現(xiàn)工具,docker出現(xiàn)的時(shí)間軸:
Docker容器的思想:
Docker容器的思想來自于集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規(guī)整的擺放起來。并且各種各樣的貨物被集裝箱標(biāo)準(zhǔn)化了,集裝箱和集裝箱之間不會(huì)互相影響。那么我就不需要專門運(yùn)送水果的船和專門運(yùn)送化學(xué)品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運(yùn)走。docker就是類似的理念?,F(xiàn)在都流行云計(jì)算了,云計(jì)算就好比大貨輪,docker就是集裝箱。
1. 不同的應(yīng)用程序可能會(huì)有不同的應(yīng)用環(huán)境,比如.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站依賴的軟件就不一樣,如果把他們依賴的軟件都安裝在一個(gè)服務(wù)器上就要調(diào)試很久,而且很麻煩,還會(huì)造成一些沖突。比如IIS和Apache訪問端口沖突。這個(gè)時(shí)候你就要隔離.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站。常規(guī)來講,我們可以在服務(wù)器上創(chuàng)建不同的虛擬機(jī)在不同的虛擬機(jī)上放置不同的應(yīng)用,但是虛擬機(jī)開銷比較高。docker可以實(shí)現(xiàn)虛擬機(jī)隔離應(yīng)用環(huán)境的功能,并且開銷比虛擬機(jī)小,小就意味著省錢了。
2. 你開發(fā)軟件的時(shí)候用的是Ubuntu,但是運(yùn)維管理的都是centos,運(yùn)維在把你的軟件從開發(fā)環(huán)境轉(zhuǎn)移到生產(chǎn)環(huán)境的時(shí)候就會(huì)遇到一些Ubuntu轉(zhuǎn)centos的問題,比如:有個(gè)特殊版本的數(shù)據(jù)庫,只有Ubuntu支持,centos不支持,在轉(zhuǎn)移的過程當(dāng)中運(yùn)維就得想辦法解決這樣的問題。這時(shí)候要是有docker你就可以把開發(fā)環(huán)境直接封裝轉(zhuǎn)移給運(yùn)維,運(yùn)維直接部署你給他的docker就可以了。而且部署速度快。
3. 在服務(wù)器負(fù)載方面,如果你單獨(dú)開一個(gè)虛擬機(jī),那么虛擬機(jī)會(huì)占用空閑內(nèi)存的,docker部署的話,這些內(nèi)存就會(huì)利用起來??傊甦ocker就是集裝箱原理。
好了,如果想具體學(xué)習(xí)Docker就看后面的文章吧~