Docker中製作鏡像一共有兩個方法:
1. 基於容器製作鏡像:
docker commit …
2. 基於Dockerfile製作鏡像;
docker build …
Dockerfile的製作步驟:
1.創建一個目錄;
2.在目錄中創建一個首字母大寫的文件,供docker build識別;
3.因爲Dockerfile的執行環境在創建的目錄中,所以可以創建相對應的文件,供dockerfile使用;
ex:
[root@master ~]# ls docimage Dockerfile index.html [root@master ~]# cat docimage/Dockerfile FROM busybox:latest LABEL maintainer="hevttc<[email protected]>" 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書寫格式:
Dockerfile Format
“#”開頭的行是註釋行(可以多行,任意位置);
INSTRUCTION arguments
指令和對應的參數,建議指令大寫,參數小寫,默認大小寫均可;
能用一行指令完成,儘量不用多行指令;
第一行可執行指令必須是FROM指令;
Docker是順序執行Dockerfile中的內容,注意書寫順序;
Dockerfile中幾個重要的指令:
1.FROM (指定基準鏡像)
FROM <repository>|:<tag> 或
FROM <repository>@<digest>
<repository>:指定作爲base image的名稱;
<tag>:base image的標籤,爲可選項,省略時默認爲latest;
2.LABEL(寫入當前Dockerfile的製作者信息);
LABEL <key>=<value> <key>=<value> <key>=<value> …
3.COPY(將宿主機的文件拷貝至鏡像中);
COPY <src> … <dest> 或COPY ["<src>",... "<dest>" ]
<src>:要複製的源文件或目錄,支持使用通配符;
<dest>:目標路徑,即正在創建的image的文件系統路徑;建議爲<dest>使用絕對路徑,否則,COPY指定則以WORKDIR爲其起始路徑;
注意:在路徑中有空白字符時,通常使用第二種格式;
4.ADD(類似於COPY指令,支持TAR文件和URL路徑);
ADD <src> … <dest> 或ADD ["<src>",... "<dest>" ]
注意:
如果<src>爲URL且<dest>不以"/"結尾,則<src>指定的文件將被下載並直接被創建爲<dest>;如果<dest>以"/"結尾,則文件名URL指定的文件將被下載並保存爲<dest>/<filename>;
如果<src>是一個本地系統上的壓縮格式的tar文件,它將被展開爲一個目錄,其行爲類似於"tar -x"命令;然而,通過URL獲取到的tar文件將不會被自動展開;
如果<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以"/"結尾的目錄路徑;如果<dest>不以"/"結尾,則其被視作一個普通文件,<src>的內容將被直接寫入到<dest>;
5.WORKDIR(用於爲Dockerfile中所有的RUN, CMD, ENTRYPOINT, COPY和ADD指定設定工作目錄;);
WORKDIR <dirpath>
在Dockerfile文件中,WORKDIR指令可出現多次,其路徑也可以爲相對路徑,不過,其是相對此前一個WORKDIR指令指定的路徑;
另外,WORKDIR也可以調用有ENV指定定義的變量;
6.VOLUME(用於在image中創建一個掛載點目錄,可以用於在Docker Host上掛載卷);
VOLUME <mountpoint> 或 VOLUME ["mountpoint"]
個人並不建議使用:這是Docker daemon創建託管卷,並不是綁定掛載;
7.EXPOSE(爲容器打開要監聽的端口,實現與外部的通信);
EXPOSE <port>[/<protocol>] <port>[/<protocol>] <port>[/<protocol>] …
<protocol>用於指定傳輸層協議,可爲TCP或UDP二者之一,默認爲TCP;
8.ENV(爲鏡像定義環境變量,可以被其他指令調用,build_time和run_time都可被使用);
ENV <key> <value> 或 ENV <key>=<value>...
調用格式:
$variable_name或${variable_name}
9.ARG (在創建鏡像是build_time使用的變量,一般用ARG寫版本號和作者);
ARG <name>[=<default value>]
10.RUN(用於指定Docker build過程中運行的程序);
RUN <command> 或
RUN ["<excutable>","<param1>","<param2>",...](json數組)
11.CMD(類似於RUN命令,在run_time執行);
CMD <command> 或
CMD ["<excutable>","<param1>","<param2>",...] 或
CMD ["<param1>","<param2>",...] (爲ENTRYPOINT指令提供默認參數)
12.ENTRYPOINT(類似於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
命令執行圖
創建一個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<[email protected]>" 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創建鏡像:
[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<[email protected]>" ---> 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
運行此鏡像:
[root@www ~]# docker container run --rm --name ngx1 ljymyy/nginx:v0.2 123