docker

上周對(duì)象突然心血來(lái)潮說(shuō)想養(yǎng)個(gè)小寵物抚笔,我問(wèn)想養(yǎng)啥她又說(shuō)隨便,你看著辦G壤埂J獬取!這我真的比較難辦坝印膨蛮!但是咱們程序員能有個(gè)對(duì)象就不錯(cuò)了,還不趕緊寵著季研,我只能照辦咯敞葛!

我去到了一家寵物店,半天也沒(méi)有找到合適的目標(biāo)训貌。正在我猶豫彷徨之時(shí)制肮,看到了老板門(mén)口魚(yú)缸里面的金魚(yú)游來(lái)游去還挺順眼!于是我問(wèn)老板
??我:老板递沪,金魚(yú)多少錢(qián)豺鼻?
??老板:加魚(yú)缸一起100塊錢(qián)不講價(jià)!
??我:這...便宜一點(diǎn)咯款慨!
??老板:小伙子看你骨骼驚奇儒飒,定是個(gè)養(yǎng)魚(yú)的奇才,2塊錢(qián)賣(mài)給你吧檩奠!但是魚(yú)缸可不能給你桩了!
??我:那,你幫我打包一條吧埠戳,幫我拿個(gè)袋子裝著就好了井誉!

于是我興高采烈的拎著小金魚(yú)就回家了,找了個(gè)大罐子養(yǎng)著整胃!對(duì)象看到我買(mǎi)的小金魚(yú)后露出了幸福的笑容~
??第二天早上對(duì)象把我從睡夢(mèng)中搖醒:“嚶嚶嚶颗圣,人家的小魚(yú)動(dòng)不了了,你賠~~~ ”屁使。于是我很憤怒的跑去寵物店找老板索賠在岂!
??我:你們家賣(mài)的魚(yú)有問(wèn)題,回去就不行了蛮寂!
??老板:不可能蔽午,昨天在我們這都活蹦亂跳的!
??我:就是你們家的魚(yú)有問(wèn)題酬蹋!
??老板:肯定是你自己買(mǎi)的魚(yú)缸有問(wèn)題及老!
??我:手持兩把錕斤拷抽莱,口中疾呼燙燙燙。
??老板:腳踏千朵屯屯屯骄恶,笑看萬(wàn)物锘锘锘岸蜗?

這一幕,似曾相識(shí)叠蝇!像極了我們?cè)陂_(kāi)發(fā)中
??測(cè)試:xx,你的代碼在生產(chǎn)環(huán)境上運(yùn)行有問(wèn)題年缎。
??我:不可能悔捶,我本地都運(yùn)行得好好的。
??測(cè)試:你自己上生產(chǎn)環(huán)境上看单芜。
??我:我不看蜕该,我的代碼在本地沒(méi)問(wèn)題,肯定是運(yùn)維的鍋洲鸠,你去找運(yùn)維堂淡!

或許很多開(kāi)發(fā)人員都有過(guò)上面的經(jīng)歷,程序在本地運(yùn)行都很正常扒腕,一上到生產(chǎn)環(huán)境就崩了绢淀。這是因?yàn)槌绦蚋〗痿~(yú)一樣也會(huì)“水土不服”!而導(dǎo)致程序水土不服的原因一般就是環(huán)境配置的差異!加上現(xiàn)在互聯(lián)網(wǎng)高并發(fā)瘾腰、大流量的訪問(wèn)皆的,一個(gè)應(yīng)用往往需要部署到集群的多臺(tái)機(jī)器上,并且集群擴(kuò)容縮容的需求也比較頻繁蹋盆。如果按照傳統(tǒng)的方式部署费薄,那每一臺(tái)服務(wù)器上都需要裝各種軟件...然后進(jìn)行各種配置...我仿佛看到了“工作996,生病ICU”在向運(yùn)維工程師招手栖雾!

那有沒(méi)有一種方案不僅能屏蔽環(huán)境的差異楞抡,并且還能快速部署呢?既然“水土不服”那我把程序及整個(gè)“水土”都打包遷移析藕,就看你服不服召廷。而docker就是這樣的一種讓你服技術(shù)!

昂噪径,上面的對(duì)象是我自己new的(* ̄︶ ̄)...

Hello Docker

Docker是什么呢柱恤?百度百科是這樣跟我說(shuō)的:Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的鏡像中找爱,然后發(fā)布到任何流行的 Linux或Windows 機(jī)器上梗顺,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制车摄,相互之間不會(huì)有任何接口寺谤。

這段話已經(jīng)很概括的描述了docker是什么仑鸥,docker能干嘛,docker的基本特性变屁!相信剛開(kāi)始接觸docker的你跟我也一樣眼俊,看了幾遍都很懵逼!沒(méi)關(guān)系粟关,看完全文再回頭看這段話疮胖,或許就有不一樣的體會(huì)了!我們先看看docker官方給出的“定妝照”


如果非要我用一句話描述這張圖片闷板,還在上幼兒園的我會(huì)說(shuō):“一條可愛(ài)的鯨魚(yú)背著多個(gè)集裝箱澎灸,暢游在大海里 ”!而現(xiàn)在我會(huì)說(shuō):“docker是一個(gè)運(yùn)行在操作系統(tǒng)上的軟件遮晚,這個(gè)軟件上面可以運(yùn)行多個(gè)相互隔離的容器”性昭!不同的表述,同一個(gè)意思县遣!這條可愛(ài)的鯨魚(yú)就是咱們的docker糜颠,而大海就是我們的操作系統(tǒng),多個(gè)集裝箱就是在docker上運(yùn)行的容器萧求!什么是容器咱們后面會(huì)說(shuō)~

假如你想漂洋過(guò)海來(lái)看我其兴,你可以選擇自己造一條船,這樣你就得自己備足很多干糧饭聚,還得準(zhǔn)備很多一些其他的必需品才能出發(fā)忌警!但是現(xiàn)在有一條鯨魚(yú)游過(guò)來(lái)對(duì)你說(shuō),我這里有很多集裝箱秒梳,里面有你所需要的一切法绵,你選一個(gè)適合你的進(jìn)來(lái)就可以了,我會(huì)帶你乘風(fēng)破浪的酪碘!

看到這里朋譬,你是否對(duì)docker有個(gè)初步的印象了呢?至少知道了:1兴垦、docker是什么徙赢?2、為什么需要docker探越?

與傳統(tǒng)虛擬機(jī)對(duì)比

前面我們說(shuō)過(guò)docker可以實(shí)現(xiàn)虛擬化狡赐,那docker與我們平時(shí)用的虛擬機(jī)有什么區(qū)別和聯(lián)系呢?在那些年我們還買(mǎi)不起云服務(wù)器的時(shí)候钦幔,如果我們想學(xué)linux那就得先安裝一個(gè)創(chuàng)建虛擬機(jī)的軟件枕屉,然后在軟件上面創(chuàng)建虛擬機(jī),然后分配內(nèi)存鲤氢、分配磁盤(pán)搀擂、安裝linux操作系統(tǒng)等等一系列的操作西潘,然后等個(gè)分把鐘讓虛擬機(jī)運(yùn)行起來(lái)~
??為什么傳統(tǒng)虛擬機(jī)啟動(dòng)會(huì)那么慢呢?因?yàn)閭鹘y(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后哨颂,在其上面運(yùn)行一個(gè)完整的操作系統(tǒng)喷市,然后在該系統(tǒng)上面再運(yùn)行所需要的應(yīng)用程序,并且虛擬機(jī)的資源需要提前分配威恼,一旦分配這些資源將全部被占用品姓。但是docker容器內(nèi)的應(yīng)用程序是直接運(yùn)行于宿主的內(nèi)核,容器沒(méi)有自己的內(nèi)核箫措,更加不會(huì)對(duì)硬件進(jìn)行虛擬缭黔。因此docker容器比傳統(tǒng)的虛擬機(jī)更為輕便!但是docker容器技術(shù)也是參考虛擬機(jī)一步一步的迭代優(yōu)化過(guò)來(lái)的蒂破!我們來(lái)看看官方給出的docker容器和傳統(tǒng)虛擬機(jī)的對(duì)比圖:

image

圖中也能看出來(lái),docker就是一個(gè)運(yùn)行在操作系統(tǒng)上的軟件别渔!以后如果想在windows上面學(xué)習(xí)Linux附迷,只需要在本地安裝一個(gè)windows版本的docker,然后看完本文的剩下的部分哎媚,就能輕輕松松的玩轉(zhuǎn)linux啦喇伯!不過(guò)在windows上安裝docker也需要先安裝一個(gè)虛擬機(jī)~

基本組成要素

前面對(duì)docker的基本概念有了個(gè)大致印象,但是到目前為止拨与,可能你對(duì)docker的認(rèn)識(shí)還比較空泛稻据,那下面部分我們就從docker的基本組成要素來(lái)更深入的走進(jìn)docker!docker是一個(gè)client-server的結(jié)構(gòu)买喧!先看看官網(wǎng)給出的架構(gòu)圖:


image

這張圖里面概括了docker的所有的元素捻悯!我們就逐一分析docker客戶(hù)端、docker服務(wù)淤毛、倉(cāng)庫(kù)今缚、鏡像、容器等概念低淡!

docker客戶(hù)端

最左邊是docker的客戶(hù)端姓言,類(lèi)似我們操作mysql的工具navcat,只不過(guò)我們這里的是沒(méi)有圖形化界面的命令終端蔗蹋。docker客戶(hù)端是用戶(hù)與docker服務(wù)交互的窗口何荚!我們能看到圖中就是各種操作的命令!

docker服務(wù)

中間的是docker后臺(tái)運(yùn)行的服務(wù)猪杭,一個(gè)稱(chēng)為docker daemon的守護(hù)進(jìn)程餐塘。可以理解為我們mysql的服務(wù)胁孙,我們的操作命令都是在這部分進(jìn)行處理唠倦!docker deamon監(jiān)聽(tīng)著客戶(hù)端的請(qǐng)求称鳞,并且管理著docker的鏡像、容器稠鼻、網(wǎng)絡(luò)冈止、磁盤(pán)(圖中只列出了鏡像與容器)等對(duì)象。同樣候齿,docker的客戶(hù)端與服務(wù)可以運(yùn)行在同一機(jī)器上熙暴,也可以用某臺(tái)機(jī)器上的客戶(hù)端遠(yuǎn)程連接另一臺(tái)機(jī)器上的docker服務(wù),這跟我們的mysql一樣的呢慌盯。

倉(cāng)庫(kù)

右邊部分是注冊(cè)倉(cāng)庫(kù)周霉,在遠(yuǎn)古時(shí)代做開(kāi)發(fā)的都知道,我們以前需要一個(gè)第三方包的時(shí)候需要去網(wǎng)上下載對(duì)應(yīng)的jar包亚皂,很麻煩不說(shuō)俱箱,還容易下的包是不穩(wěn)定的版本。有了maven之后灭必,我們只要在maven配置文件中引入對(duì)應(yīng)的依賴(lài)狞谱,就可以直接從遠(yuǎn)程倉(cāng)庫(kù)中下載對(duì)應(yīng)版本的jar包了。docker中的倉(cāng)庫(kù)與maven的倉(cāng)庫(kù)是一個(gè)概念禁漓,可以遠(yuǎn)程下載常用的鏡像跟衅,也可以push包到遠(yuǎn)程倉(cāng)庫(kù)(如圖中的redis、nginx等鏡像)播歼,同一個(gè)鏡像又可以有多個(gè)版本伶跷,在docker中稱(chēng)為tag!

鏡像&容器

前面我們有多次提到鏡像和容器秘狞,這是docker里面很核心的兩個(gè)概念叭莫。那鏡像和容器分別是什么呢?鏡像和容器的關(guān)系是什么呢烁试?

??鏡像
??官方給出的定義是:docker鏡像是一個(gè)只讀模板食寡,可以用來(lái)創(chuàng)建docker容器。鏡像是一種輕量級(jí)的廓潜、可執(zhí)行的獨(dú)立軟件包抵皱,用來(lái)打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境開(kāi)發(fā)的軟件。它包含運(yùn)行某個(gè)軟件所需要的所有的內(nèi)容辩蛋,包括代碼呻畸、運(yùn)行時(shí)、庫(kù)悼院、環(huán)境變量伤为、配置文件等。我們開(kāi)發(fā)的web應(yīng)用需要jdk環(huán)境、需要tomcat容器绞愚、需要linux操作系統(tǒng)叙甸,那我們可以把我們所需要的一切都進(jìn)行打包成一個(gè)整體(包括自己開(kāi)發(fā)的web應(yīng)用+jdk+tomcat+centos/ubuntu+各種配置文件)。打包后的鏡像在某臺(tái)機(jī)器上能運(yùn)行位衩,那它就能夠在任何裝有docker的機(jī)器上運(yùn)行裆蒸。

任何鏡像的創(chuàng)建會(huì)基于其他的父鏡像,也就是說(shuō)鏡像是一層套一層糖驴,比如一個(gè)tomcat鏡像僚祷,需要運(yùn)行在centos/ubuntu上,那我們的tomcat鏡像就會(huì)基于centos/ubuntu鏡像創(chuàng)建(在后面的操作部分我們可以通過(guò)命令查看)贮缕,這樣的結(jié)構(gòu)就類(lèi)似于我們吃的洋蔥辙谜,如果你愿意一層一層一層地剝開(kāi)我的心~


image

??容器
??官方給出的定義是:docker的容器是用鏡像創(chuàng)建的運(yùn)行實(shí)例,docker可以利用容器獨(dú)立運(yùn)行一個(gè)或一組應(yīng)用感昼。我們可以使用客戶(hù)端或者API控制容器的啟動(dòng)装哆、開(kāi)始、停止定嗓、刪除烂琴。每個(gè)容器之間是相互隔離的。上一步我們構(gòu)建的鏡像只是一個(gè)靜態(tài)的文件蜕乡,這個(gè)文件需要運(yùn)行就需要變?yōu)槿萜鳎覀兛梢园讶萜骺醋鍪且粋€(gè)簡(jiǎn)易版的linux系統(tǒng)和運(yùn)行在其中的應(yīng)用程序梗夸!就是前面看到的鯨魚(yú)背上的一個(gè)一個(gè)的集裝箱层玲,每個(gè)集裝箱都是獨(dú)立的!

??鏡像與容器關(guān)系
??上面的概念很抽象反症,可以理解為容器就是鏡像的一個(gè)實(shí)例辛块,相信大家都寫(xiě)過(guò)類(lèi)似下面的代碼:

public void Dog extends Animal{  
    ......
}  
......
Dog dog = new Dog()

我們?cè)诖a中定義了一個(gè)Dog類(lèi),這個(gè)類(lèi)就相當(dāng)于一個(gè)鏡像铅碍,可以根據(jù)這個(gè)類(lèi)new出很多的實(shí)例润绵,new出來(lái)的實(shí)例就相當(dāng)于一個(gè)個(gè)的容器。鏡像是靜態(tài)的文件胞谈,而容器就是有生命的個(gè)體尘盼!Dog類(lèi)可以繼承父類(lèi)Animal,如果不顯式的指定繼承關(guān)系烦绳,Dog類(lèi)就默認(rèn)繼承Object類(lèi)卿捎。同樣上面也說(shuō)到過(guò)docker中的鏡像也有繼承關(guān)系,一個(gè)鏡像可以繼承其他的鏡像創(chuàng)建径密,添加新的功能午阵!

看到這里的你是不是對(duì)docker有了更多的了解了呢?我們?cè)倩仡^看看百度百科對(duì)docker的描述享扔,可能你又會(huì)有更深的印象:
??Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎底桂,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的鏡像中植袍,然后發(fā)布到任何流行的 Linux或Windows 機(jī)器上,也可以實(shí)現(xiàn)虛擬化籽懦。容器是完全使用沙箱機(jī)制于个,相互之間不會(huì)有任何接口。

容器數(shù)據(jù)卷

上面說(shuō)到容器是一個(gè)簡(jiǎn)易版的linux系統(tǒng)和運(yùn)行在其中的應(yīng)用程序猫十,那我們的應(yīng)用程序產(chǎn)生的數(shù)據(jù)(比如操作日志览濒、異常日志、數(shù)據(jù))也是在容器內(nèi)的系統(tǒng)中存放的拖云,默認(rèn)不會(huì)做持久化贷笛,我們可以進(jìn)入到容器中查看。但是萬(wàn)一有一天宙项,docker這條鯨魚(yú)不滿(mǎn)人類(lèi)的壓迫乏苦,反抗了...老子打爛你的集裝箱!


image

隨著容器的關(guān)閉尤筐,容器內(nèi)的數(shù)據(jù)也會(huì)丟失汇荐,重新開(kāi)啟的容器不會(huì)加載原來(lái)的數(shù)據(jù)(簡(jiǎn)單說(shuō)就是容器重新啟動(dòng)又是另外一個(gè)實(shí)例了)。那對(duì)容器內(nèi)的數(shù)據(jù)需要持久化到宿主機(jī)上就很有必要了盆繁,這就需要了解我們的容器數(shù)據(jù)卷~

容器數(shù)據(jù)卷的設(shè)計(jì)目的就是做數(shù)據(jù)的持久化容器間的數(shù)據(jù)共享掀淘,數(shù)據(jù)卷完全獨(dú)立于容器的生命周期,也就是說(shuō)就算容器關(guān)閉或者刪除油昂,數(shù)據(jù)也不會(huì)丟失革娄。簡(jiǎn)單點(diǎn)說(shuō)就將宿主機(jī)的目錄掛在到容器,應(yīng)用在容器內(nèi)的數(shù)據(jù)可以同步到宿主機(jī)磁盤(pán)上冕碟,這樣容器內(nèi)產(chǎn)生的數(shù)據(jù)就可以持久化了拦惋。關(guān)于容器卷的命令我們后面會(huì)有操作實(shí)例!

命令操作

上面說(shuō)了那么多安寺,下面就到了咱們的實(shí)操環(huán)節(jié)啦厕妖!這一節(jié)的內(nèi)容會(huì)通過(guò)一些常用的命令讓大家更進(jìn)一步的了解docker,注意L羰言秸!這里只是一些常用的命令來(lái)加深理解,而不是命令大全迎捺!如果沒(méi)有安裝docker的小伙伴可以自己按照官網(wǎng)的文檔進(jìn)行安裝井仰,本文不會(huì)講到這部分的內(nèi)容!所以我假設(shè)你在自己的服務(wù)器上已經(jīng)裝好了docker破加!

幫助命令

1俱恶、docker version 查看docker客戶(hù)端和服務(wù)的版本。

2、docker info 查看docker的基本信息合是,如有多少容器了罪、多少鏡像、docker根目錄等等聪全。

3泊藕、docker --help 查看docker的幫助信息,這個(gè)命令可以查看所有docker支持的命令~

這幾個(gè)命令非常簡(jiǎn)單难礼,有過(guò)一點(diǎn)linux基礎(chǔ)的小伙伴應(yīng)該很容易理解娃圆!

鏡像命令

1、docker images 查看本地主機(jī)上所有的鏡像蛾茉。注意是本地主機(jī)的讼呢!這里能看到鏡像的名稱(chēng)、版本谦炬、id悦屏、大小等基本信息,注意這里的image ID是鏡像的唯一標(biāo)識(shí)键思!還可以通過(guò)docker images tomcat指定某個(gè)具體的鏡像查看對(duì)應(yīng)信息础爬。這里還要注意的是centos的鏡像才200MB的大小,比我們物理機(jī)器上裝的centos要小得多的多吼鳞,這是因?yàn)閏entos的鏡像只保留了linux核心部分看蚜,這也是為什么docker虛擬化技術(shù)比虛擬機(jī)運(yùn)行效率更高的原因!那為什么tomcat的鏡像這么大呢赔桌?那是因?yàn)槲覀冎罢f(shuō)過(guò)我們的鏡像就像一個(gè)洋蔥一樣供炎,是一層套一層的!tomcat的運(yùn)行需要基于centos纬乍、jdk等等鏡像,tomcat在上層所以體積比較大啦裸卫!
??

image

2仿贬、docker rmi 刪除本地的鏡像,如下圖所示墓贿,可以加上-f參數(shù)進(jìn)行強(qiáng)制刪除茧泪。這里的rmi命令跟linux中的刪除命令就很像啦,只是這里加了一個(gè)i代表image聋袋!
??

image

3队伟、docker search 根據(jù)鏡像名稱(chēng)搜索遠(yuǎn)程倉(cāng)庫(kù)中的鏡像!
??

image

4幽勒、docker pull 搜索到某個(gè)鏡像之后就可以從遠(yuǎn)程拉取鏡像啦嗜侮,有點(diǎn)類(lèi)似咱們git中的pull命令头谜,當(dāng)然對(duì)應(yīng)的還有個(gè)docker push的命令粥诫。如圖,如果我們沒(méi)有指定tag,默認(rèn)就會(huì)拉取latest版本坡锡,也可以通過(guò)docker pull tomcat:1.7的方式拉取指定版本!注意這里在拉取鏡像的時(shí)候打印出來(lái)的信息有很多虑椎,這也是前面說(shuō)到的鏡像是一層套一層瘟芝,拉取一個(gè)鏡像也是一層一層的拉取覆醇!
??

image

容器命令

通過(guò)鏡像命令我們就能獲取鏡像朵纷、刪除鏡像等操作啦!鏡像有了下面自然就需要通過(guò)鏡像創(chuàng)建對(duì)應(yīng)的實(shí)例啦永脓,也就是我們的容器袍辞。下面我們以tomcat為例:

1、docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 可以基于某個(gè)鏡像運(yùn)行一個(gè)容器憨奸,如果本地有指定的鏡像則使用本地鏡像革屠,如果沒(méi)有則從遠(yuǎn)程拉取對(duì)應(yīng)的鏡像然后啟動(dòng)!由于這個(gè)命令非常重要排宰,所以下面列出幾個(gè)比較重要的參數(shù):

-d:啟動(dòng)容器似芝,并且后臺(tái)運(yùn)行(docker容器后臺(tái)運(yùn)行,就必須要有一個(gè)前臺(tái)進(jìn)程板甘,容器運(yùn)行的命令如果不是一直掛起的命令党瓮,容器啟動(dòng)后就會(huì)自動(dòng)退出);
-i:以交互模式運(yùn)行容器盐类,通常與-t同時(shí)使用寞奸;
-t:為容器重新分配一個(gè)偽輸入終端,通常與-i同時(shí)使用(容器啟動(dòng)后進(jìn)入到容器內(nèi)部的命令窗口)在跳;
-P:隨機(jī)端口映射枪萄,容器內(nèi)部端口隨機(jī)映射到主機(jī)的高端口;
-p:指定端口映射猫妙,格式為:主機(jī)(宿主)端口:容器端口瓷翻;
-v:建立宿主機(jī)與容器目錄的同步;
--name="myTomcat": 為容器指定一個(gè)名稱(chēng)(如果不指定割坠,則有個(gè)隨機(jī)的名字)齐帚;

image

上面我通過(guò)命令啟動(dòng)了一個(gè)tomcat的容器,由于使用了 -t 的參數(shù)彼哼,所以容器啟動(dòng)后就進(jìn)入到了容器的內(nèi)部的命令窗口对妄,打印了很多tomcat啟動(dòng)的日志。并且使用 -p 參數(shù)指定了端口映射敢朱,也就是容器內(nèi)tomcat運(yùn)行的端口是8080剪菱,并且映射到了宿主機(jī)上的8888端口摩瞎,這樣我們?cè)谕獠烤涂梢酝^(guò)服務(wù)器的ip+8888端口 訪問(wèn)到我們?nèi)萜鲀?nèi)部tomcat部署的服務(wù)了。

前面我們提到過(guò)容器內(nèi)的數(shù)據(jù)會(huì)隨著容器的關(guān)閉而丟失琅豆。那我們就需要有容器數(shù)據(jù)卷的技術(shù)能將容器內(nèi)的數(shù)據(jù)持久化到宿主機(jī)愉豺。這里需要用到 -v 參數(shù)!我們看下面的截圖
??

image

這里第一個(gè)要注意的是我們用的 -d 參數(shù)茫因,啟動(dòng)后沒(méi)有進(jìn)入到容器內(nèi)部蚪拦,還是在宿主機(jī)。(可以對(duì)比一下與上面 -it 參數(shù)的區(qū)別)冻押。第二個(gè)要注意的是 -v /宿主機(jī):/容器內(nèi)目錄 實(shí)現(xiàn)了宿主機(jī)與容器內(nèi)指定目錄的數(shù)據(jù)同步驰贷!容器啟動(dòng)后就可以使用 linux 的 ll 命令查看宿主機(jī)上已經(jīng)同步到了容器內(nèi)的文件。第三個(gè)要注意的是這里的同步是雙向的洛巢,也就是說(shuō)在宿主機(jī)上對(duì)文件的修改也會(huì)同步到容器內(nèi)部括袒!多個(gè)不同的容器映射到宿主機(jī)的同一個(gè)目錄,就可以實(shí)現(xiàn)不同容器間的數(shù)據(jù)共享啦稿茉!
??

image

2锹锰、進(jìn)入到容器后可以通過(guò)exit命令退出容器,也可以通過(guò)ctrl+P+Q快捷鍵退出容器漓库,這兩種方式的不同之處是exit會(huì)退出并且關(guān)閉容器恃慧,而ctrl+P+Q快捷鍵只是單純的退出,容器還在運(yùn)行渺蒿,并且還能再次進(jìn)入痢士!

3、docker ps我們可以通過(guò)該命令查看正在運(yùn)行的容器的信息茂装,這里能看到容器的唯一id怠蹂,啟動(dòng)時(shí)間等等...這里跟linux的ps命令類(lèi)似,所以也可以把容器理解為一個(gè)運(yùn)行在docker上的進(jìn)程少态!docker ps -a可以查看運(yùn)行中與停止的所有容器城侧。
??

image

4、docker attach [OPTIONS] CONTAINER上面說(shuō)過(guò)通過(guò)ctrl+P+Q快捷鍵退出容器后容器還在后臺(tái)運(yùn)行彼妻,那如果想再次進(jìn)入容器怎么辦呢嫌佑?我們就可以通過(guò)attach命令+容器的id再次進(jìn)入容器!

5澳骤、docker exec [OPTIONS] CONTAINER這個(gè)命令與attach一樣都可以再次進(jìn)入后臺(tái)運(yùn)行的容器歧强,但是該命令可以不進(jìn)入容器而在運(yùn)行的容器中執(zhí)行命令澜薄!比attach更加強(qiáng)大为肮!

6、docker stop docker kill docker restart這三個(gè)命令分別用來(lái)停止容器肤京、強(qiáng)制停止容器和重啟容器颊艳,就跟我們?cè)趌inux上停止茅特、強(qiáng)制停止和重啟某個(gè)進(jìn)程一樣的啦,這里就不做演示了棋枕!

7白修、docker rm 使用這個(gè)命令就可以刪除某個(gè)容器,這里跟刪除鏡像的區(qū)別是這里少了一個(gè) i 啦重斑!需要注意的是通過(guò)stop和kill停止的容器還存在于docker中兵睛,而使用 rm 命令操作后的容器將不再存在!
??

image

8窥浪、docker inspect 查看容器的詳情(也能查看鏡像詳情)祖很。

Dockerfile

前面我們對(duì)docker以及相關(guān)概念、常用命令有了基本的了解漾脂,我們也知道了可以從遠(yuǎn)程pull一個(gè)鏡像假颇,那遠(yuǎn)程的鏡像是怎么來(lái)的呢?如果我們想自己創(chuàng)建一個(gè)鏡像又該怎么做呢骨稿?
對(duì)笨鸡,Dockerfile!Dockerfile是一個(gè)包含用戶(hù)能夠構(gòu)建鏡像的所有命令的文本文檔坦冠,它有自己的語(yǔ)法以及命令形耗,docker能夠從dockerfile中讀取指令自動(dòng)的構(gòu)建鏡像!
??我們要想編寫(xiě)自己的Dockerfiler并構(gòu)建鏡像蓝牲,那對(duì)Dockerfile的語(yǔ)法和命令的了解就是必須的趟脂,了解規(guī)則才好辦事嘛!

相關(guān)指令

FROM
??FROM <image> [AS <name>]
??FROM <image>[:<tag>] [AS <name>]
??FROM <image>[@<digest>] [AS <name>]
??指定基礎(chǔ)鏡像例衍,當(dāng)前鏡像是基于哪個(gè)鏡像創(chuàng)建的昔期,有點(diǎn)類(lèi)似java中的類(lèi)繼承。FROM指令必是Dockerfile文件中的首條命令佛玄。

MAINTAINER
??MAINTAINER <name>
??鏡像維護(hù)者的信息硼一,該命令已經(jīng)被標(biāo)記為不推薦使用了。

LABEL
??LABEL <key>=<value> <key>=<value> <key>=<value> ...
??給鏡像添加元數(shù)據(jù)梦抢,可以用LABEL命令替換MAINTAINER命令般贼。指定一些作者、郵箱等信息奥吩。

ENV
??ENV <key> <value>
??ENV <key>=<value> ...
??設(shè)置環(huán)境變量哼蛆,設(shè)置的變量可供后面指令使用。跟java中定義變量差不多的意思霞赫!

WORKDIR
??WORKDIR /path/to/workdir
??設(shè)置工作目錄腮介,在該指令后的RUN、CMD端衰、ENTRYPOINT, COPY叠洗、ADD指令都會(huì)在該目錄執(zhí)行甘改。如果該目錄不存在,則會(huì)創(chuàng)建灭抑!

RUN
??RUN <command>
??RUN ["executable", "param1", "param2"]
??RUN會(huì)在當(dāng)前鏡像的最上面創(chuàng)建一個(gè)新層十艾,并且能執(zhí)行任何的命令,然后對(duì)執(zhí)行的結(jié)果進(jìn)行提交腾节。提交后的結(jié)果鏡像在dockerfile的后續(xù)步驟中可以使用忘嫉。

ADD
??ADD [--chown=<user>:<group>] <src>... <dest>
??ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
??從宿主機(jī)拷貝文件或者文件夾到鏡像,也可以復(fù)制一個(gè)網(wǎng)絡(luò)文件案腺!如果拷貝的文件是一個(gè)壓縮包榄融,會(huì)自動(dòng)解壓縮!

COPY
??COPY [--chown=<user>:<group>] <src>... <dest>
??COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
??從宿主機(jī)拷貝文件或者文件夾到鏡像救湖,不能復(fù)制網(wǎng)絡(luò)文件也不會(huì)自動(dòng)解壓縮愧杯!

VOLUME
??VOLUME ["/data"]
??VOLUME用于創(chuàng)建掛載點(diǎn),一般配合run命令的-v參數(shù)使用鞋既。

EXPOSE
??EXPOSE <port> [<port>/<protocol>...]
??指定容器運(yùn)行時(shí)對(duì)外暴露的端口力九,但是該指定實(shí)際上不會(huì)發(fā)布該端口,它的功能是鏡像構(gòu)建者和容器運(yùn)行者之間的記錄文件邑闺。
??回到容器命令中的run命令部分跌前,run命令有-p和-P兩個(gè)參數(shù),如果是-P就是隨機(jī)端口映射陡舅,容器內(nèi)會(huì)隨機(jī)映射到EXPOSE指定的端口抵乓,如果是-p就是指定端口映射,告訴運(yùn)維人員容器內(nèi)需要映射的端口號(hào)靶衍。

CMD
??CMD ["executable","param1","param2"]
??CMD ["param1","param2"]
??CMD command param1 param2
??指定容器啟動(dòng)時(shí)默認(rèn)運(yùn)行的命令,在一個(gè)Dockerfile文件中灾炭,如果有多個(gè)CMD命令,只有一個(gè)最后一個(gè)會(huì)生效颅眶!同樣是可以執(zhí)行命令蜈出,可能你會(huì)覺(jué)得跟上面的RUN指令很相似,RUN指令是在構(gòu)建鏡像時(shí)候執(zhí)行的涛酗,而CMD指令是在每次容器運(yùn)行的時(shí)候執(zhí)行的铡原!docker run命令會(huì)覆蓋CMD的命令!

ENTRYPOINT
??ENTRYPOINT ["executable", "param1", "param2"]
??ENTRYPOINT command param1 param2
??這個(gè)指令與CMD指令類(lèi)似商叹,都是指定啟動(dòng)容器時(shí)要運(yùn)行的命令燕刻,如果指定了ENTRYPOINT,則CMD指定的命令不會(huì)執(zhí)行剖笙!在一個(gè)Dockerfile文件中卵洗,如果有多個(gè)ENTRYPOINT命令,也只有一個(gè)最后一個(gè)會(huì)生效枯途!不同的是通過(guò)docker run command命令會(huì)覆蓋CMD的命令忌怎!執(zhí)行的命令不會(huì)覆蓋ENTRYPOINT,docker run命令中指定的任何參數(shù)都會(huì)被當(dāng)做參數(shù)傳遞給ENTRYPOINT酪夷!

RUN榴啸、CMD、ENTRYPOINT區(qū)別
1晚岭、RUN指令是在鏡像構(gòu)建時(shí)運(yùn)行鸥印,而后兩個(gè)是在容器啟動(dòng)時(shí)執(zhí)行!
2坦报、CMD指令設(shè)置的命令是容器啟動(dòng)時(shí)默認(rèn)運(yùn)行的命令,如果docker run沒(méi)有指定任何的命令库说,并且Dockerfile中沒(méi)有指定ENTRYPOINT,那容器啟動(dòng)的時(shí)候就會(huì)執(zhí)行CMD指定的命令片择!有點(diǎn)類(lèi)似代碼中的缺省參數(shù)潜的!
3、如果設(shè)置了ENTRYPOINT指令字管,則優(yōu)先使用啰挪!并且可以通過(guò)docker run給該指令設(shè)置的命令傳參!
4嘲叔、CMD有點(diǎn)類(lèi)似代碼中的缺省參數(shù)

USER
??USER <user>[:<group>]
??USER <UID>[:<GID>]
??用于指定運(yùn)行鏡像所使用的用戶(hù)亡呵。

ARG
??ARG <name>[=<default value>]
??指定在鏡像構(gòu)建時(shí)可傳遞的變量,定義的變量可以通過(guò)docker build --build-arg <varname style="box-sizing: border-box;">=<value style="box-sizing: border-box;">的方式在構(gòu)建時(shí)設(shè)置硫戈。</value></varname>

ONBUILD
??ONBUILD [INSTRUCTION]
??當(dāng)所構(gòu)建的鏡像被當(dāng)做其他鏡像的基礎(chǔ)鏡像時(shí)锰什,ONBUILD指定的命令會(huì)被觸發(fā)!

STOPSIGNAL
??STOPSIGNAL signal
??設(shè)置當(dāng)容器停止時(shí)所要發(fā)送的系統(tǒng)調(diào)用信號(hào)丁逝!

HEALTHCHECK
??HEALTHCHECK [OPTIONS] CMD command (在容器內(nèi)運(yùn)行運(yùn)行命令檢測(cè)容器的運(yùn)行情況)
??HEALTHCHECK NONE (禁止從父鏡像繼承檢查)
??該指令可以告訴Docker怎么去檢測(cè)一個(gè)容器的運(yùn)行狀況汁胆!

SHELL
??SHELL ["executable", "parameters"]
??用于設(shè)置執(zhí)行命令所使用的默認(rèn)的shell類(lèi)型!該指令在windows操作系統(tǒng)下比較有用霜幼,因?yàn)閣indows下通常會(huì)有cmd和powershell兩種shell沦泌,甚至還有sh。

構(gòu)建

Dockerfile執(zhí)行順序是從上到下辛掠,順序執(zhí)行谢谦!每條指令都會(huì)創(chuàng)建一個(gè)新的鏡像層,并對(duì)鏡像進(jìn)行提交萝衩。編寫(xiě)好Dockerfile文件后回挽,就需要使用docker build命令對(duì)鏡像進(jìn)行構(gòu)建了。
??docker build的格式:docker build [OPTIONS] PATH | URL | -

-f :指定要使用的Dockerfile路徑猩谊,如果不指定千劈,則在當(dāng)前工作目錄尋找Dockerfile文件!
-t: 鏡像的名字及標(biāo)簽牌捷,通常 name:tag 或者 name 格式墙牌;可以在一次構(gòu)建中為一個(gè)鏡像設(shè)置多個(gè)標(biāo)簽涡驮。

例如我們可以docker build -t myApp:1.0.1 .這樣來(lái)構(gòu)建自己的鏡像,注意后面的 . ,用于指定鏡像構(gòu)建過(guò)程中的上下文環(huán)境的目錄喜滨。如果大家想了解那些官方鏡像的Dockerfile文件都是怎么樣寫(xiě)的捉捅,可以上https://hub.docker.com/ 進(jìn)行搜索,以tomcat鏡像為例
[圖片上傳中...(image-879cbc-1597474088475-2)]

能看到tomcat鏡像的父鏡像是openjdk鏡像虽风,我們?cè)偎阉鱫penjdk的Dockerfile文件

image

openjdk鏡像的父鏡像又是oraclelinux鏡像棒口,我們?cè)偎阉鱫raclelinux的Dockerfile文件

[圖片上傳中...(image-53778f-1597474088475-0)]

openjdk鏡像的父鏡像是scratch,這是根鏡像辜膝,所有的鏡像都會(huì)依賴(lài)該鏡像无牵,就像我們代碼中所有的對(duì)象的父類(lèi)都是Object!所以能看到tomcat鏡像就是這樣一層一層的構(gòu)建出來(lái)的厂抖,這也是為什么前面通過(guò)docker images查看到的tomcat鏡像為什么會(huì)有四百多兆的原因啦茎毁!

看到這里的你,是否對(duì)docker是什么忱辅?為什么需要docker充岛?docker鏡像、docker容器的概念是什么耕蝉?docker中常用的命令有哪些崔梗?Dockerfile有哪些指令?怎么去構(gòu)建自己的鏡像垒在?這些問(wèn)題都能明白了呢蒜魄?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市场躯,隨后出現(xiàn)的幾起案子谈为,更是在濱河造成了極大的恐慌,老刑警劉巖踢关,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伞鲫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡签舞,警方通過(guò)查閱死者的電腦和手機(jī)秕脓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)儒搭,“玉大人吠架,你說(shuō)我怎么就攤上這事÷辏” “怎么了傍药?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拐辽,道長(zhǎng)拣挪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任俱诸,我火速辦了婚禮菠劝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乙埃。我一直安慰自己,他們只是感情好锯岖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布介袜。 她就那樣靜靜地躺著,像睡著了一般出吹。 火紅的嫁衣襯著肌膚如雪遇伞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天捶牢,我揣著相機(jī)與錄音鸠珠,去河邊找鬼。 笑死秋麸,一個(gè)胖子當(dāng)著我的面吹牛渐排,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灸蟆,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼驯耻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了炒考?” 一聲冷哼從身側(cè)響起可缚,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斋枢,沒(méi)想到半個(gè)月后帘靡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓤帚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年描姚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戈次。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轰胁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朝扼,到底是詐尸還是另有隱情赃阀,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站榛斯,受9級(jí)特大地震影響观游,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驮俗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一懂缕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧王凑,春花似錦搪柑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至百姓,卻和暖如春渊额,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垒拢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工旬迹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人求类。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓奔垦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親尸疆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宴倍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 概述 是什么 解決了運(yùn)行環(huán)境和配置問(wèn)題軟件容器鸵贬,方便做持續(xù)集成并有助于整體發(fā)布的容器虛擬化技術(shù)。 一次封裝脖捻,到處運(yùn)...
    none_title閱讀 624評(píng)論 0 0
  • 01【熟悉】docker簡(jiǎn)介 1阔逼,什么是docker Docker是一個(gè)開(kāi)源項(xiàng)目,誕生于2013年初地沮,最初是d...
    北辰_6666閱讀 331評(píng)論 0 0
  • 一嗜浮、docker簡(jiǎn)介 1、為什么會(huì)出現(xiàn)docker摩疑?一般情況下是開(kāi)發(fā)人員開(kāi)發(fā)好代碼危融,本地測(cè)試通過(guò)后,打成jar包或...
    貪挽懶月閱讀 4,332評(píng)論 4 63
  • # 鏡像操作 docker images列出docker本地鏡像 docker search [鏡像名]從網(wǎng)絡(luò)中搜...
    ipso閱讀 371評(píng)論 0 0
  • 久違的晴天,家長(zhǎng)會(huì)。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí),離放學(xué)已經(jīng)沒(méi)多少時(shí)間了葫盼。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)蛋勺。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,515評(píng)論 16 22