docker中鏡像和容器的區(qū)別:1、鏡像是包含了各種環(huán)境或者服務(wù)的一個(gè)模板,而容器是鏡像的一個(gè)實(shí)例;2、鏡像是不能運(yùn)行的,是靜態(tài)的,而容器是可以運(yùn)行的,是動(dòng)態(tài)的。
本教程操作環(huán)境:linux7.3系統(tǒng)、docker-1.13.1版、Dell G3電腦。
docker中鏡像和容器的區(qū)別是什么
一、Docker鏡像
要理解Docker鏡像和Docker容器之間的區(qū)別,確實(shí)不容易。
假設(shè)Linux內(nèi)核是第0層,那么無(wú)論怎么運(yùn)行Docker,它都是運(yùn)行于內(nèi)核層之上的。這個(gè)Docker鏡像,是一個(gè)只讀的鏡像,位于第1層,它不能被修改或不能保存狀態(tài)。
一個(gè)Docker鏡像可以構(gòu)建于另一個(gè)Docker鏡像之上,這種層疊關(guān)系可以是多層的。第1層的鏡像層我們稱之為基礎(chǔ)鏡像(Base Image),其他層的鏡像(除了最頂層)我們稱之為父層鏡像(Parent Image)。這些鏡像繼承了他們的父層鏡像的所有屬性和設(shè)置,并在Dockerfile中添加了自己的配置。
Docker鏡像通過(guò)鏡像ID進(jìn)行識(shí)別。鏡像ID是一個(gè)64字符的十六進(jìn)制的字符串。但是當(dāng)我們運(yùn)行鏡像時(shí),通常我們不會(huì)使用鏡像ID來(lái)引用鏡像,而是使用鏡像名來(lái)引用。要列出本地所有有效的鏡像,可以使用命令
# docker images
鏡像可以發(fā)布為不同的版本,這種機(jī)制我們稱之為標(biāo)簽(Tag)。
如上圖所示,neo4j鏡像有兩個(gè)版本:lastest版本和2.1.5版本。
可以使用pull命令加上指定的標(biāo)簽:
# docker pull ubuntu:14.04 # docker pull ubuntu:12.04
二、Docker容器
Docker容器可以使用命令創(chuàng)建:
# docker run imagename
它會(huì)在所有的鏡像層之上增加一個(gè)可寫(xiě)層。這個(gè)可寫(xiě)層有運(yùn)行在CPU上的進(jìn)程,而且有兩個(gè)不同的狀態(tài):運(yùn)行態(tài)(Running)和退出態(tài)(Exited)。這就是Docker容器。當(dāng)我們使用docker run啟動(dòng)容器,Docker容器就進(jìn)入運(yùn)行態(tài),當(dāng)我們停止Docker容器時(shí),它就進(jìn)入退出態(tài)。
當(dāng)我們有一個(gè)正在運(yùn)行的Docker容器時(shí),從運(yùn)行態(tài)到停止態(tài),我們對(duì)它所做的一切變更都會(huì)永久地寫(xiě)到容器的文件系統(tǒng)中。要切記,對(duì)容器的變更是寫(xiě)入到容器的文件系統(tǒng)的,而不是寫(xiě)入到Docker鏡像中的。
我們可以用同一個(gè)鏡像啟動(dòng)多個(gè)Docker容器,這些容器啟動(dòng)后都是活動(dòng)的,彼此還是相互隔離的。我們對(duì)其中一個(gè)容器所做的變更只會(huì)局限于那個(gè)容器本身。
如果對(duì)容器的底層鏡像進(jìn)行修改,那么當(dāng)前正在運(yùn)行的容器是不受影響的,不會(huì)發(fā)生自動(dòng)更新現(xiàn)象。
如果想更新容器到其鏡像的新版本,那么必須當(dāng)心,確保我們是以正確的方式構(gòu)建了數(shù)據(jù)結(jié)構(gòu),否則我們可能會(huì)導(dǎo)致?lián)p失容器中所有數(shù)據(jù)的后果。
64字符的十六進(jìn)制的字符串來(lái)定義容器ID,它是容器的唯一標(biāo)識(shí)符。容器之間的交互是依靠容器ID識(shí)別的,由于容器ID的字符太長(zhǎng),我們通常只需鍵入容器ID的前4個(gè)字符即可。當(dāng)然,我們還可以使用容器名,但顯然用4字符的容器ID更為簡(jiǎn)便。
推薦學(xué)習(xí):《docker視頻教程》