小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

先說(shuō)Docker干啥用的。

 蘭亭文藝 2020-02-10
先說(shuō)Docker干啥用的。因?yàn)楝F(xiàn)在物理服務(wù)器是很強(qiáng)大的,我們?nèi)绻谝慌_(tái)物理服務(wù)器上只跑一個(gè)服務(wù)就浪費(fèi)了,而同時(shí)跑很多服務(wù)他們又互相影響,比如說(shuō)一個(gè)服務(wù)出了內(nèi)存泄漏把整個(gè)服務(wù)器的內(nèi)存都占滿了,其他服務(wù)都跟著倒霉。所以要把每個(gè)服務(wù)都隔離起來(lái),讓它們只使用自己那部分有限的cpu,內(nèi)存和磁盤,以及自己依賴的軟件包。這個(gè)早先是用虛擬機(jī)來(lái)實(shí)現(xiàn)隔離的,但是每個(gè)虛擬機(jī)都要裝自己的操作系統(tǒng)核心,這是對(duì)資源有點(diǎn)浪費(fèi)。于是就有了Docker, 一個(gè)機(jī)器上可以裝十幾個(gè)到幾十個(gè)docker,他們共享操作系統(tǒng)核心,占用資源少,啟動(dòng)速度快。但又能提供了資源(cpu, 內(nèi)存,磁盤等)的一定程度的隔離。
然后使用docker給軟件開發(fā)又帶來(lái)了不少額外的好處。比如說(shuō)運(yùn)維省心啊,所有物理服務(wù)器的配置幾乎都是一樣的,只是上面跑的docker container不同。以前某個(gè)服務(wù)訪問(wèn)量大了,需要多幾臺(tái)服務(wù)器,你得一臺(tái)一臺(tái)準(zhǔn)備,現(xiàn)在直接docker配好,要幾個(gè)就給幾個(gè)。
還有依賴關(guān)系管理也容易了,每個(gè)docker image都可以獨(dú)立配置自己需要的軟件包,準(zhǔn)備一個(gè)配置文件就可以發(fā)布,不像以前配置個(gè)apache + php就在一臺(tái)物理主機(jī)上從頭編譯到尾,如果想再多個(gè)插件,往往是從頭又來(lái)一遍,機(jī)器多了是受不了的。而且依賴有沖突也沒(méi)那么怕了,都隔離了嘛。

現(xiàn)在docker的隔離性已經(jīng)做的非常好了。我覺(jué)得docker有個(gè)問(wèn)題是linux宿主和windows宿主的docker實(shí)現(xiàn)差異還挺大的。linux是基于linux核心的namespaces和cgroup等來(lái)隔離資源,還有l(wèi)ibvirt這樣的接口實(shí)現(xiàn),基本上能當(dāng)個(gè)虛擬機(jī)來(lái)用,又很輕量級(jí)。windows方面主要是靠微軟,微軟做得也還不錯(cuò),前后搞了好幾種container方案,前段時(shí)候我試過(guò)的是基于hyper-v的, 功能應(yīng)該都在了,所以說(shuō)現(xiàn)在docker在windows主機(jī)上也是能用的, 這對(duì)國(guó)內(nèi)龐大的windows服務(wù)器保有量也是個(gè)福音。不過(guò)在windows上面使用docker開發(fā)是沒(méi)問(wèn)題,生產(chǎn)環(huán)境我就不確定了。
-------------
要解釋清楚Docker,首先要說(shuō)解釋清楚容器(Container)的概念。要解釋容器的話,需要從操作系統(tǒng)說(shuō)起。太深入的一兩本書都說(shuō)不清楚,直接引用維基的說(shuō)法,操作系統(tǒng)就是管理計(jì)算機(jī)的硬件軟件和資源,并且為軟件運(yùn)行提供通用服務(wù)的系統(tǒng)軟件。
·硬件管理,包括分配CPU時(shí)間、內(nèi)存;從網(wǎng)絡(luò)、存儲(chǔ)設(shè)備等IO設(shè)備讀寫數(shù)據(jù)。
·軟件管理,就是各種軟件的運(yùn)行,線程、進(jìn)程調(diào)度之類的工作。
·為軟件提供運(yùn)行環(huán)境,這個(gè)運(yùn)行環(huán)境通常一部分由操作系統(tǒng)內(nèi)核(Kernel)提供,另一部分由運(yùn)行庫(kù)(Runtime Library)提供。

硬件、操作系統(tǒng)、應(yīng)用程序之間的關(guān)系可以簡(jiǎn)單的用下圖表示:

+--------------------------+
|       Applications       |
+--------------------------+
|+------------------------+|
||    Runtime Library     ||
|+------------------------+|
||         Kernel         ||
|+------------------------+|
|     Operating System     |
+-----+--------+-----------+
| CPU | Memory | IO Device |
+-----+--------+-----------+ 

隨著硬件的性能提升,以及軟件種類的豐富,有兩種情況變得很常見(jiàn):
1.硬件性能過(guò)?!芏嘤?jì)算機(jī)的硬件配置,即使不能完全滿足峰值性能的要求,也往往會(huì)有大量時(shí)間處于硬件資源閑置的狀態(tài)。例如一般家用電腦,已經(jīng)是四核、六核的配置了,除了3A游戲、視頻制作、3D渲染、高性能計(jì)算等特殊應(yīng)用外,通常有90%以上時(shí)間CPU是閑置的。
2.軟件沖突——因?yàn)闃I(yè)務(wù)需要,兩個(gè)或者多個(gè)軟件之間沖突,或者需要同一個(gè)軟件的不同版本。例如早幾年做web前端的,要測(cè)試網(wǎng)頁(yè)在不同版本的IE上是否能正常顯示,然而Windows只能裝一個(gè)版本的IE。
為了解決軟件沖突,只能配置多臺(tái)計(jì)算機(jī),或者很麻煩的在同一臺(tái)電腦上安裝多個(gè)操作系統(tǒng),通過(guò)重啟來(lái)進(jìn)行切換。顯然這兩個(gè)方案都有其缺點(diǎn):多臺(tái)計(jì)算機(jī)成本太高,多操作系統(tǒng)的安裝、切換都很麻煩。在硬件性能過(guò)剩的時(shí)候,硬件虛擬化的普及就很自然而然的提出來(lái)了。

所謂硬件虛擬化,就是某個(gè)特殊的軟件,仿真出一臺(tái)或者多臺(tái)計(jì)算機(jī)的各種硬件,用戶可以在這一臺(tái)虛擬機(jī)上安裝、運(yùn)行操作系統(tǒng)(一般叫來(lái)賓操作系統(tǒng),Guest OS)和各種應(yīng)用,并且把Guest OS和上面應(yīng)用軟件對(duì)硬件資源的訪問(wèn)轉(zhuǎn)發(fā)到底層的硬件上來(lái)實(shí)現(xiàn)。對(duì)于Guest OS和上面的應(yīng)用程序來(lái)說(shuō),這臺(tái)虛擬機(jī)和普通的物理計(jì)算機(jī)是完全一樣沒(méi)有任何區(qū)別的——除了性能可能差一點(diǎn)。著名的VMware就是這么一個(gè)軟件,這類軟件英語(yǔ)有一個(gè)專用的單詞是Hypervisor(維基的Hypervisor詞條說(shuō)另一種叫法是虛擬機(jī)監(jiān)視器,Virtual Machine Monitor,vmm。但我個(gè)人覺(jué)得叫虛擬機(jī)管理器,Virtual Machine Manager,更合適一點(diǎn),雖然可能會(huì)和微軟的System Center Virtual Machine Manager以及Redhat的Virtual Machine Manager這兩個(gè)軟件混淆),中文大概應(yīng)該叫虛擬化軟件/應(yīng)用之類的。

Hypervisor根據(jù)其對(duì)硬件資源的訪問(wèn)方式,可以分為兩大類,Type I是Hypervisor直接訪問(wèn)硬件資源,通常會(huì)有另一個(gè)操作系統(tǒng)運(yùn)行于Hypervisor之上來(lái)對(duì)硬件資源,例如VMware EXSi,Windows的Hyper-V,Linux的Xen;Type II是Hypervisor和普通的應(yīng)用一樣,運(yùn)行在某個(gè)操作系統(tǒng)(例如Windows或者Linux等,這里稱之為宿主機(jī)操作系統(tǒng),Host OS)之上,Hypervisor通過(guò)Host OS訪問(wèn)硬件資源,例如VMware Workstation,Virtual Box等。兩種類型的Hypervisor區(qū)別如圖所示。
                           
+-----+-----+-----+-----+  
|App A|App B|App C|App D|  
+-----+-----+-----+-----+  
|Guest|Guest|Guest|Guest|  
| OS0 | OS1 | OS2 | OS3 |  
+-----+-----+-----+-----+  
|        Hypervisor     |  
+-----------------------+  
|        Hardware       |  
+-----------------------+  
          Type I           


+-----+-----+-----+-----+
|App A|App B|App C|App D|
+-----+-----+-----+-----+
|Guest|Guest|Guest|Guest|
| OS0 | OS1 | OS2 | OS3 |
+-----+-----+-----+-----+
|        Hypervisor     |
+-----------------------+
|         Host OS       |
+-----------------------+
|        Hardware       |
+-----------------------+
          Type II

虛擬機(jī)的一個(gè)缺點(diǎn)在于Guest OS通常會(huì)占用不少硬件資源。例如Windows安裝開機(jī)不運(yùn)行任何運(yùn)用,就需要占用2~3G內(nèi)存,20~30G硬盤空間。即使是沒(méi)有圖形界面的Linux,根據(jù)發(fā)行版以及安裝軟件的不同也會(huì)占用100~1G內(nèi)存,1~4G硬盤空間。而且為了應(yīng)用系統(tǒng)運(yùn)行的性能,往往還要給每臺(tái)虛擬機(jī)留出更多的內(nèi)存容量。雖然不少Hypervisor支持動(dòng)態(tài)內(nèi)存,但基本上都會(huì)降低虛擬機(jī)的性能。如果說(shuō)這樣的資源占用少量的虛擬機(jī)還可以接受的話,同時(shí)運(yùn)行十?dāng)?shù)臺(tái)數(shù)十臺(tái)虛擬機(jī)的時(shí)候,浪費(fèi)的硬件資源就相當(dāng)可觀了。通常來(lái)說(shuō),其中相當(dāng)大部分甚至全部Guest OS都是相同的。

能不能所有的應(yīng)用使用同一個(gè)的操作系統(tǒng)減少硬件資源的浪費(fèi),但是又能避免包括運(yùn)行庫(kù)運(yùn)行庫(kù)在內(nèi)的軟件沖突呢?操作系統(tǒng)層虛擬化——容器概念的提出,就是為了解決這個(gè)問(wèn)題。在Linux可以通過(guò)控制組(Control Group,通常簡(jiǎn)寫為cgroup)隔離,并把應(yīng)用和運(yùn)行庫(kù)打包在一起,來(lái)實(shí)現(xiàn)這個(gè)目的。容器和Type II虛擬機(jī)、物理機(jī)的區(qū)別見(jiàn)下圖:

+-----+-----+-----+-----+      
|App A|App B|App C|App D|      
+-----+-----+-----+-----+      
|+---------------------+|      
||   Runtime Library   ||      
|+---------------------+|      
||       Kernel        ||      
|+---------------------+|      
|   Operating System    |      
+-----------------------+      
|       Hardware        |      
+-----------------------+      
    Physical Machine           


                           
+-----+-----+-----+-----+
|App A|App B|App C|App D|
+-----+-----+-----+-----+
|Lib A|Lib B|Lib C|Lib D|
+-----+-----+-----+-----+
|    Container Engine   |
+-----------------------+
|         Host OS       |
+-----------------------+
|        Hardware       |
+-----------------------+
        Container        


+-----+-----+-----+-----+
|App A|App B|App C|App D|
+-----+-----+-----+-----+
|Guest|Guest|Guest|Guest|
| OS0 | OS1 | OS2 | OS3 |
+-----+-----+-----+-----+
|        Hypervisor     |
+-----------------------+
|         Host OS       |
+-----------------------+
|        Hardware       |
+-----------------------+
    Type II Hypervisor

上圖中,每一個(gè)App和Lib的組合,就是一個(gè)容器。也就是Docker圖標(biāo)里面的一個(gè)集裝箱。和虛擬機(jī)相比,容器有以下優(yōu)點(diǎn):
1.迅速啟動(dòng):沒(méi)有虛擬機(jī)硬件的初始化,沒(méi)有Guest OS的啟動(dòng)過(guò)程,可以節(jié)約很多啟動(dòng)時(shí)間,這就是容器的“開箱即用”。
2.占用資源少:沒(méi)有運(yùn)行Guest OS所需的內(nèi)存開銷,無(wú)需為虛擬機(jī)預(yù)留運(yùn)行內(nèi)存,無(wú)需安裝、運(yùn)行App不需要的運(yùn)行庫(kù)/操作系統(tǒng)服務(wù),內(nèi)存占用、存儲(chǔ)空間占用都小的多。相同配置的服務(wù)器,如果運(yùn)行虛擬機(jī)只能運(yùn)行十多臺(tái)的,通??梢赃\(yùn)行上百個(gè)容器毫無(wú)壓力——當(dāng)然前提是單個(gè)容器應(yīng)用本身不會(huì)消耗太多資源。
當(dāng)然,和虛擬機(jī)相比,因?yàn)楣灿脙?nèi)核,只靠cgroup隔離,應(yīng)用之間的隔離是不如虛擬機(jī)徹底的,如果某個(gè)應(yīng)用運(yùn)行時(shí)導(dǎo)致內(nèi)核崩潰,所有的容器都會(huì)崩潰。而虛擬機(jī)內(nèi)的應(yīng)用崩潰,理論上是不會(huì)影響其它虛擬機(jī)以及上面運(yùn)行的應(yīng)用的,除非是硬件或者Hypervisor有Bug。

Docker把App和Lib的文件打包成為一個(gè)鏡像,并且采用類似多次快照的存儲(chǔ)技術(shù),例如aufs/device mapper/btrfs/zfs等,可以實(shí)現(xiàn):
1.多個(gè)App可以共用相同的底層鏡像(初始的操作系統(tǒng)鏡像)
2.App運(yùn)行時(shí)的IO操作和鏡像文件隔離;
3.通過(guò)掛載包含不同配置/數(shù)據(jù)文件的目錄或者卷(Volume),單個(gè)App鏡像可以同時(shí)用來(lái)運(yùn)行無(wú)數(shù)個(gè)不同業(yè)務(wù)的容器。


+---------+  +---------+  +---------+ 
| abc.com |  | def.com |  | xyz.com | 
+----+----+  +----+----+  +----+----+ 
     |            |            |      
+----+----+  +----+----+  +----+----+ 
|   abc   |  | def.com |  | xyz.com | 
| config  |  | config  |  | config  | 
|  data   |  |  data   |  |  data   | 
+----+----+  +----+----+  +----+----+ 
     |            |            |      
     +------------+------------+      
                  |                   
           +------+------+            
           | Nginx Image |            
           +------+------+            
                  |                   
                  1                   


   +-----+ +-----+ +-----+
   | DB1 | | DB2 | | DB3 |    
   +--+--+ +--+--+ +--+--+    
      |       |       |
   +--+--+ +--+--+ +--+--+    
   | DB1 | | DB2 | | DB3 |
   | conf| | conf| | conf|
   | data| | data| | data|
   +--+--+ +--+--+ +--+--+
      |       |       |
      +-------+-------+
              |
       +------+------+          
       | MySQL Image |
       +------+------+
              |
              2



1                                 2
|                                 |
+----------------+----------------+
                 |
          +------+-------+ 
          | Alpine Image |
          +------+-------+

上圖是基于一個(gè)Alpine Linux的鏡像,分別建立了Nginx和MySQL的鏡像,并且掛載不同的配置/數(shù)據(jù)同時(shí)運(yùn)行3個(gè)網(wǎng)站應(yīng)用3個(gè)數(shù)據(jù)庫(kù)應(yīng)用的示意圖。

此外,Docker公司提供公共的鏡像倉(cāng)庫(kù)(Docker稱之為Repository),Github connect,自動(dòng)構(gòu)建鏡像,大大簡(jiǎn)化了應(yīng)用分發(fā)、部署、升級(jí)流程。加上Docker可以非常方便的建立各種自定義的鏡像文件,這些都是Docker成為最流行的容器技術(shù)的重要因素。

通過(guò)以上這些技術(shù)的組合,最后的結(jié)果就是,絕大部分應(yīng)用,開發(fā)者都可以通過(guò)docker build創(chuàng)建鏡像,通過(guò)docker push上傳鏡像,用戶通過(guò)docker pull下載鏡像,用docker run運(yùn)行應(yīng)用。用戶不需要再去關(guān)心如何搭建環(huán)境,如何安裝,如何解決不同發(fā)行版的庫(kù)沖突——而且通常不會(huì)需要消耗更多的硬件資源,不會(huì)明顯降低性能。這就是其他答主所說(shuō)的標(biāo)準(zhǔn)化、集裝箱的原因所在。

題外話:除了Docker以外,還有其它很多種容器,例如Linux上的LXC、OpenVZ,F(xiàn)reeBSD的Jail,Solaris的Zones等等。此外,Unix-Like操作系統(tǒng)的chroot命令從某種角度來(lái)說(shuō)也是一種特殊的容器實(shí)現(xiàn)方式。和*nix采用宏內(nèi)核,且內(nèi)核和各種運(yùn)行庫(kù)耦合松散,很方便實(shí)現(xiàn)容器不同,Windows因?yàn)椴捎梦?nèi)核,且內(nèi)核與各種運(yùn)行庫(kù)耦合緊密,雖然從Windows 10/2016開始也支持容器,但事實(shí)上還是通過(guò)Hyper-V運(yùn)行不同的虛擬機(jī)進(jìn)行內(nèi)核級(jí)隔離——雖然也有線程級(jí)的隔離,但只有Windows Server支持,并且只能運(yùn)行相同版本的鏡像[1]。而且即使是Hyper-V,也只支持運(yùn)行更低版本的鏡像而不能運(yùn)行更高版本的鏡像。另外Windows容器的鏡像體積通常還是很大。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多