您好,登錄后才能下訂單哦!
Docker中制作鏡像一共有兩個(gè)方法:
1. 基于容器制作鏡像:
docker commit …
2. 基于Dockerfile制作鏡像;
docker build …
Dockerfile的制作步驟:
1.創(chuàng)建一個(gè)目錄;
2.在目錄中創(chuàng)建一個(gè)首字母大寫(xiě)的文件,供docker build識(shí)別;
3.因?yàn)镈ockerfile的執(zhí)行環(huán)境在創(chuàng)建的目錄中,所以可以創(chuàng)建相對(duì)應(yīng)的文件,供dockerfile使用;
ex:
[root@master ~]# ls docimage Dockerfile index.html [root@master ~]# cat docimage/Dockerfile FROM busybox:latest LABEL maintainer="hevttc<ljy@163.com>" ENV DOC_ROOT="/tmp/" \ VOLUME_ROOT="/data/mydata" \ ARGU="/usr/sbin/" COPY index.html /tmp/ VOLUME ${VOLUME_ROOT} RUN ifconfig -a && \ cat ${DOC_ROOT}index.html
Dockerfile書(shū)寫(xiě)格式:
Dockerfile Format
“#”開(kāi)頭的行是注釋行(可以多行,任意位置);
INSTRUCTION arguments
指令和對(duì)應(yīng)的參數(shù),建議指令大寫(xiě),參數(shù)小寫(xiě),默認(rèn)大小寫(xiě)均可;
能用一行指令完成,盡量不用多行指令;
第一行可執(zhí)行指令必須是FROM指令;
Docker是順序執(zhí)行Dockerfile中的內(nèi)容,注意書(shū)寫(xiě)順序;
Dockerfile中幾個(gè)重要的指令:
1.FROM (指定基準(zhǔn)鏡像)
FROM <repository>|:<tag> 或
FROM <repository>@<digest>
<repository>:指定作為base image的名稱(chēng);
<tag>:base image的標(biāo)簽,為可選項(xiàng),省略時(shí)默認(rèn)為latest;
2.LABEL(寫(xiě)入當(dāng)前Dockerfile的制作者信息);
LABEL <key>=<value> <key>=<value> <key>=<value> …
3.COPY(將宿主機(jī)的文件拷貝至鏡像中);
COPY <src> … <dest> 或COPY ["<src>",... "<dest>" ]
<src>:要復(fù)制的源文件或目錄,支持使用通配符;
<dest>:目標(biāo)路徑,即正在創(chuàng)建的image的文件系統(tǒng)路徑;建議為<dest>使用絕對(duì)路徑,否則,COPY指定則以WORKDIR為其起始路徑;
注意:在路徑中有空白字符時(shí),通常使用第二種格式;
4.ADD(類(lèi)似于COPY指令,支持TAR文件和URL路徑);
ADD <src> … <dest> 或ADD ["<src>",... "<dest>" ]
注意:
如果<src>為URL且<dest>不以"/"結(jié)尾,則<src>指定的文件將被下載并直接被創(chuàng)建為<dest>;如果<dest>以"/"結(jié)尾,則文件名URL指定的文件將被下載并保存為<dest>/<filename>;
如果<src>是一個(gè)本地系統(tǒng)上的壓縮格式的tar文件,它將被展開(kāi)為一個(gè)目錄,其行為類(lèi)似于"tar -x"命令;然而,通過(guò)URL獲取到的tar文件將不會(huì)被自動(dòng)展開(kāi);
如果<src>有多個(gè),或其間接或直接使用了通配符,則<dest>必須是一個(gè)以"/"結(jié)尾的目錄路徑;如果<dest>不以"/"結(jié)尾,則其被視作一個(gè)普通文件,<src>的內(nèi)容將被直接寫(xiě)入到<dest>;
5.WORKDIR(用于為Dockerfile中所有的RUN, CMD, ENTRYPOINT, COPY和ADD指定設(shè)定工作目錄;);
WORKDIR <dirpath>
在Dockerfile文件中,WORKDIR指令可出現(xiàn)多次,其路徑也可以為相對(duì)路徑,不過(guò),其是相對(duì)此前一個(gè)WORKDIR指令指定的路徑;
另外,WORKDIR也可以調(diào)用有ENV指定定義的變量;
6.VOLUME(用于在image中創(chuàng)建一個(gè)掛載點(diǎn)目錄,可以用于在Docker Host上掛載卷);
VOLUME <mountpoint> 或 VOLUME ["mountpoint"]
個(gè)人并不建議使用:這是Docker daemon創(chuàng)建托管卷,并不是綁定掛載;
7.EXPOSE(為容器打開(kāi)要監(jiān)聽(tīng)的端口,實(shí)現(xiàn)與外部的通信);
EXPOSE <port>[/<protocol>] <port>[/<protocol>] <port>[/<protocol>] …
<protocol>用于指定傳輸層協(xié)議,可為T(mén)CP或UDP二者之一,默認(rèn)為T(mén)CP;
8.ENV(為鏡像定義環(huán)境變量,可以被其他指令調(diào)用,build_time和run_time都可被使用);
ENV <key> <value> 或 ENV <key>=<value>...
調(diào)用格式:
$variable_name或${variable_name}
9.ARG (在創(chuàng)建鏡像是build_time使用的變量,一般用ARG寫(xiě)版本號(hào)和作者);
ARG <name>[=<default value>]
10.RUN(用于指定Docker build過(guò)程中運(yùn)行的程序);
RUN <command> 或
RUN ["<excutable>","<param1>","<param2>",...](json數(shù)組)
11.CMD(類(lèi)似于RUN命令,在run_time執(zhí)行);
CMD <command> 或
CMD ["<excutable>","<param1>","<param2>",...] 或
CMD ["<param1>","<param2>",...] (為ENTRYPOINT指令提供默認(rèn)參數(shù))
12.ENTRYPOINT(類(lèi)似于CMD指令)
ENTRYPOINT <command>
ENTRYPOINT ["<excutable>","<param1>","<param2>",...]
[root@master ~]# cat docimage1/entrypoint.sh #!/bin/sh exec $@ [root@master ~]# cat docimage1/Dockerfile FROM nginx:1.14-alpine COPY entrypoint.sh /bin/ CMD ["/usr/local/nginx","-g","daemon off;"] ENTRYPOINT ["/bin/entrypoint.sh"] [root@master ~]# ll docimage1/ 總用量 8 -rw-r--r-- 1 root root 129 11月 1 20:42 Dockerfile -rwxr-xr-x 1 root root 19 11月 1 20:16 entrypoint.sh
命令執(zhí)行圖
創(chuàng)建一個(gè)Dockerfile;
[root@www ~]# mkdir docimage [root@www ~]# vim docimage/Dockerfile [root@www ~]# [root@www ~]# vim docimage/test.txt [root@www ~]# cat docimage/Dockerfile FROM nginx:1.14-alpine LABEL maintainer="liujingyu<ljy_153@163.com>" ENV DOC_ROOT="/tmp" \ VOLUME_ROOT=/data/mydata COPY test.txt ${DOC_ROOT} VOLUME ${VOLUME_ROOT} RUN echo 123 > ${DOC_ROOT}/test.txt CMD cat ${DOC_ROOT}/test.txt [root@www ~]# [root@www ~]# cat docimage/test.txt THIS is Docker TEST;
用Dockerfile創(chuàng)建鏡像:
[root@www ~]# docker build docimage/ -t ljymyy/nginx:v0.2 Sending build context to Docker daemon 3.072kB Step 1/7 : FROM nginx:1.14-alpine ---> 77bae8d00654 Step 2/7 : LABEL maintainer="liujingyu<ljy_153@163.com>" ---> Using cache ---> a012ac4c6f51 Step 3/7 : ENV DOC_ROOT="/tmp" VOLUME_ROOT=/data/mydata ---> Using cache ---> ee6ed363bfde Step 4/7 : COPY test.txt ${DOC_ROOT} ---> Using cache ---> a416671fde2a Step 5/7 : VOLUME ${VOLUME_ROOT} ---> Using cache ---> 84bf38b22301 Step 6/7 : RUN echo 123 > ${DOC_ROOT}/test.txt ---> Using cache ---> 756cd9857096 Step 7/7 : CMD cat ${DOC_ROOT}/test.txt ---> Running in a2f99fcc5fba Removing intermediate container a2f99fcc5fba ---> dac468a636e0 Successfully built dac468a636e0 Successfully tagged ljymyy/nginx:v0.2 [root@www ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ljymyy/nginx v0.2 dac468a636e0 2 minutes ago 17.7MB
運(yùn)行此鏡像:
[root@www ~]# docker container run --rm --name ngx1 ljymyy/nginx:v0.2 123
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。