摘要:簡(jiǎn)單來(lái)說(shuō)是鏡像的源碼。例如,的鏡像鏡像,在中是一個(gè)基礎(chǔ)鏡像的鏡像也是鏡像那么鏡像和共享同一個(gè)基礎(chǔ)鏡像層,提高了存儲(chǔ)效率。
前言
只有光頭才能變強(qiáng)。
文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y
回顧前面:
為什么需要Docker?
Docker入門(mén)為什么可以這么簡(jiǎn)單?
前面兩篇已經(jīng)講解了為什么需要Docker這項(xiàng)技術(shù),以及解釋了Docker的基本概念/術(shù)語(yǔ),使用Docker成功運(yùn)行Tomcat~
在上篇也同樣留下一個(gè)問(wèn)題:我們知道Tomcat運(yùn)行起來(lái)需要Java的支持,那么我們?cè)贒ockerHub拉取下來(lái)的Tomcat鏡像是不是也有Java環(huán)境呢?
所以,這篇主要來(lái)講講Docker鏡像相關(guān)的知識(shí)點(diǎn)!
一、簡(jiǎn)單了解DockerfileDockerfile是用來(lái)構(gòu)建Docker鏡像的文件,是由一系列命令和參數(shù)構(gòu)成的腳本。
簡(jiǎn)單來(lái)說(shuō):Dockerfile是鏡像的源碼。
上一篇我們pull了一份Tomcat的鏡像,我們也可以去看看它的Dockerfile長(zhǎng)的什么樣:
我們隨便點(diǎn)進(jìn)去一個(gè)看一下:
我們?cè)贒ockerfile的第一行就可以發(fā)現(xiàn)FROM openjdk:8-jre,所以可以確定的是:在DockerHub拉取下來(lái)的Tomcat鏡像一定有Java環(huán)境!
在這里我們先不說(shuō)如何閱讀/編寫(xiě)Dockerfile文件,先了解到Dockerfile是鏡像的源碼即可
簡(jiǎn)單來(lái)說(shuō):通過(guò)Dockerfile文件可以知道我們拉取下來(lái)的鏡像究竟是怎么構(gòu)建的。
二、解除鏡像的疑惑我們知道Docker Hub有很多常用的鏡像,比如說(shuō)Centos。我們?nèi)?b>pull一個(gè)下來(lái)看看Docker中的Centos長(zhǎng)啥樣:
我們可以發(fā)現(xiàn)的是:Tomcat的SIZE竟然比Centos還要大!但按我們常規(guī)的想法,Centos的鏡像可能是3或4GB(現(xiàn)在200M),Tomcat的鏡像可能就200M(現(xiàn)在400M)。這是為什么呢??
如果我們?cè)?b>pull的時(shí)候觀察得比較仔細(xì)的話,可以發(fā)現(xiàn)pull會(huì)拉下很多層鏡像:
完全pull下來(lái)的之后,我們?nèi)绻褂?b>docker images只能查看到最終的鏡像:
如果我們使用docker images -a 命令的話,可以把中間層鏡像都查出來(lái):
理想效果:(在鏡像列表里邊除了tomcat和centos應(yīng)該還夾雜著名為
遺憾的是:博主一直沒(méi)測(cè)出效果來(lái),也就是我的鏡像列表里沒(méi)有
Emmm,我們可以使用history命令來(lái)看看,可以發(fā)現(xiàn)Tomcat包含很多個(gè)鏡像層
還可以發(fā)現(xiàn)一點(diǎn):Dockerfile有多少條命令,那就有多少個(gè)鏡像層(不信你數(shù)數(shù))
說(shuō)了那么多,就想讓大家知道:我們拉取下來(lái)的鏡像實(shí)際上是由很多中間層鏡像組成的。
再結(jié)合我們上一篇Docker入門(mén)為什么可以這么簡(jiǎn)單?,在解決Tomcat啟動(dòng)時(shí)一直卡住問(wèn)題時(shí),能夠發(fā)現(xiàn)的是,我們可以使用cd, ls等基礎(chǔ)命令,但無(wú)法使用vi命令(需要我自己去下載)。
我們可以推斷出,pull下來(lái)的鏡像由很多層鏡像組成【這些鏡像都是精簡(jiǎn)過(guò)的(甚至連vi命令都不支持)】
因?yàn)?b>Tomcat鏡像要的基礎(chǔ)環(huán)境比Centos鏡像要多,所以Tomcat鏡像的SIZE比Centos要大
三、Docker鏡像的特點(diǎn)關(guān)于Docker鏡像,有以下特點(diǎn):
由Dockerfile生成
呈現(xiàn)層級(jí)結(jié)構(gòu)
每層鏡像包含:鏡像文件以及鏡像json元數(shù)據(jù)信息
圖像來(lái)源:http://open.daocloud.io/allen-tan-docker-xi-lie-zhi-shen-ke-li-jie-docker-jing-xiang-da-xiao/3.1鏡像呈現(xiàn)層級(jí)結(jié)構(gòu)
聯(lián)合文件系統(tǒng)(UnionFS)是實(shí)現(xiàn)Docker鏡像的技術(shù)基礎(chǔ)。在Docker中一般使用是AUFS(Another Union File System或Advanced Multilayered Unification File System)【具體還是得看宿主機(jī)用的什么系統(tǒng)】。
在搜索中文資料的時(shí)候,常常會(huì)發(fā)現(xiàn)有類似的解釋:
“AUFS是一種 Union FS, 簡(jiǎn)單來(lái)說(shuō)就是“支持將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下的文件系統(tǒng)”, AUFS支持為每一個(gè)成員目錄設(shè)定只讀(Rreadonly)、讀寫(xiě)(Readwrite)和寫(xiě)(Whiteout-able)權(quán)限。Union FS 可以將一個(gè)Readonly的Branch和一個(gè)Writeable的Branch聯(lián)合在一起掛載在同一個(gè)文件系統(tǒng)下”。
看得我一頭霧水....后來(lái)去官方文檔介紹AUFS:
AUFS is a union filesystem, which means that it layers multiple directories on a single Linux host and presents them as a single directory. These directories are called branches in AUFS terminology, and layers in Docker terminology
說(shuō)白了,還是可以理解成:Docker的鏡像的基礎(chǔ)是聯(lián)合文件系統(tǒng),它支持將文件系統(tǒng)中的修改信息作為一次提交,并層層疊加,外界看到的是最外層的鏡像。(比如外界只看到Tomcat鏡像,而中間疊加了很多層鏡像)
(這里只是拿AUFS說(shuō)明,Docker實(shí)際上支持很多存儲(chǔ)驅(qū)動(dòng),比如還有devicemapper,overlay2(Ubuntu的14.04.4或更高版本,16.04或更高版本), overlay,zfs
https://docs.docker-cn.com/engine/userguide/storagedriver/selectadriver/
3.1.1鏡像繼承(共享)Docker鏡像可以通過(guò)分層來(lái)進(jìn)行繼承。
例如,hello-world的Dockerfile鏡像FROM scratch鏡像,scratch在Docker中是一個(gè)基礎(chǔ)鏡像
FROM scratch COPY hello / CMD ["/hello"]
Centos的Dockerfile鏡像也是FROM scratch鏡像:
FROM scratch ADD centos-7-docker.tar.xz / LABEL org.label-schema.schema-version="1.0" org.label-schema.name="CentOS Base Image" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20181205" CMD ["/bin/bash"]
那么Centos鏡像和hello-world共享同一個(gè)基礎(chǔ)鏡像層scratch,提高了存儲(chǔ)效率。
再說(shuō)個(gè)例子,比如我們有一個(gè)Centos鏡像,這個(gè)鏡像大小是202M。然后,我們基于Centos鏡像手動(dòng)往里邊添加一個(gè)Tomcat(假設(shè)這個(gè)Tomcat的大小是300M),生成一個(gè)鏡像,總大小就是502M了。
如果僅僅是單純的累加這兩個(gè)鏡像的大?。?b>202M+502M=704M,但是由于鏡像復(fù)用的存在,實(shí)際占用的磁盤(pán)空間大小是:202M+300M=502M
AUFS uses the Copy-on-Write (CoW) strategy to maximize storage efficiency and minimize overhead。
如果想要了解COW,不妨閱讀我之前寫(xiě)過(guò)的文章:
COW奶牛!Copy On Write機(jī)制了解一下
CopyOnWriteArrayList你都不知道,怎么拿offer?
3.2json文件Docker每一層鏡像的json文件,都扮演著一個(gè)非常重要的角色,其主要的作用如下:
記錄 Docker 鏡像中與容器動(dòng)態(tài)信息相關(guān)的內(nèi)容
記錄父子 Docker 鏡像之間真實(shí)的差異關(guān)系
彌補(bǔ) Docker 鏡像內(nèi)容的完整性與動(dòng)態(tài)內(nèi)容的缺失
Docker鏡像的json文件可以認(rèn)為是鏡像的元數(shù)據(jù)信息
最后今天簡(jiǎn)單地聊了一下Docker鏡像的一些細(xì)節(jié),但沒(méi)去深入了解,想要繼續(xù)深入的同學(xué)還得通過(guò)官方文檔等途徑去學(xué)習(xí)哈。
參考資料:
Allen 談 Docker
http://open.daocloud.io/tag/allen-tan-docker/
官方文檔介紹AUFS
https://docs.docker-cn.com/engine/userguide/storagedriver/aufs-driver/#example-image-and-container-on-disk-constructs
Docker核心實(shí)現(xiàn)技術(shù)(命名空間&控制組&聯(lián)合文件系統(tǒng)&Linux網(wǎng)絡(luò)虛擬化支持)
https://www.cnblogs.com/wade-luffy/p/6589254.html#_label3
Docker聯(lián)合文件系統(tǒng)Union File System
http://www.dockerinfo.net/1753.html
樂(lè)于輸出干貨的Java技術(shù)公眾號(hào):Java3y。公眾號(hào)內(nèi)有200多篇原創(chuàng)技術(shù)文章、海量視頻資源、精美腦圖,不妨來(lái)關(guān)注一下!
覺(jué)得我的文章寫(xiě)得不錯(cuò),不妨點(diǎn)一下贊!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/28090.html
摘要:我們首先來(lái)看容器和容器鏡像。容器和容器鏡像一樣,也是若干層的疊加,唯一區(qū)別是所有只讀層的最上面一層,是一層可讀可寫(xiě)層,如上圖綠色圖例所示。希望這篇文章能幫助大家理解容器和容器鏡像的區(qū)別。 很多剛剛接觸容器技術(shù)的朋友,不容易弄清楚容器,容器鏡像和Docker這幾個(gè)詞的區(qū)別和聯(lián)系。 showImg(https://segmentfault.com/img/remote/1460000017...
摘要:為了證明模板,我們可以使用環(huán)境變量配置讓這個(gè)變成一個(gè)更通用的代理服務(wù)器。我們將定義環(huán)境變量作為一個(gè)站點(diǎn)的代理。當(dāng)這個(gè)容器使用這個(gè)環(huán)境變量啟動(dòng),將使用它來(lái)生成一個(gè)的路徑。 一種 Dockerize 應(yīng)用的簡(jiǎn)單方式 標(biāo)簽(空格分隔): Docker dockerize 作者是 jasonwilder。原文地址是 A Simple Way to Dockerize Applica...
摘要:進(jìn)入發(fā)現(xiàn)運(yùn)行鏡像的容器有可能也是一個(gè)系統(tǒng)。每次使用都會(huì)創(chuàng)建一個(gè)容器,如果出現(xiàn)已經(jīng)存在的提示,請(qǐng)使用去移除這個(gè)容器。使用可以獲取權(quán)限容器如何查看準(zhǔn)確說(shuō)如何進(jìn)入到容器。這個(gè)就表示啟動(dòng)容器后啟動(dòng)保證有個(gè)進(jìn)行在運(yùn)行。 前言 這篇文章采用自問(wèn)自答的方式記錄自己的接觸Docker的所想與困惑. 學(xué)習(xí)方式 菜鳥(niǎo)教程過(guò)一遍 -> 實(shí)戰(zhàn)總結(jié) -> Docker官網(wǎng)查找細(xì)節(jié) 基礎(chǔ)知識(shí) Docker搜索鏡...
摘要:很多人反應(yīng)很難訪問(wèn),所以轉(zhuǎn)移到阿里云服務(wù)器上,因此做了一次完整的容器部署。在容器化過(guò)程中,我們并未配置任何等,只是保留服務(wù)所需的配置項(xiàng)而已,而這一部分我們可以放在反向代理層完成。 很多人反應(yīng)很難訪問(wèn) Github Page,所以 ng-alain.com 轉(zhuǎn)移到阿里云服務(wù)器上,因此做了一次完整的 Angular 容器部署。 以下我會(huì)闡述 ng-alain 整個(gè)過(guò)程,其中包括 Docke...
摘要:很多人反應(yīng)很難訪問(wèn),所以轉(zhuǎn)移到阿里云服務(wù)器上,因此做了一次完整的容器部署。在容器化過(guò)程中,我們并未配置任何等,只是保留服務(wù)所需的配置項(xiàng)而已,而這一部分我們可以放在反向代理層完成。 很多人反應(yīng)很難訪問(wèn) Github Page,所以 ng-alain.com 轉(zhuǎn)移到阿里云服務(wù)器上,因此做了一次完整的 Angular 容器部署。 以下我會(huì)闡述 ng-alain 整個(gè)過(guò)程,其中包括 Docke...
閱讀 2484·2023-04-25 19:24
閱讀 1700·2021-11-11 16:54
閱讀 2833·2021-11-08 13:19
閱讀 3547·2021-10-25 09:45
閱讀 2552·2021-09-13 10:24
閱讀 3276·2021-09-07 10:15
閱讀 4014·2021-09-07 10:14
閱讀 2950·2019-08-30 15:56