即學即用Docker(一):說說容器和Docker
2019-09-02閱讀 2310


提起Docker,我們不得不說說容器技術。容器技術這幾年一直是最熱門的話題,如果你還不知道說明你真的out了。為什么容器這么火呢,那是因為容器技術給我們帶來了很多方便的地方,節(jié)約了不少成本,不管是在運維還是開發(fā)上。而如今最熱門的開源容器工具就是docker了。

讓我們先聊聊歷史,在很久很久以前,想要在線上服務器部署一個應用,首先需要購買一個物理服務器,在服務器安裝一個操作系統(tǒng),然后安裝好應用所需要的各種依賴環(huán)境,最后才可以進行應用的部署,而且一臺服務器只能部署一個應用。這就是我們所說的傳統(tǒng)IT。

如下圖

c1.png 

 

這就造成了以下幾個明顯問題:

  • 部署應用非常慢

  • 需要花費的成本非常高

  • 而且容易造成資源的浪費,因為往往一個應用使用不了一個服務器的資源

  • 難于遷移和擴展

  • 可能會被限定硬件廠商,因為那時候有不同硬件平臺

 

虛擬化技術出現(xiàn)以后,對于這種問題有所改變,虛擬化技術會在本地操作系統(tǒng)之上加多一層 Hypervisor層,Hypervisor是一種運行在物理服務器和操作系統(tǒng)之間的中間軟件層,可以虛擬化硬件資源,例如cpu、硬盤、內存資源等。然后我們可以基于通過虛擬化出來的資源之上安裝操作系統(tǒng),這也就是所謂的虛擬機。

 

通過Hypervisor層,我們可以創(chuàng)建不同的虛擬機,并且可以限定每個虛擬機的物理資源,并且每個虛擬機都是分離、獨立的。例如A虛擬機給它使用2個CPU、8G內存、100G磁盤,B虛擬機給它使用4個CPU、16G內存、500g磁盤等等,這樣就可以實現(xiàn)物理資源利用率的最大化。

 

如此一來:

  • 一臺物理機就可以部署多個應用

  • 每個應用都可以獨立運行在一個虛擬機里

 

如下圖

z1.png

 

虛擬化技術的優(yōu)點:

  •  資源池——一個物理機的資源分配到了不同的虛擬機里

  • 很容易擴展——增加物理機或者虛擬機即可,因為虛擬機是可以復制的

  •  很容易云化——亞馬孫AWS,阿里云,谷歌云等

即然虛擬化技術已經(jīng)很強大了,為什么還需要容器技術呢?這就涉及到虛擬化技術所帶來的局限性了,每一個虛擬機都是一個完整的操作系統(tǒng),所以需要給其分配物理資源,當虛擬機數(shù)量增多時,操作系統(tǒng)本身消耗的資源勢必增多

以上所提到的這個問題還不是真正促使容器技術出現(xiàn)的根本原因,真正使容器技術出現(xiàn)的是開發(fā)和運維所面臨的挑戰(zhàn):

001.png

 

上圖中可以看到開發(fā)與運維的環(huán)境都比較復雜,一個應用可能由多個服務組成,每個服務都有其獨特的依賴。同時應用可能會需要部署到多種不同的環(huán)境中。這使得一個應用在“開發(fā)-測試-部署-運維”的過程中需要進行大量的運行環(huán)境適配工作。而容器技術正是解決了這種環(huán)境不一致的問題:

002.png

容器可以幫我們把開發(fā)環(huán)境及應用整個打包帶走,打包好的容器可以在任何的環(huán)境下運行,這樣就可以解決開發(fā)與運維環(huán)境不一致的問題了,所以:

  • 容器解決了開發(fā)和運維之間的矛盾

  • 在開發(fā)和運維之間搭建了一個橋梁,是實現(xiàn)devops的最佳解決方案

 

了解了容器解決了什么問題,那讓我們用簡單的幾句話說明什么是容器

  • 對軟件和其依賴環(huán)境的標準化打包

  • 應用之間相互隔離

  • 共享一個OS Kernel

  • 可以運行在很多主流操作系統(tǒng)上

 

那么問題來了,容器和虛擬機的區(qū)別:

003.png

現(xiàn)在讓我們比較一下:


 004.png

當然,我們還可容器可以和虛擬機結合在一起使用,而且這也是目前主流的做法。

 

說說Docker

 

Docker也是容器技術的一種實現(xiàn),也是目前比較主流的開源的容器實現(xiàn)工具,docker出現(xiàn)的時間軸:

005.png

 

 

Docker容器的思想:

Docker容器的思想來自于集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規(guī)整的擺放起來。并且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那么我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運走。docker就是類似的理念?,F(xiàn)在都流行云計算了,云計算就好比大貨輪,docker就是集裝箱。

1.        不同的應用程序可能會有不同的應用環(huán)境,比如.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站依賴的軟件就不一樣,如果把他們依賴的軟件都安裝在一個服務器上就要調試很久,而且很麻煩,還會造成一些沖突。比如IIS和Apache訪問端口沖突。這個時候你就要隔離.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站。常規(guī)來講,我們可以在服務器上創(chuàng)建不同的虛擬機在不同的虛擬機上放置不同的應用,但是虛擬機開銷比較高。docker可以實現(xiàn)虛擬機隔離應用環(huán)境的功能,并且開銷比虛擬機小,小就意味著省錢了。

2.        你開發(fā)軟件的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟件從開發(fā)環(huán)境轉移到生產環(huán)境的時候就會遇到一些Ubuntu轉centos的問題,比如:有個特殊版本的數(shù)據(jù)庫,只有Ubuntu支持,centos不支持,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發(fā)環(huán)境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。

3.        在服務器負載方面,如果你單獨開一個虛擬機,那么虛擬機會占用空閑內存的,docker部署的話,這些內存就會利用起來。總之docker就是集裝箱原理。

 

好了,如果想具體學習Docker就看后面的文章吧~