還不會Docker?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

Docker簡述

Docker是一種OS虛擬化技術(shù)豺憔,是一個開源的應(yīng)用容器引擎驶拱。它可以讓開發(fā)者將應(yīng)用打包到一個可移植的容器中霜浴,并且該容器可以運(yùn)行在幾乎所有l(wèi)inux系統(tǒng)中(Windows10目前也原生支持,Win10前需要內(nèi)置虛擬機(jī))蓝纲,正所謂“一次打包阴孟,到處運(yùn)行”。

Docker容器的運(yùn)行是完全的沙箱機(jī)制税迷,相互之間不會有任何關(guān)聯(lián)(除非自己串聯(lián)集群)永丝。網(wǎng)絡(luò)、存儲箭养、進(jìn)程等資源慕嚷,不僅對于不同的容器是相互隔離,對于宿主機(jī)和容器直接也是隔離的毕泌,除非你手動映射暴露端口或者掛載存儲卷喝检。

很多人不理解,Docker和虛擬機(jī)到底有什么區(qū)別撼泛。

從這兩張結(jié)構(gòu)圖來看挠说,Docker比虛擬機(jī)少了一層虛擬機(jī)操作系統(tǒng),Docker的應(yīng)用直接Docker引擎上運(yùn)行愿题。由于虛擬機(jī)需要一層操作系統(tǒng)损俭,所以會導(dǎo)致虛擬機(jī)的體積非常大蛙奖,通常在幾G到十幾G之間。并且通常一個虛擬機(jī)上撩炊,不只一個應(yīng)用外永,因此對于整體的虛擬集群管理并不太友好,比較難做到靈活分配拧咳。而一個Docker鏡像的體積大約在幾十M到幾百M(fèi)之間伯顶,一般一個鏡像只打包一個應(yīng)用,由多個鏡像組成一個完整的項(xiàng)目骆膝,并且鏡像易于復(fù)制祭衩,可以跨平臺運(yùn)行,這樣可以使項(xiàng)目的部署管理有更好的靈活性阅签。所以Docker無論從資源消耗上掐暮、管理上、使用上都在虛擬機(jī)之上政钟,因此我們又有何理由不使用這樣的容器化技術(shù)呢路克?

對于容器化技術(shù)的學(xué)習(xí),可謂是深如海养交。從基本的鏡像精算、容器操作,到鏡像的打包碎连、容器的部署灰羽,再到企業(yè)生產(chǎn)級的容器集群管理技術(shù)(Docker官方的Swarm、Google的Kubernetes)鱼辙,如此多的內(nèi)容廉嚼,并不是所有人技術(shù)人員都能一朝學(xué)會。不過除了生產(chǎn)級別的集群管理技術(shù)有難度意外倒戏,其他內(nèi)容從學(xué)習(xí)使用的角度來說怠噪,其實(shí)是非常簡單的,況且K8s這種東西杜跷,對于普通開發(fā)來說也是很少能接觸到傍念。

說到這里,可能還有很多人覺得這個是公司層面葱椭、運(yùn)維層面的操作捂寿,不是很了解Docker對于普通開發(fā)來說,意味著什么孵运,對我們有什么好處秦陋?

多辦公環(huán)境,一鍵部署治笨。假如你在公司一套開發(fā)環(huán)境驳概,在家一套開發(fā)環(huán)境赤嚼,當(dāng)你公司的開發(fā)環(huán)境變更時,在家的環(huán)境就要跟著變顺又,如果是使用Docker更卒,將一些依賴型的應(yīng)用,如Redis稚照、ZK蹂空、Mysql等邊緣服務(wù)都打包在docker里面。無論你在哪里改變了內(nèi)容果录,只要在運(yùn)行時更新下鏡像上枕,就可以按照最新的內(nèi)容去執(zhí)行了,不需要一個手動去安裝弱恒,適配辨萍。

聯(lián)調(diào)測試,無需依賴他人返弹。當(dāng)后端完成對外的接口后锈玉,將后端應(yīng)用打包進(jìn)docker,這樣無論是前端义起、測試拉背,在何地何時都可以自己把容器啟動起來進(jìn)行聯(lián)調(diào)測試,而不需要自己手動一步步地搭建這個后端環(huán)境并扇。

...

下面就來一步步講解下去团,普通開發(fā)所需要的Docker知識抡诞。

概念介紹

學(xué)習(xí)Docker首先要了解下幾個基礎(chǔ)概念:

宿主機(jī)穷蛹,Host,運(yùn)行Docker所在的物理機(jī)昼汗,是Docker運(yùn)行的系統(tǒng)環(huán)境肴熏。

鏡像,Image顷窒,相當(dāng)于一個程序模板蛙吏,通過這個模板可以生成很多個相似的容器⌒可以理解為Java中的類鸦做,它本身不具備執(zhí)行運(yùn)行的能力,是一個對象抽象的模板谓着。每個鏡像可以有多個版本泼诱,用tag來區(qū)分。鏡像可以通過Dockerfile來構(gòu)建赊锚。

容器治筒,Container屉栓,Docker運(yùn)行的最小單位對象。它是通過鏡像實(shí)例化出來的一個可運(yùn)行對象耸袜。容器的修改友多,可以提交反作用于鏡像,更新這個容器的模板堤框。

倉庫域滥,Repository,用于存儲管理鏡像的倉庫蜈抓,類似于git管理代碼的倉庫一樣骗绕,可以管理多版本的鏡像。

鏡像资昧、容器酬土、倉庫的關(guān)系如下:

一句話總結(jié)就是,從倉庫中拉取鏡像格带,利用鏡像生成容器撤缴。基本操作

了解完Docker的基本概念叽唱,我們開始來開始學(xué)習(xí)下入門操作屈呕。此處省略所有的Docker安裝過程,自己去官網(wǎng)下載就行了棺亭,基本是傻瓜式安裝虎眨。

拉取鏡像

通過docker pull ${image_uri}:${image_tag}命令,可以從遠(yuǎn)程倉庫(默認(rèn)是Docker Hub)中拉取所需要的鏡像镶摘。

在Docker Hub的網(wǎng)站上可以搜索下自己需要的鏡像以及版本嗽桩。例如Ubuntu,上面提供了幾個版本凄敢。

我們拉一下16.04版本的ubuntu鏡像碌冶。然后通過docker images命令,查看保存在本地鏡像涝缝,發(fā)現(xiàn)多了一個ubuntu的鏡像扑庞。

容器創(chuàng)建、啟動拒逮、停止罐氨、登入

有了鏡像以后,就可以通過docker run -it ${image_id}創(chuàng)建啟動一個容器了滩援。

image_id是鏡像的id栅隐,通過docker images能查看到,也可以是鏡像名(REPOSITORY:TAG)。

-it可以讓你在啟動后约啊,連上容器的終端邑遏。連上終端后,就可以在里面隨意操作容器里面的內(nèi)容了恰矩。

exit退出容器后记盒,容器就會自動停止了。但是這個容器依然還存在外傅,只是”關(guān)機(jī)“了纪吮。(可以通過ctrl+p,ctrl+q,退出容器登入萎胰,而不關(guān)閉容器)

通過docker ps -a可以看到我們的容器已經(jīng)Exited了碾盟。

通過docker start ${container_id},我們把這個容器再次啟動技竟。通過docker ps(加上*-a包含顯示未啟動的容器)冰肴,可以看到容器的狀態(tài)為UP*。

同理榔组,我們可以通過docker stop ${container_id}來停止容器熙尉,

在用docker start命令的時候,如果不加上*-a*參數(shù)搓扯,默認(rèn)不會連接上容器的检痰。不過我們可以在start后,通過docker attach ${container_id}來登入容器锨推。

通過以上的基本操作铅歼,你基本可以利用docker當(dāng)作一個虛擬機(jī)來使用了。如果想把容器和虛擬機(jī)的網(wǎng)絡(luò)换可、存儲打通椎椰,可以網(wǎng)上搜下了解下網(wǎng)絡(luò)與卷掛載等容器設(shè)置。

更新鏡像

在上面的例子中锦担,我們pull下來的僅僅是一個ubuntu的原始鏡像俭识,并沒有過多的內(nèi)容慨削。下面我們在這個鏡像的容器里面洞渔,安裝一個jdk。

這樣我們的容器里面就有一個jdk了缚态,但是如果我們再用這個ubuntu原始鏡像再創(chuàng)建一個容器磁椒,它是不會用這個jdk的。所以我們就需要把這個容器的內(nèi)容玫芦,提交到鏡像當(dāng)中浆熔。通過docker commit ${container_id} ${repository}:${tag},在本地將容器內(nèi)容提交到鏡像當(dāng)中桥帆。然后就可以擁有一個帶jdk的ubuntu鏡像了医增。

后面我們就可以利用這個鏡像慎皱,生成帶jdk的容器了。以上的更新僅限于在本地的鏡像叶骨,如果想把容器推送到云端就需要用docker push命令茫多。前提是你已經(jīng)登錄了倉庫擁有權(quán)限。

鏡像倉庫

上面提到忽刽,默認(rèn)情況下天揖,倉庫是用Docker Hub。我們pull 和push都是在Docker hub上操作跪帝,但是如果鏡像是內(nèi)部私有使用的話今膊,沒有必要去使用Docker Hub,一個是網(wǎng)絡(luò)慢伞剑,另一個是私有安全性問題斑唬。

針對以上問題,有兩種解決方法黎泣,一個是自己搭建私有服務(wù)赖钞,另一個是用云服務(wù)的鏡像管理平臺(如阿里云的“容器鏡像服務(wù)”)。前者對于一般開發(fā)者來說并沒有必要聘裁,而且還要搞認(rèn)證的雪营,比較麻煩,這里不細(xì)說衡便。下面介紹下如何用阿里云服務(wù)作為自己的私有倉庫献起。

先在阿里云上創(chuàng)建一個鏡像倉庫,獲得一個倉庫地址镣陕,如registry.cn-shenzhen.aliyuncs.com/zackku/jdk谴餐。這里一個倉庫地址,對應(yīng)一種鏡像(tag不同)呆抑。

利用docker login岂嗓,先對阿里云的服務(wù)進(jìn)行登錄苗缩。

然后對上面的jdk鏡像打tag(其實(shí)也是改倉庫源的過程)

最后把鏡像推送到阿里云就行了炸枣。

推送后,就能在阿里云的倉庫上看到這個鏡像踩叭。

通過搭建私有倉庫侈咕,我們就可以完全拋開宿主機(jī)的環(huán)境公罕,構(gòu)建好一個鏡像,就可以到處運(yùn)行了耀销。

Dockerfile構(gòu)建鏡像

從上面介紹楼眷,我們已經(jīng)了解到,如何從拉取一個鏡像、修改容器內(nèi)容罐柳、提交鏡像去構(gòu)建一個我們所需要的鏡像掌腰。但通過這些操作去構(gòu)建一個鏡像,一個是太繁瑣张吉,另一個問題是不清晰辅斟,沒辦法直觀的了解鏡像的構(gòu)成。

Dockerfile就可以很好的解決該問題芦拿。它可以通過編寫一個構(gòu)建過程士飒,來一站式構(gòu)建鏡像。下面同樣以ubuntu為基礎(chǔ)鏡像蔗崎,安裝jdk構(gòu)建一個新鏡像為例酵幕,看看Dockerfile是怎么寫的。

然后執(zhí)行docker build -t registry.cn-shenzhen.aliyuncs.com/zackku/jdk2:1.0 .就能把鏡像構(gòu)建出來了缓苛。

Dockerfile高級技巧

上面是Dockerfile的基本使用芳撒,但實(shí)際情況下我們并不像(或者說不僅是)上面描述那樣去構(gòu)建鏡像。下面介紹兩個常用的使用原則未桥。

分層構(gòu)建笔刹。其實(shí)Docker的鏡像是分層結(jié)構(gòu)的,看回之前推送到遠(yuǎn)端倉庫的例子冬耿。

紅框里面就是鏡像一層層的提交舌菜,如果這層已經(jīng)本地構(gòu)建過了,下次不需要構(gòu)建了亦镶,同理如果遠(yuǎn)端已經(jīng)有這層了日月,也不需要推送這層。而且這種分層是可以在不同鏡像間共享的缤骨,例如不同的Java項(xiàng)目都是依賴于JDK的運(yùn)行環(huán)境爱咬,那么它們就可以共用JDK這層鏡像內(nèi)容。所以绊起,基于這樣的特性精拟,我們就應(yīng)該要分層去構(gòu)建鏡像,抽象鏡像共同點(diǎn)虱歪。具體操作的話蜂绎,我們大致可以去分兩次構(gòu)建鏡像,先構(gòu)建一個base鏡像实蔽,用于不同鏡像的底層荡碾,例如Java項(xiàng)目的所有基礎(chǔ)運(yùn)行環(huán)境,然后再通過base鏡像局装,構(gòu)建develop表層的應(yīng)用鏡像。相當(dāng)于把應(yīng)用程序打包丟到develop層里面。并且這層要告訴Docker是怎么運(yùn)行程序的铐尚。

盡量構(gòu)建小的base層拨脉。鏡像的體積也是在使用Docker的時候要考慮的一個重要因素,因?yàn)槿绻R像的體積過大宣增,在更新鏡像玫膀,拉取鏡像的時候效率會低。尤其在剛剛所說的base層里面爹脾,如果base層做得太大太臃腫帖旨,里面程序過多,不僅僅體積大灵妨,還會讓CPU解阅、網(wǎng)絡(luò)等資源消耗過大。其實(shí)我們在用Docker的時候泌霍,一般是一個容器只包含一個程序項(xiàng)目货抄,關(guān)于這個程序的監(jiān)控、健康等內(nèi)容朱转,在容器外通過k8s等集群管理去做蟹地,所以容器本身只需要保證自己的程序能夠運(yùn)行起來就行了。

至于上面我用ubuntu作為基礎(chǔ)的操作系統(tǒng)是比較多余的藤为,這里推薦只用apline操作系統(tǒng)作為程序的最底層鏡像怪与,它是一款輕型的Linux發(fā)行版,系統(tǒng)體積與運(yùn)行時的資源消耗都相當(dāng)?shù)兔迮保诌m合用于Docker容器琼梆。基于apline的操作系統(tǒng)窿吩,我們在上面添加自己所需要的環(huán)境茎杂,例如安裝一個Tomcat、JDK等纫雁,從而構(gòu)建一個base的鏡像煌往。

上所說的base鏡像,其實(shí)不太需要自己的寫一層Dockfile轧邪,docker官方就直接提供了各種語言刽脖、環(huán)境的基礎(chǔ)鏡像,在github的docker-library里面忌愚。如果再有自己的團(tuán)隊(duì)的運(yùn)行環(huán)境的要求曲管,可以在這個Dockerfile基礎(chǔ)上去添加修改即可,或者再抽象多一層硕糊。

至于Dockfile怎么寫院水,語法是什么腊徙,網(wǎng)上有大把詳細(xì)的說明,由于篇幅問題檬某,不在這里展開撬腾。

docker-compose啟動集群

前面已經(jīng)介紹完一個單獨(dú)的容器是如何構(gòu)建與啟動的了,但我們的項(xiàng)目往往不是只有一個容器的恢恼,把所有程序打包在一個容器不是正確的做法民傻。所以我們怎么去管理啟動這么多的容器,是一個必修的課題场斑。在企業(yè)級的層面漓踢,有K8S,Swarm這種容器編排的管理工具漏隐,但稍微比較復(fù)雜喧半,個人使用的話也沒有太大必要。

這里推薦用Docker官方的docker-compose锁保,它可以把所有的容器編排方式寫在一個文件里薯酝,然后通過docker-compose up命令,就可以把一套的容器按照你的編排全部啟動起來爽柒。

在這個例子的services包含每個容器的配置吴菠,其中的redis、mongodb用的是默認(rèn)的鏡像浩村、默認(rèn)的配置做葵,myproject是我們自己的項(xiàng)目。通過這樣的編排心墅,我們就能讓我們的項(xiàng)目連上redis和mongodb酿矢。最后通過docker-compose up就會自動拉取鏡像,按照編排跑起來了怎燥。

具體的語法也不贅述瘫筐,關(guān)鍵就是容器的卷掛載,網(wǎng)絡(luò)的配置铐姚,端口的暴露策肝,容器的依賴關(guān)系。如果把這套東西用起來隐绵,慢慢自然就會了解之众,重要的是動手去做一遍,嘗試一下依许。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棺禾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子峭跳,更是在濱河造成了極大的恐慌膘婶,老刑警劉巖缺前,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異竣付,居然都是意外死亡诡延,警方通過查閱死者的電腦和手機(jī)滞欠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門古胆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筛璧,你說我怎么就攤上這事逸绎。” “怎么了夭谤?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵棺牧,是天一觀的道長。 經(jīng)常有香客問我朗儒,道長颊乘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任醉锄,我火速辦了婚禮乏悄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恳不。我一直安慰自己檩小,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布烟勋。 她就那樣靜靜地躺著规求,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卵惦。 梳的紋絲不亂的頭發(fā)上阻肿,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音沮尿,去河邊找鬼丛塌。 笑死,一個胖子當(dāng)著我的面吹牛蛹找,可吹牛的內(nèi)容都是我干的姨伤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼庸疾,長吁一口氣:“原來是場噩夢啊……” “哼乍楚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起届慈,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤徒溪,失蹤者是張志新(化名)和其女友劉穎忿偷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臊泌,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲤桥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渠概。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茶凳。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖播揪,靈堂內(nèi)的尸體忽然破棺而出贮喧,到底是詐尸還是另有隱情,我是刑警寧澤猪狈,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布箱沦,位于F島的核電站,受9級特大地震影響雇庙,放射性物質(zhì)發(fā)生泄漏谓形。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一疆前、第九天 我趴在偏房一處隱蔽的房頂上張望寒跳。 院中可真熱鬧,春花似錦峡继、人聲如沸冯袍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽康愤。三九已至,卻和暖如春舶吗,著一層夾襖步出監(jiān)牢的瞬間征冷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工誓琼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留检激,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓腹侣,卻偏偏與公主長得像叔收,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子傲隶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容