Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:

指令说明示例
FROM指定基础镜像ENV key value
ENV设置环境变量,可在后面指令使用COPY./jre11.tar.gz /tmp
COPY拷贝本地文件到镜像的指定目录
RUN执行Linux的shell命令,一般是安装过程的命令RUN tar -zxvf /tmp/jre11.tar.gz&& EXPORTS path=/tmp/jre11:Spath
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar
  1. FROM 功能为指定基础镜像,并且必须是第一条指令。 如果不以任何镜像为基础,那么写法为:FROM scratch。 同 时意味着接下来所写的指令将作为镜像的第一层开始

  2. RUN 功能为运行指定的命令

注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多 少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 RUN书写时的换行 符是\

  1. CMD 功能为容器启动时要运行的命令

注意:补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON array

  1. RUN和CMD的区别 不要把RUN和CMD搞混了。 RUN是构件容器时就运行的命令以及提交运行结果 CMD是容器启动时执行的命 令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子

  2. LABEL 功能是为镜像指定标签,为镜像写一些注释信息

但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号 如下:

注意:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖

  1. EXPOSE 指定于外界交互的端口 功能为暴漏容器运行时的监听端口给外部 但是EXPOSE并不会vim 使容器访问主机的端口 如果想使得容器与主 机的端口有映射关系,必须在容器启动的时候加上 -P参数

注意:如果在端口号后面加/tcp,默认为tcp协议,如果需要UDP端口需要添加/udp

  1. ENV 功能为设置环境变量

  2. ADD 一个复制命令,把文件复制到镜象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似 于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。

注意:尽量不要把写成一个文件夹,如果是一个文件夹了,复制整个目录的内容,包括文件系统元数据

  1. WORKDIR 设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次 WORKDIR:工作目录,类似于cd命令 格式:

WORKDIR /path/to/workdir示例:

WORKDIR /a (这时工作目录为/a)

WORKDIR b (这时工作目录为/a/b)

WORKDIR c (这时工作目录为/a/b/c)

  1. VOLUME 用于指定持久化目录 可实现挂载功能,可以将内部文件夹挂载到外部

  2. ENTRYPOINT 该命令与CMD类似,用于执行命令使用,还可以与CMD命令一起拼合使用

它与CMD的区别: ​ 相同点:只能写一条,如果写多条,那么只有最后一条生效

不同点:CMD在创建容器时,在后面添加其他的CMD指令,CMD会被覆盖,但是ENTRYPOINT不会被覆盖,如果两个同时使用,CMD会变成ENTRYPOINT的参数

dockerFile实例

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]





 
#指定基础镜像
FROM ubuntu:16.04
#配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR  && tar -xf ./jdk8.tar.gz&& mv ./jdk1.8.0_144 ./java8
#配置环境变量
ENV JAVA_HOME=SJAVA_DIR/java8
ENV PATH=SPATH:SJAVA_HOME/bin
# 入口,java项目的启动命令
ENTRYPOINT ["java","-jar""/app.jar"]