Docker的學(xué)習(xí)(二)----構(gòu)建鏡像

在本篇中,我將記錄對Docker鏡像深入的學(xué)習(xí)唐断,已經(jīng)對Dockerfile的編寫和理解选脊。

Docker鏡像

Dcoker鏡像是由文件系統(tǒng)疊加而成的。最底端是一個引導(dǎo)文件系統(tǒng)脸甘,即bootfs恳啥。

構(gòu)建鏡像

在學(xué)習(xí)過程中,發(fā)現(xiàn)構(gòu)建方法有兩種:

使用docker commit命令
使用docker build命令和Dockerfile文件

  • 使用Docker的commit命令構(gòu)建鏡像

    類似Git中的commit斤程,要求先創(chuàng)建一個容器,并在容器中進(jìn)行修改菩混,然后將修改提交創(chuàng)建為一個新的鏡像忿墅。

    Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

  • 使用Dockfile構(gòu)建鏡像

    Dockerfile使用基本的基于DSL語法的指令來構(gòu)建一個Docker鏡像击困,之后使用docker build命令基于Dockerfile中的指令來構(gòu)建一個新的鏡像明未。 Dockerfile是Docker構(gòu)建鏡像的基礎(chǔ),也是Docker區(qū)別于其他容器的重要特征县昂,正是有了Dockerfile邢疙,Docker的自動化和可移植性才成為可能棍弄。
    Dockerfile分為四部分:基礎(chǔ)鏡像信息望薄、維護(hù)者信息、鏡像操作指令和容器啟動時執(zhí)行指令呼畸。

Dockerfile 關(guān)鍵字
  • FROM

該命令定義了使用哪個基礎(chǔ)鏡像啟動構(gòu)建流程痕支。基礎(chǔ)鏡像可以為任意鏡像蛮原。FROM指令指定的基礎(chǔ)image可以是官方遠(yuǎn)程倉庫中的卧须,也可以位于本地倉庫。如果基礎(chǔ)鏡像沒有被發(fā)現(xiàn)儒陨,Docker將試圖從Docker image index來查找該鏡像花嘶。FROM命令必須是Dockerfile的首個命令。

Usage:

FROM <image>

FROM <image>:<tag>

FROM <image>@<digest>

  • MAINTAINER

維護(hù)者信息

Usage:

MAINTAINER <name>

  • RUN

非交互式運(yùn)行shell命令蹦漠,RUN可以運(yùn)行任何被基礎(chǔ)image支持的命令椭员,可以有多條。

RUN指令會在一個新的容器中執(zhí)行任何命令笛园,然后把執(zhí)行后的改變提交到當(dāng)前鏡像隘击,提交后的鏡像會被用于Dockerfile中定義的下一步操作,RUN中定義的命令會按順序執(zhí)行并提交喘沿。當(dāng)命令較長時可以使用\來換行闸度。

Usage:

RUN <command> (the command is run in a shell)

RUN ["executable", "param1", "param2" ... ] (exec form)

  • CMD

Container啟動時執(zhí)行的命令,但是一個Dockerfile中只能有一條CMD命令蚜印,多條則只執(zhí)行最后一條CMD.

CMD主要用于Container時啟動指定的服務(wù)莺禁,當(dāng)Docker run command的命令匹配到CMD command時,會替換CMD執(zhí)行的命令窄赋。

Usage:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)

CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

CMD command param1 param2 (shell form)

  • ENTRYPOINT

Container啟動時執(zhí)行的命令哟冬,但是一個Dockerfile中只能有一條ENTRYPOINT命令,如果多條忆绰,則只執(zhí)行最后一條浩峡。

ENTRYPOINT沒有CMD的可替換特性。

該指令的使用分為兩種情況错敢,一種是獨(dú)自使用翰灾,另一種和CMD指令配合使用。

當(dāng)獨(dú)自使用時稚茅,如果你還使用了CMD命令且CMD是一個完整的可執(zhí)行的命令纸淮,那么CMD指令和ENTRYPOINT會互相覆蓋只有最后一個CMD或者ENTRYPOINT有效。

另一種用法和CMD指令配合使用來指定ENTRYPOINT的默認(rèn)參數(shù)亚享,這時CMD指令不是一個完整的可執(zhí)行命令咽块,僅僅是參數(shù)部分;ENTRYPOINT指令只能使用JSON方式指定執(zhí)行命令欺税,而不能指定參數(shù)侈沪。

Usage:

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)

ENTRYPOINT command param1 param2 (shell form)

  • ADD

ADD只有在build鏡像的時候運(yùn)行一次揭璃,后面運(yùn)行Container的時候不會再重新加載了。

將外部文件拷貝到鏡像里,src可以為url亭罪。

將文件<src>拷貝到container的文件系統(tǒng)對應(yīng)的路徑<dest>瘦馍。

所有拷貝到Container中的文件和文件夾權(quán)限為0755,uid和gid為0。

有下載URL和解壓的功能皆撩。

如果文件是可識別的壓縮格式扣墩,則docker會幫忙解壓縮。

如果要ADD本地文件/遠(yuǎn)程文件扛吞,則本地文件/遠(yuǎn)程文件必須在 docker build <PATH>呻惕,指定的<PATH>目錄下。

需要自動下載URL并拷貝到Container時使用

Usage:

ADD <src>... <dest>

ADD ["<src>",... "<dest>"] (this form is required for paths containing whitespace)

<src> 是相對被構(gòu)建的源目錄的相對路徑滥比,可以是文件或目錄的路徑亚脆,也可以是一個遠(yuǎn)程的文件url;
<dest> 是container中的絕對路徑

  • COPY

沒有下載URL和解壓的功能。

不需要自動下載URL并拷貝到Container時使用盲泛。

復(fù)制本地主機(jī)的 <src> (為Dockerfile所在目錄的相對路徑)到容器中的 <dest>濒持。

當(dāng)使用本地目錄為源目錄時,推薦使用COPY寺滚。

Usage:

COPY <src>... <dest>

COPY ["<src>",... "<dest>"] (this form is required for paths containing whitespace)

  • ENV

在Image中設(shè)置一個環(huán)境變量柑营。

設(shè)置了后,后續(xù)的RUN命令都可以使用村视,container啟動后官套,可以通過docker inspect查看這個環(huán)境變量,也可以通過在docker run --env key=value時設(shè)置或修改環(huán)境變量蚁孔。

Usage:

ENV <key> <value>

ENV <key>=<value> ...

  • WORKDIR

切換工作目錄用奶赔,可以多次切換(相當(dāng)于cd命令),對RUN,CMD,ENTRYPOINT生效

Usage:

WORKDIR /path/to/workdir

  • USER

設(shè)置啟動容器的用戶杠氢,默認(rèn)是root用戶站刑。

USER指令用于設(shè)置用戶或uid來運(yùn)行生成的鏡像和執(zhí)行RUN、CMD鼻百、ENTRYPOINT绞旅。

Usage:

USER daemon

  • LABEL

用鍵值對的方式來指定image的元數(shù)據(jù)

Usage:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

  • EXPOSE

container內(nèi)部服務(wù)開啟的端口。

指定在docker允許時指定的端口進(jìn)行轉(zhuǎn)發(fā)温艇。

主機(jī)上要用還得在啟動Container時因悲,做Host-Container的端口映射

Usage:

EXPOSE <port> [<port>...]

  • VOLUME

Usage:

使容器中的一個目錄具有持久化存儲數(shù)據(jù)的功能,該目錄可以被容器本身使用中贝,也可以共享給其他容器使用囤捻。

我們知道容器使用的是AUFS臼朗,這種文件系統(tǒng)不能持久化數(shù)據(jù)邻寿,當(dāng)容器關(guān)閉后蝎土,所有的更改都會丟失。

當(dāng)容器中的應(yīng)用有持久化數(shù)據(jù)的需求時可以在Dockerfile中使用該指令绣否。

創(chuàng)建一個可以從本地主機(jī)或其他容器掛載的掛載點(diǎn)誊涯,一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)等。

VOLUME ["/data"]

  • ARG

ARG是Docker1.9 版本才新加入的指令蒜撮。

ARG 定義的變量只在建立Image時有效暴构,建立完成后變量就失效消失。

Usage:

ARG <name>[=<default value>]

  • ONBUILD

ONBUILD 的作用就是讓指令延遲執(zhí)行段磨,延遲到下一個使用 FROM 的 Dockerfile 在建立Image時執(zhí)行取逾,只限延遲一次。

ONBUILD 的使用情景是在建立鏡像時取得最新的源碼 (搭配 RUN) 與限定系統(tǒng)框架苹支。

Usage:

ONBUILD [INSTRUCTION]

第一個Dockerfile
# Base ubuntu 14.04 image
# VERSION 0.0.1
# Authon: Ken

# 基礎(chǔ)鏡像信息
FROM ubuntu:14.04

# 維護(hù)者信息
MAINTAINER Ken ken.han.coder@aliyun.com

# 鏡像操作指令
RUN mv /etc/apt/sources.list /etc/apt/sources.list.1
# 更新源文件
COPY sources.list /etc/apt/sources.list

RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get -y install vim curl wget
使用docker build

Usage: docker build [OPTIONS] PATH | URL | -

docker build -t="ken_repo/ubuntu:14.04_64_base_image" .

REPOSITORY          TAG                   IMAGE ID            CREATED             SIZE
ken_repo/ubuntu     14.04_64_base_image   583b4e36d909        15 seconds ago      294.1 MB
ubuntu              16.10                 175e129b1641        2 weeks ago         100.1 MB
ubuntu              latest                42118e3df429        2 weeks ago         124.8 MB
ubuntu              14.04                 0ccb13bf1954        2 weeks ago         188 MB
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砾隅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子债蜜,更是在濱河造成了極大的恐慌晴埂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寻定,死亡現(xiàn)場離奇詭異儒洛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狼速,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門琅锻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唐含,你說我怎么就攤上這事浅浮。” “怎么了捷枯?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵滚秩,是天一觀的道長。 經(jīng)常有香客問我淮捆,道長郁油,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任攀痊,我火速辦了婚禮桐腌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苟径。我一直安慰自己案站,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布棘街。 她就那樣靜靜地躺著蟆盐,像睡著了一般承边。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上石挂,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天博助,我揣著相機(jī)與錄音,去河邊找鬼痹愚。 笑死富岳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拯腮。 我是一名探鬼主播窖式,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼动壤!你這毒婦竟也來了脖镀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤狼电,失蹤者是張志新(化名)和其女友劉穎蜒灰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肩碟,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡强窖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了削祈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翅溺。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖髓抑,靈堂內(nèi)的尸體忽然破棺而出咙崎,到底是詐尸還是另有隱情,我是刑警寧澤吨拍,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布褪猛,位于F島的核電站,受9級特大地震影響羹饰,放射性物質(zhì)發(fā)生泄漏伊滋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一队秩、第九天 我趴在偏房一處隱蔽的房頂上張望笑旺。 院中可真熱鬧,春花似錦馍资、人聲如沸筒主。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乌妙。三九已至色洞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冠胯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工锦针, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荠察,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓奈搜,卻偏偏與公主長得像悉盆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子馋吗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

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