在Docker中,构建一个自定义镜像共有两种方法,一是通过commit指令构建,二是通过Dockerfile文件构建。第一种方式在上篇博客中已经详细介绍(Docker入门实战(二)——Docker镜像操作),接下来介绍在Docker中更为常用的方法——使用Dockerfile构建镜像。 用Dockerfile构建镜像的基本流程先来回顾下commit方式创建镜像的流程: 上述过程的第三步主要任务是在容器中安装软件,并进行相应的配置,如果把这个过程所要执行的命令全都提取出来,写入一个文件中,若需要构建镜像则直接运行该文件,基于其中的命令生成一个镜像。这就是基于Dockerfile构建镜像的方式,这个文件就称为Dockerfile。 Dockerfile文件的构成Dockerfile文件一共分为四个部分,分别是:注释信息、基础镜像、创建者信息、构建镜像所需的命令,如下所示: # Version: 1.1 #版本信息
FROM centos:7.2 #基础镜像
MAINTAINER Chaimm #维护者信息
RUN …… #以下为命令区
CMD ……
EXPOSE …… 该Dockerfile被构建时,Docker会生成一个具有指定基础镜像的操作系统,并逐一执行命令区的命令。当命令命令执行结束后,一个你所需要的镜像便生成了。 Dockerfile指令RUNRUN的用法RUN后面跟构建时需要执行的命令,有两种写法: RUN 命令 -参数 2.方式二:命令和参数以数组的形式存放(推荐) RUN [,] RUN的特点
CMDCMD的用法CMD后的命令仅在容器启动时执行,和RUN一样,也有两种用法: CMD 命令 -参数 2.方式二:命令和参数以数组的形式存放(推荐) CMD [,] CMD的特点
ENTRYPOINT和CMD一样,ENTRYPOINT也在容器启动时执行,只不过ENTRYPOINT不会被docker run后的命令覆盖。当容器运行时,docker run后的命令会追加到ENTRYPOINT的末尾,因此ENTRYPOINT和docker run搭配可以产生神奇的效果:
ENTRYPOINT [] docker run -i -t myContainer -g 此时,docker run某位的参数会追加到ENTRYPOINT后,从而相当于执行命令: /usr/sbin/nginx -g 这种方式可以为命令动态添加参数。 WORKDIR该命令用于指定Dockerfile中指令的工作目录,类似于Linux中的cd命令。如: WORKDIR /usr/tomcat/bin
ENTRYPOINT [] 当设置完WORKDIR后,后面的命令将基于该工作目录执行。 ENV该命令用于设置环境变量,且该环境变量会持久化地保存至该镜像的所有容器中。 ENV CATALINA_HOME /usr/tomcat/bin/
WORKDIR $CATALINA_HOME 也可以使用-E参数在容器运行的时候设置,如下所示: run -i -t -e myContainer /bin/bash 使用-E参数设置的环境变量只在当前容器运行期间有效,关闭容器后随即消失。 USER该命令用于指定镜像启动时的用户身份和用户组,如: USER chai #指定用户
USER chai:group #指定用户和用户组 VOLUME该命令用于为基于本镜像的容器添加卷。 什么是“卷”?“卷”本质上是一个目录,该目录存在于宿主机中,可以在多个容器间共享。 如何添加“卷”?VOLUME [] ADD该命令用于将宿主机中的文件/目录复制到容器的指定目录下,如: COPY file /usr/bin/
COPY file /usr/bin/newFile PS:Docker根据末尾是否有“/”来判断目标路径为目录还是文件。 本命令和ADD类似,唯一区别是ADD可以添加宿主机中任何文件/目录,而COPY只能添加当前构建目录中的文件/目录。 生成镜像当Dockerfile书写完毕后,使用如下命令生成镜像: docker build -t= dockerfile路径 启动镜像当镜像构件完毕后,使用以下命令来启动一个镜像(启动后即为一个容器): docker run 关于docker run命令可以参考博文Docker入门实战(一)——Docker常用命令,这里详细介绍-p参数。 PS:除了 -p参数外还有个-P参数,该参数后无需跟端口号,它会将dockerfile中指定的端口号绑定到宿主机的随机端口号上。 |
|