• DockerFile


    1、DockerFile简介

      DockerFile是由一系列命令和参数构成的脚本配置文件,可以用来快速构建自定义Docker镜像文件。其内容涉及执行代码或文件、环境变量、依赖包、运行时环境、动态链接库、操作系统发行版、服务进程、内核进程等。
      从应用软件的角度看:Dockerfile是软件原材料,docker镜像是软件交付品,docker容器是软件的运行态。Dockerfile面向开发,docker镜像成为交付标准,docker容器涉及部署和运维,三者缺一不可,共同构成Docker体系的基石。

    2、DockerFile构建过程

    指令从上到下,顺序执行;
    执行流程:
     (1)从基础镜像开始运行一个容器;
     (2)执行一条命令并对容器进行修改;
     (3)执行类似docker commit的操作提交一个新的镜像层;
     (4)基于刚提交的镜像运行一个新的容器;
     (5)执行dockerfile中的下一条命令并对容器进行修改;
     (6)执行类似docker commit的操作提交一个新的镜像层;
     (循环.............)
     (7)直到dockerfile中的所有命令都执行完成。

    3、DockerFile保留字指令

    使用 # 开头来标示注释行;
    每个保留字指定必须大写,且后面不能0参数;

    FROM

    FROM命令必须是DockerFile的第一条指令,用于指定当前镜像所基于的基础镜像,如果不以任何镜像为基础,写法为:FROM scratch。语法:

    ##<tag>和<digest> 指定镜像版本,缺省值为 latest
    FROM <image>
    FROM <image>:<tag>
    FROM <image>:<digest> 
    

    MAINTAINER

    用于指定镜像维护者的姓名和邮箱地址语法:

    MAINTAINER <name>
    

    RUN

    容器构建时需要运行的命令。

    ##格式一:(command为要执行的命令,Linux中默认:/bin/sh -c ;windows上默认:cmd /S /C)
    RUN <command>
    RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
    ##格式二:(executable为可执行文件,param1、param2位参数)
    RUN ["executable", "param1", "param2"]
     RUN ["/bin/bash", "-c", "echo hello"]
    

    对于RUN后面多行命令一行写不下的可使用换行符 。建议尽量少写RUN 命令,原因是Dockerfile中每一个RUN指令都会建立一层镜像,多个RUN就构建了多层镜像,容易造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

    CMD

    用于指定容器启动时要运行的命令。

    ##用法一:exec格式,CMD ["executable(可执行文件)","param1","param2"...]
    CMD [ "sh", "-c", "echo $HOME" ]
    ##用法二:exec格式,CMD ["param1","param2"...]
    CMD [ "echo", "$HOME" ]
    ##用法三:shell格式,CMD <command> <param1> <param2> ...
    CMD echo $HOME
    

    注意:因为docker将CMD后的参数解析为JSON array,故参数不能使用单引号,一定要用双引号,

    RUN和CMD的区别

    RUN是容器构件的时候运行的命令,并会提交运行的结果;
    CMD是容器启动的时候执行的命令,在构件时并不运行,构件时只是对容器运行时需要执行的命令作了定义了;

    ENTRYPOINT

    用于指定容器启动时要运行的命令。

    ##用法一:exec格式,ENTRYPOINT ["executable", "param1", "param2"]
    ##用法二:shell格式,ENTRYPOINT command param1 param2
    

    CMD和ENTRYPOINT的区别

    相同点:
    运行时机相同,都是在容器启动时运行;
    ENTRYPOINT和CMD在dockerfile中都只能写一条,如何存在多个,那么各自都只有最后一个生效。

    不同点:
    docker run 命令后面的command 会被当做参数传递给ENTRYPOINT,形成新的命令组合;
    docker run 命令后面的command 会覆盖掉dockerfile中的CMD命令;
    当Dockerfile中同时写了ENTRYPOINT和CMD,且CMD不是一个完整的可执行命令,则CMD指定的内容将会作为ENTRYPOINT的参数。

    EXPOSE

    指定当前容器对外暴露的监听端口。注意:EXPOSE并不会使容器访问主机的端口,如果要使容器端口与主机端口有映射关系,要在容器启动时候使用 -P 参数指定。

    EXPOSE <port>
    

    WORKDIR

    指定在容器创建后,终端登陆后的默认工作目录,未指定的缺省目录为根目录 ,指定不存在的目录会创建,对RUN、CMD、ENTRYPOINT、COPY、ADD命令生效

    WORKDIR <dir>
    

    ENV

    用于设置在构建镜像过程中使用的环境变量,先定义,后使用

    ##一次设置单个环境变量
    ENV <key> <value>
    ##一次设置多个环境变量
    ENV <key1>=<value1> <key2> <value2> ...
    ##使用定义的环境变量
    $key
    

    ADD

    将宿主机目录下的文件copy至镜像,且ADD命令会自动处理URL和解压tar压缩包。

    ##用法一:
    ADD <src1> <src2> ... <dest>
    ##用法二:
    ADD ["<src1>", "<src2>",..."<dest>"]
    

    其中容器内的绝对路径,或者相对于工作目录的相对路径;是一个本地文件/压缩文件,或者一个url(类似于wget)。不建议把指定一个文件夹为,这样会复制整个目录的内容,包括文件系统元数据。

    COPY

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

    ##用法一:
    COPY <src> <src2> ... <dest>
    ##用法二:
    COPY ["<src>", "<src2>",..."<dest>"]
    

    ADD和COPY的区别:

    ADD有自动解压缩功能,COPY没有;
    COPY的只能是本地文件,ADD的无此限制。

    VOLUME

    容器数据卷,可挂载本地文件夹或其他容器中的文件夹,用于数据的保存和持久化工作。

    ##用法: ["/data"]可以是一个JsonArray ,也可以是多个值
    VOLUME ["/data"]
    ##示例:
    VOLUME ["/var/data/"]
    VOLUME /var/data
    VOLUME /var/data /var/log
    

    ONBUILD

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

    ##用法:ONBUILD [INSTRUCTION]
    ONBUILD RUN ls -al
    

    4、DockerFile示例

      DockerFile主体内容四要素:基础镜像信息、维护者信息、镜像操作指定、容器启动时执行指令。
      DockerFile构建三步骤:编写、docker build 、docker run 。

    from centos
    ENV  logindir /tmp
    WORKDIR $logindir
    RUN yum -y install vi
    RUN yum -y insatll net-tools
    EXPOSE 80
    

    5、本地镜像发布至阿里云

    ##制作本地镜像
    docker commit -a deepinthought -m "just a test images" [container id] [imagename]:[tag]
    ##登陆阿里云
    sudo docker login --username= deepinthought registry.cn-hangzhou.aliyuncs.com
    ##关联标签、版本号
    sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/deepinthought/testimages:[镜像版本号]
    ##推送镜像
    sudo docker push registry.cn-hangzhou.aliyuncs.com/deepinthought/testimages:[镜像版本号]
    
  • 相关阅读:
    一文看懂Python匿名函数
    Python数据分析库之pandas,你该这么学!No.1
    探究以太坊 2.0 的分叉选择规则
    Plasma 设计综合列表
    从比特币到 Polkadot
    Ethereum Plasma MVP and Plasma Cash
    Java程序员进阶路线-高级java程序员养成
    matlab混合编程向导(vc,vb,.net...)
    matlab混合编程向导(vc,vb,.net...)
    matlab混合编程向导(vc,vb,.net...)
  • 原文地址:https://www.cnblogs.com/DeepInThought/p/10910597.html
Copyright © 2020-2023  润新知