在本篇中,我將記錄對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