Docker Client 客戶端 / Docker Daemon 守護(hù)進(jìn)程
docker是CS架構(gòu),Docker Daemon守護(hù)進(jìn)程即為服務(wù)端
客戶端向守護(hù)進(jìn)程發(fā)起請(qǐng)求,既可以在本地也可以在遠(yuǎn)程
Docker Image 鏡像
鏡像是容器的基石,就像容器的源代碼,保存了用于啟動(dòng)容器的各項(xiàng)條件和配置
docker的鏡像是一個(gè)層疊的只讀文件系統(tǒng),最底端是一個(gè)引導(dǎo)文件系統(tǒng)(bootfs),這很像典型的linux的引導(dǎo)文件系統(tǒng),docker用戶幾乎永遠(yuǎn)不會(huì)和引導(dǎo)文件系統(tǒng)有交互,實(shí)際上當(dāng)一個(gè)容器啟動(dòng)后將會(huì)被移動(dòng)到內(nèi)存中,而引導(dǎo)文件系統(tǒng)將會(huì)被卸載。而docker鏡像的第二層是root文件系統(tǒng)(rootfs),root文件系統(tǒng)可以是一種或者多種操作系統(tǒng),比如ubuntu或者centos,在傳統(tǒng)的文件系統(tǒng)中,root文件系統(tǒng)會(huì)最先以只讀的方式加載,當(dāng)引導(dǎo)結(jié)束并完成完整性檢查之后它才會(huì)被切換到讀寫模式。但是在docker中,rootfs永遠(yuǎn)是只讀狀態(tài)。 并且docker利用聯(lián)合加載技術(shù)(union mount)又會(huì)在rootfs之上加載更多的只讀文件系統(tǒng)。聯(lián)合加載指的是一次同時(shí)加載多個(gè)文件系統(tǒng),但是在外面看起來只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)將各層文件系統(tǒng)疊加在一起,這樣最終的文件系統(tǒng)會(huì)包含所有的底層文件和目錄,docker將這樣的文件系統(tǒng)稱為鏡像。
Docker Container 容器
容器通過鏡像來啟動(dòng),容器是鏡像的執(zhí)行單元,如果說鏡像是docker生命周期中的構(gòu)建和打包階段,那么容器則是啟動(dòng)和執(zhí)行階段。當(dāng)一個(gè)容器啟動(dòng)時(shí),docker會(huì)在該鏡像的最頂層加載一個(gè)可寫的文件層,我們?cè)赿ocker中運(yùn)行的程序就是在這個(gè)層中執(zhí)行的。docker第一次啟動(dòng)一個(gè)容器時(shí),初始的讀寫層是空的,當(dāng)文件系統(tǒng)發(fā)生變化時(shí),這些變化都會(huì)應(yīng)用在這一層上。比如如果想修改一個(gè)文件,這個(gè)文件首先會(huì)從該讀寫層下面的只讀層復(fù)制到該讀寫層,該文件的只讀版本依然存在,但是已經(jīng)被讀寫層中的該文件副本所隱藏,這就是docker中的一個(gè)重要技術(shù)寫時(shí)復(fù)制(copy on write).
每個(gè)只讀鏡像層都是只讀的,并且以后永遠(yuǎn)不會(huì)變化,當(dāng)創(chuàng)建一個(gè)新容器時(shí)docker會(huì)構(gòu)建出一個(gè)鏡像棧,在棧的最頂層添加可寫層,這個(gè)可寫層加上下面的鏡像層以及一些配置數(shù)據(jù)就構(gòu)成了一個(gè)容器。容器的這些特點(diǎn)加上鏡像的分層框架使我們可以快速構(gòu)建鏡像,并允許包含我們自己應(yīng)用程序的容器。
Docker Registry倉庫
docker用倉庫保存用戶構(gòu)建的鏡像,倉庫分為公有和私有兩種,docker Hub是docker官方的公有倉庫。我們可以通過這個(gè)網(wǎng)站查找我們需要的鏡像為我們節(jié)省構(gòu)建鏡像的時(shí)間。