
Image Definition
鏡像(Image)就是一堆只讀層(read-only layer)的統(tǒng)一視角,也許這個(gè)定義有些難以理解,下面的這張圖能夠幫助讀者理解鏡像的定義。
從左邊我們看到了多個(gè)只讀層,它們重疊在一起。除了最下面一層,其它層都會(huì)有一個(gè)指針指向下一層。這些層是Docker內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),并且能夠 在主機(jī)(譯者注:運(yùn)行Docker的機(jī)器)的文件系統(tǒng)上訪問到。統(tǒng)一文件系統(tǒng)(union file system)技術(shù)能夠?qū)⒉煌膶诱铣梢粋€(gè)文件系統(tǒng),為這些層提供了一個(gè)統(tǒng)一的視角,這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個(gè)文件系統(tǒng)。 我們可以在圖片的右邊看到這個(gè)視角的形式。
你可以在你的主機(jī)文件系統(tǒng)上找到有關(guān)這些層的文件。需要注意的是,在一個(gè)運(yùn)行中的容器內(nèi)部,這些層是不可見的。
sudo tree -L 1 /var/lib/docker/
/var/lib/docker/
├── aufs
├── containers
├── graph
├── init
├── linkgraph.db
├── repositories-aufs
├── tmp
├── trust
└── volumes
7 directories, 2 files
Container Definition
容器(container)的定義和鏡像(image)幾乎一模一樣,也是一堆層的統(tǒng)一視角,唯一區(qū)別在于容器的最上面那一層是可讀可寫的。
容器的定義并沒有提及容器是否在運(yùn)行
要點(diǎn):容器 = 鏡像 + 可讀層。并且容器的定義并沒有提及是否要運(yùn)行容器
Running Container Definition
一個(gè)運(yùn)行態(tài)容器(running container)被定義為一個(gè)可讀寫的統(tǒng)一文件系統(tǒng)加上隔離的進(jìn)程空間和包含其中的進(jìn)程。下面這張圖片展示了一個(gè)運(yùn)行中的容器。
正是文件系統(tǒng)隔離技術(shù)使得Docker成為了一個(gè)前途無量的技術(shù)。一個(gè)容器中的進(jìn)程可能會(huì)對(duì)文件進(jìn)行修改、刪除、創(chuàng)建,這些改變都將作用于可讀寫層(read-write layer)。下面這張圖展示了這個(gè)行為。
通過運(yùn)行以下命令來驗(yàn)證:
docker run ubuntu touch happiness.txt
即便是這個(gè)ubuntu容器不再運(yùn)行,依舊能夠在主機(jī)的文件系統(tǒng)上找到這個(gè)新文件。
find / -name happiness.txt
/var/lib/docker/aufs/diff/860a7b...889/happiness.txt
Image Layer Definition
為了將零星的數(shù)據(jù)整合起來,我們提出了鏡像層(image layer)這個(gè)概念。下面的這張圖描述了一個(gè)鏡像層,通過圖片我們能夠發(fā)現(xiàn)一個(gè)層并不僅僅包含文件系統(tǒng)的改變,它還能包含了其他重要信息。
元數(shù)據(jù)(metadata)就是關(guān)于這個(gè)層的額外信息,它不僅能夠讓Docker獲取運(yùn)行和構(gòu)建時(shí)的信息,還包括父層的層次信息。需要注意,只讀層和讀寫層都包含元數(shù)據(jù)。
除此之外,每一層都包括了一個(gè)指向父層的指針。如果一個(gè)層沒有這個(gè)指針,說明它處于最底層。
Metadata Location:
在我自己的主機(jī)上,鏡像層(image layer)的元數(shù)據(jù)被保存在名為”json”的文件中,比如說:
/var/lib/docker/graph/e809f156dc985.../json
e809f156dc985...就是這層的id
一個(gè)容器的元數(shù)據(jù)好像是被分成了很多文件,但或多或少能夠在/var/lib/docker/containers/<id>目錄下找到,<id>就是一個(gè)可讀層的id。這個(gè)目錄下的文件大多是運(yùn)行時(shí)的數(shù)據(jù),比如說網(wǎng)絡(luò),日志等等。






