什么是Docker?
docker的英文本意是碼頭工人,也就是搬運(yùn)工,這種搬運(yùn)工搬運(yùn)的是集裝箱(Container),集裝箱里面裝的可不是商品貨物,而是任意類型的App,Docker把App(叫Payload)裝在Container內(nèi),通過Linux Container技術(shù)的包裝將App變成一種標(biāo)準(zhǔn)化的、可移植的、自管理的組件,這種組件可以在你的latop上開發(fā)、調(diào)試、運(yùn)行,最終非常方便和一致地運(yùn)行在production環(huán)境下。
Docker的核心底層技術(shù)是LXC(Linux Container),Docker在其上面加了薄薄的一層,添加了許多有用的功能。這篇stackoverflow上的問題和答案很好地詮釋了Docker和LXC的區(qū)別,能夠讓你更好的了解什么是Docker, 簡(jiǎn)單翻譯下就是以下幾點(diǎn):
Docker提供了一種可移植的配置標(biāo)準(zhǔn)化機(jī)制,允許你一致性地在不同的機(jī)器上運(yùn)行同一個(gè)Container;而LXC本身可能因?yàn)椴煌瑱C(jī)器的不同配置而無法方便地移植運(yùn)行;
Docker以App為中心,為應(yīng)用的部署做了很多優(yōu)化,而LXC的幫助腳本主要是聚焦于如何機(jī)器啟動(dòng)地更快和耗更少的內(nèi)存;
Docker為App提供了一種自動(dòng)化構(gòu)建機(jī)制(Dockerfile),包括打包,基礎(chǔ)設(shè)施依賴管理和安裝等等;
Docker提供了一種類似git的Container版本化的機(jī)制,允許你對(duì)你創(chuàng)建過的容器進(jìn)行版本管理,依靠這種機(jī)制,你還可以下載別人創(chuàng)建的Container,甚至像git那樣進(jìn)行合并;
Docker Container是可重用的,依賴于版本化機(jī)制,你很容易重用別人的Container(叫Image),作為基礎(chǔ)版本進(jìn)行擴(kuò)展;
Docker Container是可共享的,有點(diǎn)類似github一樣,Docker有自己的INDEX,你可以創(chuàng)建自己的Docker用戶并上傳和下載Docker Image;
Docker提供了很多的工具鏈,形成了一個(gè)生態(tài)系統(tǒng);這些工具的目標(biāo)是自動(dòng)化、個(gè)性化和集成化,包括對(duì)PAAS平臺(tái)的支持等;
那么Docker有什么用呢?對(duì)于運(yùn)維來說,Docker提供了一種可移植的標(biāo)準(zhǔn)化部署過程,使得規(guī)?;⒆詣?dòng)化、異構(gòu)化的部署成為可能甚至是輕松簡(jiǎn)單的事情;而對(duì)于開發(fā)者來說,Docker提供了一種開發(fā)環(huán)境的管理方法,包括映像、構(gòu)建、共享等功能。
Docker vs. VM
從下圖可以看出,VM是一個(gè)運(yùn)行在宿主機(jī)之上的完整的操作系統(tǒng),VM運(yùn)行自身操作系統(tǒng)會(huì)占用較多的CPU、內(nèi)存、硬盤資源。Docker不同于VM,只包含應(yīng)用程序以及依賴庫(kù),基于libcontainer運(yùn)行在宿主機(jī)上,并處于一個(gè)隔離的環(huán)境中,這使得Docker更加輕量高效,啟動(dòng)容器只需幾秒鐘之內(nèi)完成。由于Docker輕量、資源占用少,使得Docker可以輕易的應(yīng)用到構(gòu)建標(biāo)準(zhǔn)化的應(yīng)用中。但Docker目前還不夠完善,比如隔離效果不如VM,共享宿主機(jī)操作系統(tǒng)的一些基礎(chǔ)庫(kù)等;網(wǎng)絡(luò)配置功能相對(duì)簡(jiǎn)單,主要以橋接方式為主;查看日志也不夠方便靈活。
另外,IBM發(fā)表了一篇關(guān)于虛擬機(jī)和Linux container性能對(duì)比的論文,論文中實(shí)際測(cè)試了虛擬機(jī)和Linux container在CPU、內(nèi)存、存儲(chǔ)IO以及網(wǎng)絡(luò)的負(fù)載情況,結(jié)果顯示Docker容器本身幾乎沒有什么開銷,但是使用AUFS會(huì)一定的性能損耗,不如使用Docker Volume,Docker的NAT在較高網(wǎng)絡(luò)數(shù)據(jù)傳輸中會(huì)引入較大的工作負(fù)載,帶來額外的開銷。不過container的性能與native相差不多,各方面的性能都一般等于或者優(yōu)于虛擬機(jī)。Container和虛擬機(jī)在IO密集的應(yīng)用中都需要調(diào)整優(yōu)化以更好的支持IO操作,兩者在IO密集型的應(yīng)用中都應(yīng)該謹(jǐn)慎使用。
Docker組件
Docker是CS架構(gòu),主要由下面三部分組成:
Docker daemon: 運(yùn)行在宿主機(jī)上,Docker守護(hù)進(jìn)程,用戶通過Docker client(Docker命令)與Docker daemon交互
Docker client: Docker 命令行工具,是用戶使用Docker的主要方式,Docker client與Docker daemon通信并將結(jié)果返回給用戶,Docker client也可以通過socket或者RESTful api訪問遠(yuǎn)程的Docker daemon
Docker hub/registry: 共享和管理Docker鏡像,用戶可以上傳或者下載上面的鏡像,官方地址為https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry。
了解了Docker的組成,再來了解一下Docker的兩個(gè)主要概念:
Docker image:鏡像是只讀的,鏡像中包含有需要運(yùn)行的文件。鏡像用來創(chuàng)建container,一個(gè)鏡像可以運(yùn)行多個(gè)container;鏡像可以通過Dockerfile創(chuàng)建,也可以從Docker hub/registry上下載。
Docker container:容器是Docker的運(yùn)行組件,啟動(dòng)一個(gè)鏡像就是一個(gè)容器,容器是一個(gè)隔離環(huán)境,多個(gè)容器之間不會(huì)相互影響,保證容器中的程序運(yùn)行在一個(gè)相對(duì)安全的環(huán)境中。
Docker網(wǎng)絡(luò)
Docker的網(wǎng)絡(luò)功能相對(duì)簡(jiǎn)單,沒有過多復(fù)雜的配置,Docker默認(rèn)使用birdge橋接方式與容器通信,啟動(dòng)Docker后,宿主機(jī)上會(huì)產(chǎn)生docker0這樣一個(gè)虛擬網(wǎng)絡(luò)接口, docker0不是一個(gè)普通的網(wǎng)絡(luò)接口, 它是一個(gè)虛擬的以太網(wǎng)橋,可以為綁定到docker0上面的網(wǎng)絡(luò)接口自動(dòng)轉(zhuǎn)發(fā)數(shù)據(jù)包,這樣可以使容器與宿主機(jī)之間相互通信。每次Docker創(chuàng)建一個(gè)容器,會(huì)產(chǎn)生一對(duì)虛擬接口,在宿主機(jī)上執(zhí)行ifconfig,會(huì)發(fā)現(xiàn)多了一個(gè)類似veth****這樣的網(wǎng)絡(luò)接口,它會(huì)綁定到docker0上,由于所有容器都綁定到docker0上,容器之間也就可以通信。
在宿主機(jī)上執(zhí)行ifconfig,會(huì)看到docker0這個(gè)網(wǎng)絡(luò)接口, 啟動(dòng)一個(gè)container,再次執(zhí)行ifconfig, 會(huì)有一個(gè)類似veth****的interface,每個(gè)container的缺省路由是宿主機(jī)上docker0的ip,在container中執(zhí)行netstat -r可以看到如下圖所示內(nèi)容:
容器中的默認(rèn)網(wǎng)關(guān)跟docker0的地址是一樣的:
當(dāng)容器退出之后,veth*虛擬接口也會(huì)被銷毀。
除bridge方式,Docker還支持host、container、none三種網(wǎng)絡(luò)通信方式,使用其它通信方式,只要在Docker啟動(dòng)時(shí),指定--net參數(shù)即可,比如:
新聞熱點(diǎn)
疑難解答
圖片精選