Docker中制做镜像一共有两个方法:html
1. 基于容器制做镜像:nginx
docker commit …docker
2. 基于Dockerfile制做镜像;json
docker build …vim
Dockerfile的制做步骤:数组
1.建立一个目录;bash
2.在目录中建立一个首字母大写的文件,供docker build识别;ide
3.由于Dockerfile的执行环境在建立的目录中,因此能够建立相对应的文件,供dockerfile使用;ui
ex:spa
[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书写格式:
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<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建立镜像:
[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
运行此镜像:
[root@www ~]# docker container run --rm --name ngx1 ljymyy/nginx:v0.2 123