前言
在各種技術(shù)大會(huì)(互聯(lián)網(wǎng)架構(gòu)姓迅,云計(jì)算等等)般甲,哪都少不了docker的身影肋乍。docker為啥這么火?因?yàn)樗鉀Q了大部分企業(yè)的痛點(diǎn):快速的持續(xù)集成敷存,服務(wù)的彈性伸縮墓造,部署簡(jiǎn)單,方便了運(yùn)維,而且為企業(yè)節(jié)省了機(jī)器資源滔岳,降低了成本「苡椋現(xiàn)在在很多企業(yè)(騰訊/京東/阿里/小紅書等等)都大規(guī)模使用docker。作為開(kāi)發(fā)工程師谱煤,咱們或多或少需要接觸docker摊求,因?yàn)樵蹅兊某绦蜻\(yùn)行在docker容器當(dāng)中,了解docker刘离,有益無(wú)害室叉。下面我們就進(jìn)入docker的世界吧~
走進(jìn)docker
docker是什么?
docker的官網(wǎng)是:https://www.docker.com/硫惕,上圖是docker的logo:一條鯨魚馱著一些集裝箱在大海中遨游<牒邸(這個(gè)logo非常有意思,蘊(yùn)含了docker的核心思想恼除,稍后分析)
docker官網(wǎng)對(duì)docker的一句話定義是:
“Docker is the world’s leading software containerization platform.”
(docker是全球領(lǐng)先的軟件容器化平臺(tái))
大白話就是:docker是一個(gè)用來(lái)裝應(yīng)用的容器踪旷,就像杯子可以裝水,書包可以放書豁辉,筆筒可以放筆....你可以把任何你想得到的程序放到docker中令野!
docker是跨平臺(tái)的,支持linux/macos/windows徽级,不過(guò)docker是在ubuntu系統(tǒng)上開(kāi)發(fā)的气破,對(duì)于ubuntu支持最好。
理解docker logo
docker logo里面是一條鯨魚馱著一些集裝箱在海中遨游餐抢。
想一下现使,如果沒(méi)有集裝箱,那么貨物是零散的存放旷痕,運(yùn)輸過(guò)程中說(shuō)不定出現(xiàn)破損或者丟失碳锈,如果采用集裝箱,因?yàn)槭敲荛]的苦蒿,標(biāo)準(zhǔn)的殴胧,貨物運(yùn)輸會(huì)很安全。
鯨魚佩迟,游到碼頭拿貨(取集裝箱)团滥,然后出發(fā),運(yùn)輸集裝箱到目的地报强。這種存儲(chǔ)貨物/運(yùn)輸貨物的方式很標(biāo)準(zhǔn)灸姊,保證從一個(gè)地方到另一個(gè)地方,不會(huì)出現(xiàn)問(wèn)題秉溉。
以前力惯,A機(jī)器上運(yùn)行的程序想部署一套到其他機(jī)器上去碗誉,如果采取傳統(tǒng)到方式進(jìn)行文件拷貝等,有可能出現(xiàn)問(wèn)題父晶,采用集裝箱的方式進(jìn)行運(yùn)輸就可以避免哮缺。
既然,集裝箱是標(biāo)準(zhǔn)的甲喝,就是說(shuō)它的操作也是標(biāo)準(zhǔn)的尝苇,比如打開(kāi),關(guān)閉埠胖。這就意味著我們對(duì)應(yīng)用的啟動(dòng)糠溜、停止等將是統(tǒng)一的命令。(不論是nginx,tomcat等等直撤,它們的啟動(dòng)非竿,停止都將是統(tǒng)一的命令!這里說(shuō)的就是docker的api接口的標(biāo)準(zhǔn)化)
集裝箱和集裝箱之間有隔離性谋竖,就好像虛擬機(jī)似的红柱。我們知道虛擬機(jī)可以有自己的內(nèi)存/CPU/硬盤/網(wǎng)卡等,docker差不多圈盔,不過(guò)docker的容器更佳輕量級(jí)豹芯,它的創(chuàng)建、銷毀非城茫快】硐校【docker的隔離性最底層還是依賴linux的lxc(Linux Container容器是一種內(nèi)核虛擬化技術(shù))機(jī)制來(lái)實(shí)現(xiàn)的】
docker的思想解決了哪些問(wèn)題众眨?
“程序在我這里運(yùn)行好好的,咋在你那里就不行了呢容诬?”
一個(gè)普通的java web程序跑起來(lái)娩梨,需要哪些依賴?
操作系統(tǒng)os/jdk/webserver/代碼/配置文件/...
比如览徒,程序中調(diào)用了系統(tǒng)命令狈定,現(xiàn)在os變了;
比如习蓬,jdk版本纽什,編譯使用的是1.8版本,機(jī)器上安裝的是jdk1.6躲叼,無(wú)法識(shí)別class版本芦缰;
比如,tomcat版本枫慷,有些舊版本的配置新版本不支持让蕾;...
針對(duì)這種問(wèn)題浪规,docker的處理方式是,把os/jdk/webserver/代碼等等一個(gè)個(gè)的放到集裝箱中去探孝,打包放到鯨魚上笋婿,由鯨魚給我們送到目的地去,也就是說(shuō)docker解決了運(yùn)行環(huán)境不一致帶來(lái)的問(wèn)題顿颅!
“哪個(gè)大哥又寫死循環(huán)了萌抵,系統(tǒng)又變慢了...”
傳統(tǒng)的方式中元镀,我們一臺(tái)機(jī)器上部署了很多服務(wù),很可能由于其他服務(wù)出現(xiàn)死循環(huán)占領(lǐng)cpu栖疑,日志狂打磁盤爆滿等情況導(dǎo)致我們自己的服務(wù)出現(xiàn)異常。
而docker的隔離性可以完全避免這樣的問(wèn)題遇革,因?yàn)閐ocker在啟動(dòng)的時(shí)候,就給限定了最大能使用的cpu萝快,內(nèi)存,硬盤揪漩,如果超出就kill掉。
“雙十一來(lái)了奄容,又要部署幾千臺(tái)服務(wù)冰更,過(guò)完節(jié)后昂勒,還得下線這么多,累死了...”
對(duì)于大部分系統(tǒng)而言戈盈,流量并不是均勻的奠衔,比如電商系統(tǒng),在11.11大促期間塘娶,就需要臨時(shí)擴(kuò)容機(jī)器归斤,之后在下掉,如果是成百上千臺(tái)血柳,那就給運(yùn)維帶來(lái)非常大的工作量官册,有了docker就變得簡(jiǎn)單了,從5臺(tái)服務(wù)器變成500臺(tái)难捌,5000臺(tái)...都是分分鐘的事情膝宁。(也就是說(shuō)docker解決了快速擴(kuò)容鸦难,彈性伸縮)
docker的三大核心概念
在上面我們大白話說(shuō)了那么多,現(xiàn)在我們需要用專業(yè)術(shù)語(yǔ)來(lái)揭開(kāi)docker的3大核心概念了:鏡像/倉(cāng)庫(kù)/容器员淫。
鏡像(images)合蔽,就是上面我們說(shuō)的集裝箱;
倉(cāng)庫(kù)(repository)介返,就是碼頭拴事;
容器(container),就是運(yùn)行程序的地方圣蝎;
docker運(yùn)行一個(gè)程序的過(guò)程是:去倉(cāng)庫(kù)把鏡像拉到本地刃宵,然后用命令把鏡像運(yùn)行起來(lái),變成容器E枪(build構(gòu)建鏡像牲证;ship運(yùn)輸鏡像;run運(yùn)行的鏡像就是一個(gè)容器)
本質(zhì)來(lái)說(shuō)关面,鏡像就是一系列的文件坦袍,docker利用linux的ufs(聯(lián)合文件系統(tǒng))機(jī)制進(jìn)行存儲(chǔ)來(lái)達(dá)到分層的效果。比如/test1目錄下有a和b兩個(gè)文件等太,test2目錄下有c和d兩個(gè)文件捂齐,那么利用ufs可以達(dá)到/test下有a、b缩抡、c奠宜、d四個(gè)文件,即ufs是一種分層的文件系統(tǒng)缝其,可以將不同的目錄掛到同一個(gè)虛擬文件系統(tǒng)下挎塌。每一層鏡像層加載完畢后,會(huì)被看成同一個(gè)目錄内边,相當(dāng)于只有一個(gè)文件系統(tǒng),docker的這種文件系統(tǒng)就被稱作為鏡像待锈。
容器漠其,上面已經(jīng)提及過(guò),就是一個(gè)進(jìn)程竿音,可以把容器想象成一個(gè)虛擬機(jī)和屎,會(huì)有自己的文件系統(tǒng)。注意容器是可寫的柴信,而鏡像是只讀的宽气,因?yàn)檫\(yùn)行中的程序大部分有寫的需求,比如寫日志绪氛,修改一些文件什么的。如果容器需要對(duì)鏡像層的某些文件作修改争占,該如何處理呢臂痕?那么就把鏡像層中的文件拷貝到容器中猿涨,在容器中進(jìn)行修改,當(dāng)我們的應(yīng)用讀取文件的時(shí)候舆瘪,是從對(duì)頂層容器開(kāi)始查找英古,如果沒(méi)有才會(huì)開(kāi)始查找下一層(這樣我們就能讀取到修改的文件了昙读。)
倉(cāng)庫(kù),這里有點(diǎn)類似maven倉(cāng)庫(kù)的概念唠叛,其實(shí)就是為了傳輸鏡像艺沼。https://hub.docker.com/這個(gè)是docker官網(wǎng)給我們提供的遠(yuǎn)程倉(cāng)庫(kù)地址蕴掏,當(dāng)然公司內(nèi)部一般會(huì)有自己的私有鏡像中心。
上圖中挽荡,可以清楚的看到即供,同一個(gè)鏡像可以生成多個(gè)容器運(yùn)行,容器之間是相互獨(dú)立的青自。
好了,到這里性穿,本篇博客為大家介紹了docker的一些初步知識(shí)需曾,下一篇將帶大家實(shí)踐docker以及分析一個(gè)springboot項(xiàng)目的docker化。