• dockerfile的概念


    目录

    一、dockerfile是什么

    1.1 docker镜像的分层

    1.2 docker的三要素

    二、创建docker镜像

    2.1 docker镜像

    2.2 docker镜像的创建方式

    2.3 基于已有的镜像创建

    2.4 基于本地模板创建

    2.5 基于dockerfile的创建

    2.5.1 dockerfile的结构

    2.5.2 dockerfile的操作指令

    三、镜像分层的原理

    3.1 docker镜像分层

    3.2 涉及的技术

    3.2.1 bootfs内核空间

    3.2.2 rootfs内核空间

    3.2.3  AUFS 与overlay/ overlay2 (docker高版本)

    四、dockerfile的编写

    4.1 镜像构建的命令

    4.1.1 去构建一个dockerfile的具体的步骤

    4.1.2 dockerfile中的语句规则

    4.2 构建一个tomcat镜像

    总结


    dockerfile是一个包含用于组合镜像的命令文件,docker通过独缺dockerfile中的指令自动生成镜像

    一、dockerfile是什么

    dockerfile是一个自定义的镜像的一套规则

    dockerfile是由多条指令组成的,每一条的指令都对应着docker镜像中的每一层

    1.1 docker镜像的分层

    dockerfile的原理就是镜像分层

    Dockerfile 中的**每个指令都会创建一个新的镜像层**(是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)

    镜像层将被缓存和复用(后续的镜像层将基于前面的一层,每一层都会有下几层的缓存)

    当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(就会自动销毁)

    某一层的镜像缓存失效之后,它之后的镜像层缓存就都会失效(第一层不成功,那么第二层也就不再成功,相当于地基)

    容器的修改并不会影响镜像,如果在某一层中添加一个文件,在下一层中删除它,镜像中依然会包含该文件

    1.2 docker的三要素

    ①镜像:容器的一种静态模板(一组资源的集合,分层的方式一层层叠加,组合在一起完成一个完整的镜像)

    ②容器:是一个应用/环境的运行时状态

    ③仓库:用于存放镜像

    二、创建docker镜像

    2.1 docker镜像

    是应用发布的标准格式,支撑着一个docker容器的运行

    2.2 docker镜像的创建方式

    • 基于已有镜像创建(docker  tag)
    • 基于本地模板创建 (docker   load<)
    • 基于Dockerfile创建(docker    build)
    • 基于已有容器创建    (docker    commit)

    2.3 基于已有的镜像创建

    将容器里面运行的程序及运行环境打包生成新的镜像

    docker commit [选项] 容器id/容器名 仓库名:标签

    -m说明信息
    -a作者信息
    -p生成过程中停止容器的运行

    2.4 基于本地模板创建

     通过导入操作系统模板文件生成新的镜像

    wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
     

    导入镜像

    cat debian-7.0-x86-minimal.tar.gz | docker import - debian:new 

    导入查看镜像信息

    docker images 

     

    2.5 基于dockerfile的创建

     dockerfile是由一组指令组成的文件

    dockerfile每行支持一条指令,每条指令可携带多个参数,一条指令可以用&&方式,去写多条指令。

    dockerfile支持以“#”为开头的注释

    2.5.1 dockerfile的结构

    基础镜像信息(Linux发行版:centos ubantu suse debian alpine redhat)
    维护者信息(docker search可查看)
    镜像操作指令(tar yum make)
    容器启动时执行指令  (**cmd["/root/run.sh"] 、entrypoint**都是系统启动时,第一个加载的程序/脚本/命令)
     

    2.5.2 dockerfile的操作指令

     add和copy的区别

    copy = cp复制,将宿主机指定的文件复制到image层中

    ADD

    ①可以复制,同时兼有了解压的功能
    add nginx-1.12.tar.gz /root/nginx
    在复制进去的同时会对压缩包进行解压到容器内部就是 nginx-1.12/
    ②add复制的对象可以是URL,跨节点的数据(URL)
     

    cmd和entrypoint的区别

    都是容器启动时要加载的命令
    ①  cmd   是容器环境启动时默认加载的命令
    ②  entrypoint  是容器环境启动时第一个加载的命令程序/脚本程序init

    如果 ENTRYPOINT使用了shell模式,CMD指令会被忽略。
    entrypoint ["sh","-c", "echo $HOME"]
    cmd [ "restart" ] #CND会被忽略
    如果 ENTRYPOINT使用了exec模式,CMD指定的内容被追加为ENTRYPOINT 指定命令的参数。
    entrypoint ["/etc/init.d/nginx"]
    cmd [ "restart"]  #CMD作为entrypoint的参数
    如果 ENTRYPOINT使用了exec模式,CMD也应该使用exec模式。

    例如:

     vim Dockerfile  #编辑文件,添加下面的内容
    FROM centos:7
    CMD ["top"]
     
    docker build -t centos:test001 .  ###执行镜像文件
     
    docker run -itd --name test centos:test001 /bin/bash 启动容器
     
    docker ps -a

    exec模式

    [root@node1 test01]# cat Dockerfile
    FROM centos:7
    CMD ["echo","$HOME"]
    [root@node1 test01]# docker run --rm centos:v1   ##--rm 一次性运行(删除)
    $HOME

     shell模式

    cat  dockerfile
    FROM centos:7
    CMD  ["sh","-c","$HOME"]
     
    docker run  --rm centos:test03
     
    注:/bin/sh  -c  nginx   shell 模式
        nginx                exec  模式

    三、镜像分层的原理

    3.1 docker镜像分层

    • docker镜像位于bootfs之上
    • 每一层镜像的下一层成为父镜像
    • 第一层镜像成为base image(操作系统环境镜像)
    • 容器层(可读可写,为了给用户操作),在最顶层(writable)
    • 容器层以下都是readonly

    3.2 涉及的技术

    3.2.1 bootfs内核空间

    主要包含bootloader和kernel

    bootloader主要是引导加载kernel, Linux刚启 动时会加载bootfs文件系统,在Docker 镜像的最底层是bootfs

    这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会把临时创建的bootfs这个文件系统删掉

    在linux操作系统中(不同版本的linux发行版本),linux加载bootfs时会将rootfs设置为read-only,系统自检后会将只读改为读写,让我们可以在操作系统中进行操作
     

    3.2.2 rootfs内核空间

    1. 在bootfs之上(base images, 例如centos、ubuntu)
    2. 包含的就是典型Linux 系统中的/dev, /proc, /bin, /etc 等标准目录和文件
    3. rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等

    3.2.3  AUFS 与overlay/ overlay2 (docker高版本)

    AUFS是一种联合文件系统。它使用同一个Linux

    host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层

    而docker使用了overlay/overlay2存储驱动来支持分层结构

    overlays将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载

    overlay 结构:

    overlayfs在linux主机上只有两层,一个目录在下层,用来保存镜像(docker),另外一个目录在上层,用来存储容器信息

    rootfs 基础镜像
    lower 下层信息、(为境像层,可读)
    upper 上层目录(容器信息,可读可写)
    work 运行的工作目录(copy-on-write写时复制---》准备容器环境)
    merged "视图层”(容器视图)
     

    四、dockerfile的编写

    dockerfile是由一组指令去组成的文件,分为:

    ①基础镜像信息(指定操作系统镜像是什么镜像、什么版本)
    ②维护者信息
    ③镜像操作指令
    ④容器启动时执行指令(启动容器的时候,执行的脚本/命令参数等等)

    4.1 镜像构建的命令

    4.1.1 去构建一个dockerfile的具体的步骤

    第一步:编写Dockerfile文件,用于描述镜像生成的步骤
    第二步:使用docker build -t name:tag 命令构建镜像

    docker  build  参数  镜像名  .
     
    -t:tag  打标签
    -f:指定dockerfile  目录
    . :指构建镜像时使用的环境(当前目录),构建镜像时使用的上下文环境

    4.1.2 dockerfile中的语句规则

    1. #号代表注解。
    2.Dockerfile每一行都是以某个指令(约定大写字母)开始,后面可加参数构成完整指令,用于描述镜像构建步骤。
    3.指令从上倒下依次执行
    4.Dockerfile的第一个指令一定是FROM指令,用于指定基础镜像
    5.Dockerfile还可以使用.dockerignore文件来忽略在制作镜像时候需要忽略的文件或者目录,列如使用COPY指令时候忽略某些文件或者目录。
    6.所有指令参数为数组时,最好使用双引号
     

    4.2 构建一个tomcat镜像

    ①创建目录编写tomcat的dockerfile文件 

    FROM centos:7
    MAINTAINER build image tomcat
    EXPOSE 8080
     
    ADD jdk-8u191-linux-x64.tar.gz /usr/local/src
    WORKDIR /usr/local/src
    ENV JAVA_HOME /usr/local/src/jdk1.8.0_191
    ENV CLASSPATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    ENV PATH $JAVA_HOME/bin:$PATH
     
    ADD apache-tomcat-9.0.16.tar.gz /usr/local/src
    RUN mv apache-tomcat-9.0.16/ /usr/local/tomcat9 &> /dev/null
    ENV PATH /usr/local/tomcat9/bin/:$PATH
    ADD tomcat9.run.sh /usr/local/src
    RUN chmod 755 /usr/local/src/tomcat9.run.sh &> /dev/null
    CMD ["/usr/local/src/tomcat9.run.sh"]
    #ENTRYPOINT ["/usr/local/tomcat9/bin/catalina.sh","run"]
    1、ENRYPOINT指开启容器前镜像就已经执行了括号内的命令
     
    2、CMD是开启容器时,要执行的指令,设置容器启动后默认执行的命令及其参数,
    但 CMD 能够被 docker run 后面跟的命令行参数替换
     
    3、基于Dockerfile内有CMD或者ENTRYPOINT创建镜像时,
    docker run 后面就不要加指令(/bin/bash)了,会覆盖掉Dockerfile中的指令或者语法报错

     

    ②编写一个启动的脚本

    vim tomcat9.run.sh
    #!/bin/bash
    /usr/local/tomcat9/bin/catalina.sh run
     
    chmod +x   tomcat9.run.sh 

      

     

     ③生成镜像

    docker build -t tomcat:test .
    docker images |grep tomcat

      

    ④创建容器

     docker run -d -P tomcat:test  /bin/bash
     docker ps -a |grep tomcat

     

    总结

     

    1、docker镜像的分层

    dockerfile的原理就是镜像分层。

    Dockerfile 中的**每个指令都会创建一个新的镜像层**(是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)
    镜像层将被缓存和复用(后续的镜像层将基于前面的一层,每一层都会有下几层的缓存)
    当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(就会自动销毁)
    某一层的镜像缓存失效之后,它之后的镜像层缓存就都会失效(第一层不成功,那么第二层也就再成功,相当于地基)
    容器的修改并不会影响镜像,如果在某一层中添加一个文件,在下一层中删除它,镜像中依然会包含该文件
    2、dockerfile操作指令

    3、镜像分层的原理

    docker镜像位于bootfs之上
    每一层镜像的下一层成为父镜像
    第一层镜像成为base image(操作系统环境镜像)
    容器层(可读可写,为了给用户操作),在最顶层(writable)
    容器层以下都是readonly
    4、AUFS 与overlay/ overlay2 (docker高版本)

    AUFS是一种联合文件系统。它使用同一个Linux

    host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUrs使用该特性,实现了Docker镜像的分层

    而docker使用了overlay/overlay2存储驱动来支持分层结构

    overlays将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载

    overlay 结构

    overlayfs在linux主机上只有两层,一个目录在下层,用来保存镜像(docker),另外一个目录在上层,用来存储容器信息

    rootfs 基础镜像
    lower 下层信息、(为境像层,可读)
    upper 上层目录(容器信息,可读可写)
    work 运行的工作目录(copy-on-write写时复制-》准备容器环境)
    merged "视图层”(容器视图)
     
     

  • 相关阅读:
    双轴晶体中的锥形折射
    EMQX v4.4.5 发布:新增排他订阅及 MQTT 5.0 发布属性支持
    同一实体多字段的不同校验--validate
    药物临床试验数据递交PMDA的规定
    AWS认证SAA-C03每日一题
    【UniApp】-uni-app-打包成小程序
    PATA 1010 Radix(进制转换)
    [Power BI] 认识Power Query和M语言
    mapstruct实体转换 转换成不同类型
    inndy_echo
  • 原文地址:https://blog.csdn.net/zzn0109/article/details/125932235