docker化你的java应用(上)
前言
在各種技術(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 logo?
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思想?
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),變成容器!(build構(gòu)建鏡像;ship運(yùn)輸鏡像;run運(yùn)行的鏡像就是一個(gè)容器)
?
簡(jiǎn)單示例它們之間的關(guān)系?
本質(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化。
作者:張豐哲
鏈接:https://www.jianshu.com/p/66d611657ed6
來(lái)源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。
總結(jié)
以上是生活随笔為你收集整理的docker化你的java应用(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【网络协议】专题总结以及网络协议高频面试
- 下一篇: docker化你的java应用(下)