1.概述: Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。
        2.Dockerfile的结构:一般来说,Dockerfile可分为如下4个部分:基础镜像信息
                                                                                                     维护者信息
                                                                                                     镜像操作指令
                                                                                                     容器启动时执行指令   
        3.编写Dockerfile时的步骤:
                                            step1 :一开始必须指明所基于的镜像名称。
                                            step2 :接下来一般是说明维护者的信息。
                                            step3 :接着是镜像操作指令,如RUN指令,RUN指令将对镜像执行跟随的命令,每运行一条RUN指令镜
                                            像就添加                       
                                                         新的一层并提交。
                                            step4 :最后是CMD指令,用来指定运行容器时的操作指令。 
        4.指令说明:
                4.1、FROM : 指定所创建镜像的基础镜像,如果本地不存在,则会默认去Docker Hub下载指定镜像。
                           格式为 :FROM imageName:tag
                                         FROM imageName
                                         FROM imageName@digest     bs:digest 为镜像的sha256sum值。
                            
                            exp1 :FROM buildpack-deps:jessie-scm
                            exp2 :FROM nginx
                            exp3 :FROM nginx@a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
                    
                    4.2、MAINTAINER : 指定维护者信息。
                            格式为 :MAINTAINER 维护者信息(bs:此维护者信息会写入生成镜像的Author属性域中)

                            exp1 :  MAINTAINER wzy_create@188178xxxx@163.com

                    4.3、RUN : 运行指定命令,在镜像生成过程中执行。
                            格式为 :RUN command
                                          RUN ["executable" , "param1" , "param2" , ...............]
                           
                            exp1 : RUN yum install iproute nginx && yum clean all 当命令较长的时候可以使用 \ 号来换行
                            exp2 :   RUN apt-get update \
                                                     && apt-get install -y libsnappy-dev zlib1g-dev libbz2-dev \
                                                     && rm -rf /var/cache/apt
                            exp3 :   RUN["bin/bash", "-c", "echo hello"]

                    4.4、CMD : 用来指定容器启动的时候默认执行的命令。
                            格式 :CMD["executable", "param1", "param2",.......]     #使用exec执行,推荐。
                                       CMD param1 param2                                       #在/bin/sh中执行,提供给需要交互的应用。
                                       CMD["param1", "param2",.....]                           #提供给ENTRYPOINT的默认参数。
                             
                             注意点 :Dockerfile只能有一条CMD命令,如果指定了多条只有最后一条会被执行。

                      4.5、LABEL : 用来指定生成镜像的元数据标签信息。
                             格式 :LABEL key=value key=value key=value ..........
                             exp1 :  LABEL version="1.0" descript="update log style"

                     4.6、EXPOSE : 声明镜像内服务监听的端口。
                             格式 :EXPOSE port port port .........
                             exp1 :  EXPOSE 8080 80 8443 443
                
                             注意点 :EXPOSE只是起到申明作用,并不会自动完成端口映射,启动容器的时候还是需要使用
                                           -p指定端口映射,
                                           -P则会随机指定端口映射。(随机指定宿主机端口与镜像服务监听端口映射)

                      4.7、ENV : 指定环境变量,在镜像生成过程中会被后续的RUN指令使用,在镜像启动的容器中也会存在。
                              格式 :ENV key=value key=value
                                         ENV key value (只能一对,想要定义多个,再定义ENV key value)。
                              exp1 :ENV PG_MAJOR=9.3 PG_VERSION=9.3.4
                              exp2 :  ENV PG_MAJOR 9.3 
                                         ENV PG_VERSION 9.3.4

                              注意点 :指令指定的环境变量在容器运行时可以被覆盖,如docker run --env PG_MAJOR=9.4 则容器内的此环境就是9.4。

                      4.8、ADD : 将复制指定的路劲下的内容到容器内的目标路径。
                             格式 :ADD src dest    
                                        #src 可以是此Dockerfile所在目录的一个相对路径(文件或目录),
                                               也可以是一个url , 还可以是一个tar文件(如果是tar文件,会自动解压到dest路径下)。
                                        #dest可以是容器内的绝对路径,或者相对于工作目录WORKDIR的相对路径。(路径支持正则表达式)。

                              exp1 : ADD  *.java  /code/      #将当前目录下的所有java文件复制到容器工作目录相对路为/code/的目录下。

                      4.9、COPY : 将复制指定的路劲下的内容到容器内的目标路径。跟ADD差不多,推荐使用COPY。
                              格式 :COPY src dest
                                                  #src 可以是此Dockerfile所在目录的一个相对路径(文件或目录),
                                                        也可以是一个url , 还可以是一个tar文件(如果是tar文件,会自动解压到dest路径下)。
                                                  #dest可以是容器内的绝对路径,或者相对于工作目录WORKDIR的相对路径,目标路径不存在时会自动创建                                                          
                                                    (路径支持正则表达式)。 

                     4.10、ENTRYPOINT : 指定镜像的默认入口命令,该入口命令会在容器启动时作为根命令执行,
                                                     所有传入值作为该命令的参数,跟CMD相似但是会在CMD前面执行。
                              格式 : 跟CMD一致。
                              注意点 :Dockerfile 中只能有一个ENTRYPOINT ,指定多个的时候只会执行最后一个。
                                            在运行的时候可以使用--entrypoint 覆盖此命令值。

                     4.11、VOLUME : 创建一个数据卷挂载点。
                              格式 :VOLUME["/test"]。

                     4.12、USER : 指定运行容器时的用户名或UID,后续的RUN指令也会使用指定用户身份。
                              格式为 :USER username
                              用法 :当服务不需要使用管理员权限时,可以使用该命令指定运行用户,但是在之前创建此用户。如: 
                                         RUN groupadd -r postgres && useradd -r -g postgres postgresUser1。

                     4.13、WORKDIR : 指定镜像的工作目录,为后续的RUN\CMD\ENTRYPOINT指令配置工作目录。
                              格式 :WORKDIR /path
                              注意点 :可以使用多个WORKDIR指令,但是后续的命令都是参数则是前面路径的相对路径,如:
                                          WORKDIR /a
                                          WORKDIR b
                                          WORKDIR c
                                                 最终的工作目录为 /a/b/c

                    4.14、ARG : 指定一些镜像内使用的参数(如版本号等),这些参数在执行docker build 命令的时候才会以
                                           --build-arg argname=value 格式传入。
                              格式 :ARG argName1[=value1] argName2[=value2]


                    4.15、ONBUILD : 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。
                               格式为 :ONBUILD 指令内容。
                               exp1 :ONBUILD  ADD .java   /app/src
                               exp2 :ONBUILD  RUN rm -rf *

                              bs:如果我们的使用Dockerfile DA 构建了镜像A,而DA中有exp1跟exp2两条指令,而这时
                                     我们使用DA作为Dockerfile DB的基础镜像(就是FROM DA),这个时候就相当于在DB中会是如下结果
                                      FROM DB
                                      ADD .java  /app/src
                                      RUN rm -rf *        (注意三天语句一定是跟随的,中间不会有其他语句)。

                     4.16、STOPSIGNAL : 指定所创建的的镜像启动的容器接收退出的信号值。
                               exp1 : STOPSIGNAL stop
                               exp2 : STOPSIGNAL shirt_down

        5、创建镜像:docker build ,该命令将读取指定路径下(包括子目录)的Dockerfile文件,并将路径下的所有内容发送给docker服务器, 
             由服务器来创建镜像。
                             -f 指定路径,不使用的话默认读取当前目录下(包括子目录)的Dockerfile文件。
                             -t 指定镜像名称