• 基于Dockerfile制作镜像


    1.  Dockerfile 编写的基本结构:Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为Dockerfile 中的注释。

    2.  一台主机可以有多个Dockerfile要使用多个Dockerfile 创建镜像,可以在不同目录编写Dockerfile,然后在Dockerfile 所在的目录下构建新的镜像。

         注意:Dockerfile 中所包含需要的内容;如COPY的文件、目录等,都需要在Dockerfile 同级目录下存在。

    3.  docker build命令:docker build是基于dockerfile制作镜像的命令。命令格式为:

    1. docker build [OPTIONS] PATH | URL | -
    2. 选项:
    3. -t: 指定要创建的目标镜像名
    4. -c,- cpu-shares int: CPU份额(相对权重)
    5. -m,- memory bytes: 内存限制
    6. --build-arg: 设置构建时变量,就是构建的时候修改ARG指令的参数

            1>.  PATH: 一般用" . ",( 即当前工作目录 )作为上下文路径。

            一般来说, 应该会将 Dockerfile 置于一个空目录下, 或者项目根目录下。 如果该目录下没有所需文件, 那么应该把所需文件复制一份过来。 如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore , 该文件是用于剔除不需要作为上下文传递给Docker 引擎的。
            
            实际上 Dockerfile 的文件名并不要求必须为 Dockerfile , 而且并不要求必须位于上下文目录中, 比如可以用 " -f ../Dockerfile.php "参数指定某个文件作为Dockerfile ,一般大家习惯性的会使用默认的文件名 Dockerfile , 以及会将其置于镜像构建上下文目录中 。
            2>.  URL:  docker build 还支持从 URL 构建, docker build http://server/context.tar.gz ,如果所给出的 URL 是个 tar 压缩包,那么 docker 引擎会下载这个包,并自动解压缩,以其作为上下文,开始构建。
            3>.   - ": docker build还支持从标准输入中读取 Dockerfile 进行构建:
                    
            ·  docker build - < Dockerfile 或者cat Dockerfile | docker build -
    如果标准输入传入的是文本文件,则将其视为 Dockerfile ,并开始构建。这种形式由于直接从标准输入中读取Dockerfile 的内容,它没有上下文,因此不可以像其他方法那样可以将本地文件 COPY 进镜像之类的事情。

            ·  docker build - < context.tar.gz

    如果发现标准输入的文件格式是 gzip bzip2 以及 xz 的话, 将会使其为上下文压缩包,直接将其展开, 将里面视为上下文, 并开始构建。
    4.  Dockerfile指令---FROM指令:
            1>.   介绍: FROM 指令必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始;FROM 指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境。
            2>.  语法格式:
    1. FROM <repository>[:<tag>] 或
    2. FROM <repository>@<digest>

            3>.  示例:

    1. # Description: test image
    2. FROM busybox:latest

    5.  Dockerfile指令---MAINTAINER指令:

            1>.  介绍:用于让dockerfile制作者提供本人的详细信息。dockerfile 并不限制MAINTAINER 指令可以出现的位置,但推荐将其放置于FROM指令之后。

            2>.  格式:

    MAINTAINER 's detail>

            3>.  示例: 

    1. # Description: test image
    2. FROM busybox:latest
    3. MAINTAINER "Along "

    6.  Dockerfile指令---COPY指令:

            1>.  介绍:从上下文目录中复制文件或目录到容器里指定的路径。

            2>.  格式:

    1. COPY <src>... <dest>
    2. COPY ["",... ""]

            注意:

                    ·  要复制的源文件或目录可以是多个,支持使用通配符; 如:
                       COPY hom* /mydir/  或  COPY hom?.txt /mydir/
                    ·  要复制的文件必须是build上下文中的路径,不能是其父目录中的文件;
                    ·  如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制;
                    ·  使用 COPY 指令, 源文件的各种元数据都会保留。 比如读、 写、 执行权限、 文件变更时间等;
                    ·  目标路径,即正在创建的image的文件系统路径;建议使用绝对路径, 也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定);
                    ·  目标路径不需要事先创建, 如果目录不存在会在复制文件前先行创建缺失目录;
                    ·  在路径中有空白字符时,通常使用第2种格式;
            3>.  示例:
    1. # Description: test image
    2. FROM busybox:latest
    3. MAINTAINER "Along "
    4. COPY index.html /data/web/html/ #要确保dockerfile 同级路径下有index.html文件

    7.  Dockerfile指令---ADD指令:

            1>.  介绍:ADD 指令类似于COPY指令,ADD支持使用TAR文件和URL路径。

            2>.  格式:

    1. ADD <src> .. <dest>
    2. ADD ["".. ""]

            注意:同COPY指令,但是如果是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于"tar-x"命令;然而,通过URL获取到的tar文件将不会自动展开。

            示例:

    1. # Description: test image
    2. FROM busybox:latest
    3. MAINTAINER "Along "
    4. COPY index.html /data/web/html/
    5. COPY yum.repos.d /etc/yum.repos.d/
    6. ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/

    8.  Dockerfile指令---WORKDIR指令:

            1>.  介绍:用于为Dockerfile中所有的RUNCMDENTRYPOINTCOPYADD指令设定工作目录。

            2>.  格式:

    WORKDIR <dirpath>

            注意:在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,是相对此前一个WORKDIR指令指定的路径;

                       如该目录不存在, WORKDIR 会帮你建立目录。另外,WORKDIR也可调用由ENV指令定义的变量。
            3>.  示例:
    1. # Description: test image
    2. FROM busybox:latest
    3. MAINTAINER "Along "
    4. COPY index.html /data/web/html/
    5. COPY yum.repos.d /etc/yum.repos.d/
    6. WORKDIR /usr/local/
    7. ADD nginx-1.15.8.tar.gz ./src/

    9.  Dockerfile指令---VOLUME指令:

            1>.  介绍:用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其它容器上的卷。

                             在Dockerfile 中, 我们可以事先指定某些目录挂载为匿名卷, 这样在运行时如果用户不指定挂载, 其应用也可以正常运行, 不会向容器存储层写入大量数据。
            2>.  语法:
    1. VOLUME <mountpoint>
    2. VOLUME [""]

            例如:VOLUME /data

                    ·  这里的 /data 目录就会在运行时自动挂载为匿名卷, 任何向 /data 中写入的信息都不会记录进容器存储层, 从而保证了容器存储层的无状态化。 当然, 运行时可以覆盖这个挂载设置。 比如:
                    docker run -d - v mydata:/data xxxx
                    ·  在这行命令中, 就使用了 mydata 这个命名卷挂载到了 /data 这个位置, 替代了Dockerfile 中定义的匿名卷的挂载配置。

           

            3>.  示例:

    1. # Description: test image
    2. FROM busybox:latest
    3. MAINTAINER "Along "
    4. COPY index.html /data/web/html/
    5. COPY yum.repos.d /etc/yum.repos.d/
    6. #ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/
    7. WORKDIR /usr/local/
    8. ADD nginx-1.15.8.tar.gz ./src/
    9. VOLUME /data/mysql

    10.  Dockerfile指令---EXPOSE指令:

            1>.  介绍:声明运行时容器提供服务端口, 这只是一个声明, 在运行时并不会因为这个声明应用就会开启这个端口的服务。

                              在 Dockerfile 中写入这样的声明有两个好处, 一个是帮助镜像使用者理解这个镜像服务的守护端口, 以方便配置映射; 另一个用处则是在运行时使用随机端口映射时, 也就是 docker run -P时, 会自动随机映射 EXPOSE 的端口。
            2>.  语法:
    EXPOSE <port>[/ <protocol>] [<port>[/ <protocol>] ....EXPOSE <port>[/ <protocol>] [<port>[/ <protocol>] ....

            注意: 用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议

                        EXPOSE指令可一次指定多个端口,例如:EXPOSE 11211/udp 11211/tcp

         3>. 示例:

    1. # Description: test image
    2. FROM busybox:latest
    3. MAINTAINER "Along "
    4. COPY index.html /data/web/html/
    5. COPY yum.repos.d /etc/yum.repos.d/
    6. #ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/
    7. WORKDIR /usr/local/
    8. ADD nginx-1.15.8.tar.gz ./src/
    9. VOLUME /data/mysql
    10. EXPOSE 80/tcp

     11.  Dockerfile指令---ENV指令:

            1>.  介绍:用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令(ENVADD、COPY等)所调用

                              调用格式为 $variable_ name 或 ${variable_ name}
            2>.  格式:
    1. ENV <key> <value>
    2. ENV <key>=<value> . .

                    注意:第一种格式中,之后的所有内容均会被视作其组成部分, 因此,一次只能设置一个变量。

                               第二种格式可以一次设置多个变量,每个变量为一个”="的键值对,如果包含空格,可以以反斜线(\)进行转义,也可通过对其加引号进行标识;另外,反斜线也可用于续行。

                               定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能。

            3>.  示例: 

    1. # Description: test image
    2. FROM busybox:latest
    3. MAINTAINER "Along "
    4. ENV DOC_ROOT=/data/web/html/ \
    5. WEB_SERVER_PACKAGE="nginx-1.15.8"
    6. COPY index.html ${DOC_ROOT}
    7. COPY yum.repos.d /etc/yum.repos.d/
    8. #ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/ WORKDIR /usr/local/
    9. ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
    10. VOLUME /data/mysql
    11. EXPOSE 8080:80/tcp

    12.  Dockerfile指令---RUN指令:

            1>.  介绍:用于指定docker build过程中运行的程序,其可以是任何命令。

            2>.  语法:

    1. RUN <command>
    2. RUN ["", "", ""]

            注意: 第一种格式中,通常是一个shell命令, 且以“/bin/sh -c”来运行它;

                        第二种语法格式中的参数是一个JSON格式的数组,其中为要运行的命令的可执行文件,后面的为传递给命令的选项或参数;然而,此种格式指定的命令不会以“/bin/sh -c”来发起,因此常见的shell操作如变量替换以及通配符(?,*等)替换将不会进行;不过,如果要运行的命令依赖于此shell特性的话,可以将其替换为类似下面的格式: RUN ["/bin/bash", "-c", "", ""] 。
            3>.  示例:
    1. # Description: test image
    2. FROM busybox:latest
    3. MAINTAINER "Along "
    4. ENV DOC_ROOT=/data/web/html/ \
    5. WEB_SERVER_PACKAGE="nginx-1.15.8.tar.gz"
    6. COPY index.html ${DOC_ROOT}
    7. COPY yum.repos.d /etc/yum.repos.d/
    8. WORKDIR /usr/local/
    9. ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} ./src/
    10. #ADD ${WEB_SERVER_PACKAGE} ./src/
    11. VOLUME /data/mysql
    12. EXPOSE 8080:80/tcp
    13. RUN cd ./src && \
    14. tar -xf ${WEB_SERVER_PACKAGE}.tar.gz

    13.  Dockerfile指令---CMD指令:

            1>.  介绍:类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同。

                                RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动一个容器时。
                               CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过, CMD指定的命令可以被docker run的命令行选项所覆盖。
                                在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效。
            2>.  语法:
    1. CMD <command>
    2. CMD ["","",""] 或
    3. CMD ["",""]

            注意:前两种语法格式的意义同RUN

                       第三种则用于为ENTRYPOINT指令提供默认参数
                       json数组中,要使用双引号,单引号会出错
            3>.  示例:
    1. FROM busybox
    2. LABEL maintainer="Along " app="httpd"
    3. ENV WEB_DOC_ROOT="/data/web/html"
    4. RUN mkdir -p ${WEB_DOC_ROOT} && \
    5. echo "

      Busybox httpd server

      "
      > ${WEB_DOC_ROOT}/index.html
    6. CMD /bin/httpd -f -h ${WEB_DOC_ROOT}

    14.  Dockerfile指令---ENTRYPOINT指令:

            1>.  介绍:类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序。

                              与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指令指定的程序。

                              docker run命令的 --entrypoint选项的参数可覆盖ENTRYPOINT 指令指定的程序。
                              当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变, 不再是直接的运行其命令, 而是将 CMD的内容作为参数传给 ENTRYPOINT 指令。
            2>.  语法:
    1. ENTRYPOINT <command>
    2. ENTRYPOINT ["", "", ""]

                    注意:docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用。

                               Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
            
            3>.  示例:
    1. FROM busybox
    2. LABEL maintainer="Along " app="httpd"
    3. ENV WEB_DOC_ROOT="/data/web/html"
    4. RUN mkdir -p ${WEB_DOC_ROOT} && \
    5. echo "

      Busybox httpd server

      "
      > ${WEB_DOC_ROOT}/index.html
    6. ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}

                   

  • 相关阅读:
    JS基础:for...in、for...of、forEach(详解)
    vue3+ts组件练习(defineExpose defineEmits defineProps)
    EOS将发布的官方EVM怎么样?
    近2万签名的句子网络签名ACCESS\EXCEL数据库
    本地虚拟机centos7通过docker安装主从mysql5.7.21
    我又造了个轮子:GrpcGateway
    5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?
    微信小程序弹框显示自定义内容(1)
    两表union 如何保证group by 字段唯一
    30_ue4进阶末日生存游戏开发[为道具添加碰撞系统]
  • 原文地址:https://blog.csdn.net/NancyLCL/article/details/126450324