Dockerfile中的保留字指令的过程解析

目录
  • 一、dockerfile是什么?
  • 二、dockerfile构建过程分析
  • 三、dockerfile保留字指令
    • 3.1、from
    • 3.2、maintainer
    • 3.3、run
    • 3.4、expose
    • 3.5、workdir
    • 3.6、env
    • 3.7、add 和 copy
    • 3.8、volume
    • 3.9、cmd 和 entrypoint
    • 3.10、onbuild
  • 四、实战案例
    • 4.1、制作一个自己的centos镜像
      • 4.1.1、引入:
      • 4.1.2、编写dockerfile文件
      • 4.1.3、构建centos镜像
      • 4.1.4、运行centos镜像
      • 4.1.5、查看镜像的变更历史
    • 4.2、onbuild示例

    之前简单学过docker,当时是为了快速部署一个项目,过的很快,对于dockerfile文件的编写,有些显的陌生。

    所以就写了这篇文章。希望能够帮助到大家哦!!!

    一、dockerfile是什么?

    概念:

    dockerfile是用来构建docker镜像的构建文件,由一系列命令和参数构成的脚本

    构建三步骤:

    • 编写dockerfile文件
    • docker build
    • docker run

    centos案例:

    centos案例:

    from scratch  #真正的基础镜像,
    add centos-7-x86_64-docker.tar.xz /
    
    # label 说明的意思
    label \  
        org.label-schema.schema-version="1.0" \
        org.label-schema.name="centos base image" \
        org.label-schema.vendor="centos" \
        org.label-schema.license="gplv2" \
        org.label-schema.build-date="20201113" \
        org.opencontainers.image.title="centos base image" \
        org.opencontainers.image.vendor="centos" \
        org.opencontainers.image.licenses="gpl-2.0-only" \
        org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
    
    cmd ["/bin/bash"] #最后一行执行的命令

    在哪找到的勒,在hub.docker.com上找到滴:centos。

    我们不会,但是可以先去看看人家怎么写的,抄作业这事,我想大家都熟悉吧。俗称cv大法。

    二、dockerfile构建过程分析

    入门知识:

    每条保留字指令(今天的重点)都必须为大写字母并且后面要跟随至少一个参数

    如:

    from scratch  #真正的基础镜像,
    add centos-7-x86_64-docker.tar.xz /

    指令按照从上到下,顺序执行

    #表示注释。

    #这就是注释

    每条指令都会创建一个新的镜像层,并对镜像进行提交。

    就如下面这样,可以套娃一样。

    dockerfile执行流程分析:docker从基础镜像运行一个容器

    • 执行一条指令并对容器作出修改
    • 执行类似docker commit的操作提交一个新的镜像层。
    • docker再基于刚提交的镜像运行一个新容器
    • 执行dockerfile中的下一条指令直到所有指令都执行完成

    后文有案例,结合案例回过来看更容易理解。

    小小番外:

    • 在现阶段,我们将dockerfiledocker镜像和docker容器看待为软件的三个不同阶段。
    • dockerfile面向开发—>docker镜像成为交付标准—>docker容器则涉及部署与运维
    • dockerfile中定义了进程所需要的一切东西,以前需要依赖的环境变量、依赖包、运行时环境等都被写入到dockerfile文件中啦。比起之前你在liunx服务器中,下载那么那么多软件,配置那么那么多,真的是简单蛮多,起码对于我这个菜鸡来说用docker部署真的简单了蛮多的。
    • docker镜像是在用dockerfile定义了一个文件后,docker build 时产生的一个docker镜像,当运行时docker镜像时,才会真正开始提供服务。

    docker容器就是运行起来即可提供服务的。

    三、dockerfile保留字指令

    dockerfiel保留字指令大致有以下:

    1. from
    2. maintaniner
    3. run
    4. expose
    5. workdir
    6. env
    7. add
    8. copy
    9. volume
    10. cmd
    11. entrypoint
    12. onbuild

    3.1、from

    基础镜像,即当前新镜像是基于哪个镜像创建的。

    #基于openjdk:8 创建镜像
    from openjdk:8

    3.2、maintainer

    镜像维护者的姓名和邮箱地址

    maintainer 宁在春crush@163.com

    3.3、run

    容器构建时需要运行的指令

    run mkdir -p /conf/my.cn

    3.4、expose

    当前容器对外暴露的端口

    #暴露出mycat的所需端口
    expose 8066 9066

    3.5、workdir

    指定在创建容器后,终端默认登录的进来工作目录

    #容器数据卷,用于数据保存和持久化工作
    workdir /usr/local/mycat

    3.6、env

    用来在构建镜像过程中设置环境变量

    #用来在构建镜像过程中设置环境变量env mycat_home=/usr/local/mycat

    这个环境变量可以在后续的任何run指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量。

    如:

    run $mycat_home/mycat

    3.7、add 和 copy

    add:

    将宿主机目录下的文件拷贝进镜像,并且add命令会自动处理url和解压tar压缩包

    add centos-6-docker.tar.xz / 

    copy:

    类似add,拷贝文件和目录到镜像中。

    将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置

    copy src destcopy ["src" "dest"]

    3.8、volume

    容器数据卷,用于数据持久化和数据保存。

    #将mycat的配置文件的地址暴露出映射地址,启动时直接映射宿主机的文件夹volume /usr/local/mycat

    3.9、cmd 和 entrypoint

    cmd

    cmd的指令和run相似,也是两种格式:

    • shell格式:cmd<命令>
    • exec 格式:cmd [“可执行文件“,”参数1“,”参数2“…..]

    dockerfile中可以有多个cmd指令,但只有最后一个生效,cmd会被docker run 之后的参数替换。

    entrypoint

    指定一个容器启动时要运行的命令。

    entrypoint的目的和cmd一样,都是在指定容器启动程序及参数。

    区别:

    在这里先简单说明一下区别,你可以将cmd理解为覆盖

    cmd cat /conf/my.cnfcmd /bin/bash
    

    这两条指令都写在dockerfile文件中,只会执行cmd /bin/bash ,而不会执行cmd cat /conf/my.cnf,因为cmd /bin/bash把上一条直接覆盖掉了。

    entrypoint则不同,你可以将entrypoint简单理解为追加。

    主要体现在docker run 上,如果使用dockerfile文件中最后是cmd结尾,则在运行时不能够额外追加命令,否则会覆盖掉dockerfile中的cmd命令。

    dockerfile文件中最后一行为entrypoint结尾时,你可以在docker run 命令后追加一些命令.

    3.10、onbuild

    当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发。

    四、实战案例

    4.1、制作一个自己的centos镜像

    4.1.1、引入:

    我们先从阿里云上拉取一个centos看看,看看有哪些问题,然后我们再进行自定义。

    docker pull centos # 拉取镜像docker run -it centos #运行镜像# ===== 测试====vim ceshi.txtifconfig pwd
    

    为什么会这样?因为docker仓库中的centos是精简版,其只有内核,没有其它的东西。

    要求自定义的centos能够解决上述问题。

    4.1.2、编写dockerfile文件

    为我们自定义的centos 编写dockerfile文件

    from centosmaintainer 宁在春<crush@163.com>env mypath /usr/localworkdir $mypathrun yum -y install vimrun yum -y install net-toolsexpose 80 cmd echo $mypathcmd echo "success"cmd /bin/bash  #只会运行最后一个
    

    然后把这个复制进去即可。

    mkdir -p /usr/local/docker/mycentos # 自己创建存放的位置vim dockerfile
    

    4.1.3、构建centos镜像

    docker build -f /usr/local/docker/mycentos/dockerfile  -t mycentos:1.1 .
    

    解释:

    • -f:后面跟随的是dockerfile 文件
    • -t :后面跟随的镜像名和版本号。
    • 最后的小数点:就表明是当前目录。
    • docker build -f dockerfile文件 -t 镜像名:tag .
    • 当dockerfile文件命名为dockerfile时并且在当前目录下时可简写为:
    • docker build -t 镜像名:tag .docker build -t mycentos:1.1 .

    执行:

    看到最后的这个就是代表成功了。

    docker images 查看全部镜像:

    4.1.4、运行centos镜像

    docker run -it mycentos:1.3pwdifconfig
    

    之所以我们进去容器的目录会从/切换到/usr/local是因为在dockerfile文件中已经写明。

    env mypath /usr/localworkdir $mypath
    

    4.1.5、查看镜像的变更历史

    docker history mycentos:1.1

    在这里也可以看出来,镜像它是由dockerfile文件中的指令,一层一层构建出来的。

    4.2、onbuild示例

    率先构建一个夫镜像

    编写dockerfile文件,命名为dockerfile2

    from centosrun yum -y install  curlonbuild run echo "我被子镜像继承了,输出此条语句"cmd ["crul", "-s","http://ip.cn"]
    
    docker build -f /usr/local/docker/mycentos/dockerfile2 -t my_father_centos .
    

    构建一个镜像继承夫镜像

    编写dockerfile文件,命名为dockerfile3

    from my_father_centosrun yum -y install  curlcmd ["crul", "-s","http://ip.cn"]
    docker build -f /usr/local/docker/mycentos/dockerfile3 -t my_son_centos .

    可以看到父镜像中的语句被输出了。

    到此这篇关于dockerfile中的保留字指令讲解的文章就介绍到这了,更多相关dockerfile保留字指令内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

    (0)
    上一篇 2022年3月21日
    下一篇 2022年3月21日

    相关推荐