Docker為什么會(huì)火

小編給大家分享一下Docker為什么會(huì)火,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)是一家專業(yè)提供石阡企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站建設(shè)、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為石阡眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

Docker 是容器管理工具

Docker 是一個(gè)輕量級(jí)、便攜式、與外界隔離的容器,也是一個(gè)可以在容器中很方便地構(gòu)建、傳輸、運(yùn)行應(yīng)用的引擎。和傳統(tǒng)的虛擬化技術(shù)不同的是,Docker 引擎并不虛擬出一臺(tái)虛擬機(jī),而是直接使用宿主機(jī)的內(nèi)核和硬件,直接在宿主機(jī)上運(yùn)行容器內(nèi)應(yīng)用。也正是得益于此,Docker 容器內(nèi)運(yùn)行的應(yīng)用和宿主機(jī)上運(yùn)行的應(yīng)用性能差距幾乎可以忽略不計(jì)。 

但是 Docker 本身并不是一個(gè)容器系統(tǒng),而是一個(gè)基于原有的容器化工具 LXC 用來(lái)創(chuàng)建虛擬環(huán)境的工具。類(lèi)似 LXC 的工具已經(jīng)在生產(chǎn)環(huán)境中使用多年,Docker 則基于此提供了更加友好的鏡像管理工具和部署工具。 

Docker 不是虛擬化引擎 

Docker 第一次發(fā)布的時(shí)候,很多人都拿 Docker 和虛擬機(jī) VMware、KVM 和 VirtualBox 比較。盡管從功能上看,Docker 和虛擬化技術(shù)致力于解決的問(wèn)題都差不多,但是 Docker 卻是采取了另一種非常不同的方式。虛擬機(jī)是虛擬出一套硬件,虛擬機(jī)的系統(tǒng)進(jìn)行的磁盤(pán)操作,其實(shí)都是在對(duì)虛擬出來(lái)的磁盤(pán)進(jìn)行操作。當(dāng)運(yùn)行 CPU 密集型的任務(wù)時(shí),是虛擬機(jī)把虛擬系統(tǒng)里的 CPU 指令“翻譯”成宿主機(jī)的CPU指令并進(jìn)行執(zhí)行。兩個(gè)磁盤(pán)層,兩個(gè)處理器調(diào)度器,兩個(gè)操作系統(tǒng)消耗的內(nèi)存,所有虛擬出的這些都會(huì)帶來(lái)相當(dāng)多的性能損失,一臺(tái)虛擬機(jī)所消耗的硬件資源和對(duì)應(yīng)的硬件相當(dāng),一臺(tái)主機(jī)上跑太多的虛擬機(jī)之后就會(huì)過(guò)載。而 Docker 就沒(méi)有這種顧慮。Docker 運(yùn)行應(yīng)用采取的是“容器”的解決方案:使用 namespace 和 CGroup 進(jìn)行資源限制,和宿主機(jī)共享內(nèi)核,不虛擬磁盤(pán),所有的容器磁盤(pán)操作其實(shí)都是對(duì) /var/lib/docker/ 的操作。簡(jiǎn)言之,Docker 其實(shí)只是在宿主機(jī)中運(yùn)行了一個(gè)受到限制的應(yīng)用程序。

從上面不難看出,容器和虛擬機(jī)的概念并不相同,容器也并不能取代虛擬機(jī)。在容器力所不能及的地方,虛擬機(jī)可以大顯身手。例如:宿主機(jī)是 Linux,只能通過(guò)虛擬機(jī)運(yùn)行 Windows,Docker 便無(wú)法做到。再例如,宿主機(jī)是 Windows,Windows 并不能直接運(yùn)行 Docker,Windows上的 Docker 其實(shí)是運(yùn)行在 VirtualBox 虛擬機(jī)里的。 

Docker 使用層級(jí)的文件系統(tǒng) 

前面提到過(guò),Docker 和現(xiàn)有容器技術(shù) LXC 等相比,優(yōu)勢(shì)之一就是 Docker 提供了鏡像管理。對(duì)于 Docker 而言,鏡像是一個(gè)靜態(tài)的、只讀的容器文件系統(tǒng)的快照。然而不僅如此,Docker 中所有的磁盤(pán)操作都是對(duì)特定的Copy-On-Write文件系統(tǒng)進(jìn)行的。下面通過(guò)一個(gè)例子解釋一下這個(gè)問(wèn)題。 

例如我們要建立一個(gè)容器運(yùn)行 JAVA Web 應(yīng)用,那么我們應(yīng)該使用一個(gè)已經(jīng)安裝了 JAVA 的鏡像。在 Dockerfile(一個(gè)用于生成鏡像的指令文件)中,應(yīng)該指明“基于 JAVA 鏡像”,這樣 Docker 就會(huì)去 Docker Hub Registry 上下載提前構(gòu)建好的 JAVA 鏡像。然后再 Dockerfile 中指明下載并解壓 Apache Tomcat 軟件到 /opt/tomcat 文件夾中。這條命令并不會(huì)對(duì)原有的 JAVA 鏡像產(chǎn)生任何影響,而僅僅是在原有鏡像上面添加了一個(gè)改動(dòng)層。當(dāng)一個(gè)容器啟動(dòng)時(shí),容器內(nèi)的所有改動(dòng)層都會(huì)啟動(dòng),容器會(huì)從第一層中運(yùn)行 /usr/bin/java 命令,并且調(diào)用另外一層中的 /opt/tomcat/bin 命令。實(shí)際上,Dockerfile 中每一條指令都會(huì)產(chǎn)生一個(gè)新的改動(dòng)層,即便只有一個(gè)文件被改動(dòng)。如果用過(guò) Git 就能更清楚地認(rèn)識(shí)這一點(diǎn),每條指令就像是每次 commit,都會(huì)留下記錄。但是對(duì)于 Docker 來(lái)說(shuō),這種文件系統(tǒng)提供了更大的靈活性,也可以更方便地管理應(yīng)用程序。 

我們Spantree的團(tuán)隊(duì)有一個(gè)自己維護(hù)的含有 Tomcat 的鏡像。發(fā)布新版本也非常簡(jiǎn)單:使用 Dockerfile 將新版本拷貝進(jìn)鏡像從而創(chuàng)建一個(gè)新鏡像,然后給新鏡像貼上版本的標(biāo)簽。不同版本的鏡像的不同之處僅僅是一個(gè) 90 MB 大小的 WAR 文件,他們所基于的主鏡像都是相同的。如果使用虛擬機(jī)去維護(hù)這些不同的版本的話,還要消耗掉很多不同的磁盤(pán)去存儲(chǔ)相同的系統(tǒng),而使用 Docker 就只需要很小的磁盤(pán)空間。即便我們同時(shí)運(yùn)行這個(gè)鏡像的很多實(shí)例,我們也只需要一個(gè)基礎(chǔ)的 JAVA / TOMCAT 鏡像。 

Docker 可以節(jié)約時(shí)間 

很多年前我在為一個(gè)連鎖餐廳開(kāi)發(fā)軟件時(shí),僅僅是為了描述如何搭建環(huán)境都需要寫(xiě)一個(gè) 12 頁(yè)的 Word 文檔。例如本地 Oracle 數(shù)據(jù)庫(kù),特定版本的 JAVA,以及其他七七八八的系統(tǒng)工具和共享庫(kù)、軟件包。整個(gè)搭建過(guò)程浪費(fèi)掉了我們團(tuán)隊(duì)每個(gè)人幾乎一天的時(shí)間,如果用金錢(qián)衡量的話,花掉了我們上萬(wàn)美金的時(shí)間成本。雖然客戶已經(jīng)對(duì)這種事情習(xí)以為常,甚至認(rèn)為這是引入新成員、讓成員適應(yīng)環(huán)境、讓自己的員工適應(yīng)我們的軟件所必須的成本,但是相比較起來(lái),我們寧愿把更多的時(shí)間花在為客戶構(gòu)建可以增進(jìn)業(yè)務(wù)的功能上面。 

如果當(dāng)時(shí)有 Docker,那么構(gòu)建環(huán)境就會(huì)像使用自動(dòng)化搭建工具 Puppet / Chef / Salt / Ansible 一樣簡(jiǎn)單,我們也可以把整個(gè)搭建時(shí)間周期從一天縮短為幾分鐘。但是和這些工具不同的地方在于,Docker 可以不僅僅可以搭建整個(gè)環(huán)境,還可以將整個(gè)環(huán)境保存成磁盤(pán)文件,然后復(fù)制到別的地方。需要從源碼編譯 Node.js 嗎?Docker 做得到。Docker 不僅僅可以構(gòu)建一個(gè) Node.js 環(huán)境,還可以將整個(gè)環(huán)境做成鏡像,然后保存到任何地方。當(dāng)然,由于 Docker 是一個(gè)容器,所以不用擔(dān)心容器內(nèi)執(zhí)行的東西會(huì)對(duì)宿主機(jī)產(chǎn)生任何的影響。 

現(xiàn)在新加入我們團(tuán)隊(duì)的人只需要運(yùn)行 docker-compose up命令,便可以喝杯咖啡,然后開(kāi)始工作了。 

Docker 可以節(jié)省開(kāi)銷(xiāo) 

當(dāng)然,時(shí)間就是金錢(qián)。除了時(shí)間外,Docker 還可以節(jié)省在基礎(chǔ)設(shè)施硬件上的開(kāi)銷(xiāo)。高德納和麥肯錫的研究表明,數(shù)據(jù)中心的利用率在 6% – 12% 左右。不僅如此,如果采用虛擬機(jī)的話,你還需要被動(dòng)地監(jiān)控和設(shè)置每臺(tái)虛擬機(jī)的 CPU 硬盤(pán)和內(nèi)存的使用率,因?yàn)椴捎昧遂o態(tài)分區(qū)(static partitioning)所以資源并不能完全被利用。。而容器可以解決這個(gè)問(wèn)題:容器可以在實(shí)例之間進(jìn)行內(nèi)存和磁盤(pán)共享。你可以在同一臺(tái)主機(jī)上運(yùn)行多個(gè)服務(wù)、可以不用去限制容器所消耗的資源、可以去限制資源、可以在不需要的時(shí)候停止容器,也不用擔(dān)心啟動(dòng)已經(jīng)停止的程序時(shí)會(huì)帶來(lái)過(guò)多的資源消耗。凌晨三點(diǎn)的時(shí)候只有很少的人會(huì)去訪問(wèn)你的網(wǎng)站,同時(shí)你需要比較多的資源執(zhí)行夜間的批處理任務(wù),那么可以很簡(jiǎn)單的便實(shí)現(xiàn)資源的交換。 

虛擬機(jī)所消耗的內(nèi)存、硬盤(pán)、CPU 都是固定的,一般動(dòng)態(tài)調(diào)整都需要重啟虛擬機(jī)。而用 Docker 的話,你可以進(jìn)行資源限制,得益于 CGroup,可以很方便動(dòng)態(tài)調(diào)整資源限制,讓然也可以不進(jìn)行資源限制。Docker 容器內(nèi)的應(yīng)用對(duì)宿主機(jī)而言只是兩個(gè)隔離的應(yīng)用程序,并不是兩個(gè)虛擬機(jī),所以宿主機(jī)也可以自行去分配資源。

Docker 有一個(gè)健壯的鏡像托管系統(tǒng) 

前面提到過(guò),這個(gè)托管系統(tǒng)就叫做 Docker Hub Registry。截止到 2015年4月29日,互聯(lián)網(wǎng)上大約有 14000 個(gè)公共的 Docker,而大部分都被托管在 Docker Hub 上面。和 Github 已經(jīng)很大程度上成為開(kāi)源項(xiàng)目的代表一樣,Docker 官方的 Docker Hub 則已經(jīng)是公共 Docker 鏡像的代表。這些鏡像可以作為你應(yīng)用和數(shù)據(jù)服務(wù)的基礎(chǔ)。 

也正是得益于此,你可以隨意嘗試最新的技術(shù):說(shuō)不定有些人就把圖形化數(shù)據(jù)庫(kù)的實(shí)例打包成了 Docker 鏡像托管在上面。再例如 Gitlab,手工搭建 Gitlab 非常困難,譯者不建議普通用戶去手工搭建,而如果使用 Docker Gitlab,這個(gè)鏡像則會(huì)五秒內(nèi)便搭建完成。再例如特定 Ruby 版本的 Rails 應(yīng)用,再例如 Linux 上的 .NET 應(yīng)用,這些都可以使用簡(jiǎn)單的一條 Docker 命令搭建完成。 

Docker 官方鏡像都有 official 標(biāo)簽,安全性可以保證。但是第三方鏡像的安全性無(wú)法保證,所以請(qǐng)謹(jǐn)慎下載第三方鏡像。生產(chǎn)環(huán)境下可以只使用第三方提供的 Dockerfile 構(gòu)建鏡像。 
Docker Github 介紹:5 秒內(nèi)搞定一個(gè) Gitlab 
關(guān)于 Linux 上的 .NET 應(yīng)用和 Rails 應(yīng)用,將會(huì)在以后的文章中做詳細(xì)介紹。 

Docker 可以避免產(chǎn)生 Bug 

Spantree 一直是“固定基礎(chǔ)設(shè)置”(immutable infrastructure)的狂熱愛(ài)好者。換句話說(shuō),除非有心臟出血這種漏洞,我們盡量不對(duì)系統(tǒng)做升級(jí),也盡量不去改變系統(tǒng)的設(shè)置。當(dāng)添加新服務(wù)器的時(shí)候,我們也會(huì)從頭構(gòu)建服務(wù)器的系統(tǒng),然后直接將鏡像導(dǎo)入,將服務(wù)器放入負(fù)載均衡的集群里,然后對(duì)要退休的服務(wù)器進(jìn)行健康檢查,檢查完畢后移除集群。得益于 Docker 鏡像可以很輕松的導(dǎo)入導(dǎo)出,我們可以最大程度地減少因?yàn)榄h(huán)境和版本問(wèn)題導(dǎo)致的不兼容,即便有不兼容了也可以很輕松地回滾。當(dāng)然,有了 Docker,我們?cè)谏a(chǎn)、測(cè)試和開(kāi)發(fā)中的運(yùn)行環(huán)境得到統(tǒng)一。以前在協(xié)同開(kāi)發(fā)時(shí),會(huì)因?yàn)槊總€(gè)人開(kāi)發(fā)的電腦配置不同而導(dǎo)致“在我的電腦上是能運(yùn)行的,你的怎么不行”的情況,而如今 Docker 已經(jīng)幫我們解決了這個(gè)問(wèn)題。 

Docker 目前只能運(yùn)行在 Linux 上

 前面也提到過(guò),Docker 使用的是經(jīng)過(guò)長(zhǎng)時(shí)間生產(chǎn)環(huán)境檢驗(yàn)的技術(shù),雖然這些技術(shù)已經(jīng)都出現(xiàn)很長(zhǎng)時(shí)間了,但是大部分技術(shù)都還是 Linux 獨(dú)有的,例如 LXC 和 Cgroup。也就是說(shuō),截止到現(xiàn)在,Docker 容器內(nèi)只能在 Linux 上運(yùn)行 Linux 上的服務(wù)和應(yīng)用。Microsoft 正在和 Docker 緊密合作,并且已經(jīng)宣布了下一個(gè)版本的 Windows Server 將會(huì)支持 Docker 容器,并且命名為 Windows Docker,估計(jì)采用的技術(shù)應(yīng)該是Hyper-V Container,我們有望在未來(lái)的幾年內(nèi)看到這個(gè)版本。 

除此之外,類(lèi)似 boot2docker 和 Docker Machine 這種工具已經(jīng)可以讓我們?cè)?Mac 和 Windows 下通過(guò)虛擬機(jī)運(yùn)行 Docker 了。

以上是“Docker為什么會(huì)火”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章題目:Docker為什么會(huì)火
標(biāo)題來(lái)源:http://muchs.cn/article48/ipihep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷(xiāo)推廣微信小程序、建站公司微信公眾號(hào)、做網(wǎng)站軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)