zoukankan      html  css  js  c++  java
  • Docker详解(四) — Dockerfile剖析

    Docker详解(一)
    Docker详解(二)
    Docker详解(三)

    Dockfile简介

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

    构建步骤

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

    Dockerfile是用来构建Docker镜像的源码

    下面是官方 Centos 的 Dockfile文件以示参考

    FROM scratch
    ADD centos-7-docker.tar.xz /
    
    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="20181204"
    
    CMD ["/bin/bash"]
    

     

    Dockerfile构建过程解析

    Dockefile内容基础知识

    • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
    • 指令按照从上到下顺序执行
    • #表示注释
    • 每条指令都会创建一个新的镜像层,并对镜像进行提交

     

    Docker执行Dockerfile的大致流程

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

    从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段

    • Dockerfile是软件的原材料
    • Docker镜像是软件的交付品
    • Docker容器则可以认为是软件的运行态。

    Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

     

    Dockerfile体系结构

    • FROM:基础镜像,当前新镜像是基于哪个镜像的

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

    • RUN:容器构建时需要运行的命令

    • EXPOSE:当前容器对外暴露出的端口

    • WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点

    • ENV:用来构建镜像过程中设置环境变量

    • ADD:在宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

    • COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置

    • VOLUME:容器数据卷,用于数据保存和持久化工作

    • CMD:知道一个容器启动需要运行的命令,Dockerfil中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

    • ENTRYPOINT:指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数

    • ONBUILD:构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发
       

       

    案例

    上了我们看了DockerFile的基本知识点,大致了解了 每个关键字 是做什么的,但是凡事光说不练假把式,下面我们来做一些案例,以便于了解DockerFile
     

    自定义mycentos

    大家都知道从DockerHub上下载的centos中 是与 linux共享内核的基础版本镜像,所以它会缺少 比如 vimifconfig 等等命令,以及初始默认目录 是根目录 这些种种特点

     

    所以我们接下来将自定义一个centos,改变其默认目录,让其带有vim命令 和 ifconfig命令

    1、准备 编写DockerFile文件

     

    2、构建DockerFile文件

    docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 .

     

    3、查看镜像是否构建成功,并运行查验

     

    4、列出镜像变更的历史

    docker history +镜像ID

     
    通过这一波操作,相信你也已经熟悉了百分之80的关键字了,接下来的案例我们来了解比较容易混淆的两个关键字,CMD 和 ENTRYPOINT
     

    CMD/ENTRYPOINT 镜像案例

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

    • CMD:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
    • ENTRYPOINT:docker run 之后的参数会被当作新的参数传递给 ENTRYPOINT,之后形成新的命令组合

    我们接下来用curl命令来讲解一下,CMD和ENTRYPOINT的区别

    curl 命令的意思是下载文件输出到stdout

     

    CMD

    1、编辑Dockerfile文件

    FROM centos
    RUN yum install -y curl
    CMD ["curl","-s","https://www.ip.cn"]
    

     

    2、构建Dockerfile文件

    docker build /mydocker/Dockerfile3 -t myip .
    

     

    3、执行文件,查看效果

    注: 这里报错主要是因为 -i 它不是一个单独的命令参数

     

    ENTRYPOINT

    1、编写Dockerfile文件

    FROM centos
    RUN yum install -y curl
    ENTRYPOINT ["curl","-s","https://www.ip.cn"]
    

     

    2、构建Dockerfile文件

     

    3、执行文件,查看结果

     

    ONBUILD

    这个案例我们来讲解一下ONBUILD的作用

    1、编辑Dockerfile文件

    vim Dockerfile4 创建一个Dockerfile文件 Dockerfile4

    FROM centos
    RUN yum install -y curl
    ENTRYPOINT ["curl","-s","https://www.ip.cn"]
    ONBUILD RUN echo "father onbuild---------886"
    

      

    2、构建父Dockerfile文件

    docker build -f /mydocker/Dockerfile4 -t myip_father . 构建父Dockerfile文件

     

    3、再次创建一个新的Dockerfile文件,继承ONBUILD文件

    vim dockerfile5 创建一个Dockerfile文件 Dockerfile5

    FROM myip_father
    RUN yum install -y curl
    CMD ["curl","-s","https://www.ip.cn"]
    

     

    4、构建子Dockerfile文件

    docker build -f /mydocker/Dockerfile5 -t myip_son .

     

    自定义镜像Tomcat7

    我们借着最后的实验来讲下最后的两个关键字ADDCOPY

     

    1、创建一个Tomcat7文件夹,并创建一个文件

    mkdir -p /coke/mydockerfile/tomcat7 创建文件夹

    touch c.txt 创建文件

     

    2、将jdk和tomcat安装的压缩包拷贝进上一步目录

     

    3、创建一个Dockerfile文件,如上图

    FROM         centos
    MAINTAINER    coke<dwlovelife@126.com>
    #把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
    COPY c.txt /usr/local/cincontainer.txt
    #把java与tomcat添加到容器中
    ADD jdk-7u79-linux-x64.gz  /usr/local/
    ADD apache-tomcat-7.0.47.tar.gz /usr/local/
    #安装vim编辑器
    RUN yum -y install vim
    #设置工作访问时候的WORKDIR路径,登录落脚点
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    #配置java与tomcat环境变量
    ENV JAVA_HOME /usr/local/jdk1.7.0_79
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.47
    ENV CATALINA_BASE /usr/local/apache-tomcat-7.0.47
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    #容器运行时监听的端口
    EXPOSE  8080
    #启动时运行tomcat
    # ENTRYPOINT ["/usr/local/apache-tomcat-7.0.47/bin/startup.sh" ]
    # CMD ["/usr/local/apache-tomcat-7.0.47/bin/catalina.sh","run"]
    CMD /usr/local/apache-tomcat-7.0.47/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.47/bin/logs/catalina.out
    

     

    4、凭借Dockerfile构建一个自定义Tomcat

    docker build -t coke_tomcat7 . 构建tomcat

     

    5、运行tomcat 查看效果

    docker run -d -p 9080:8080 --name myt7 -v /coke/mydockerfile/tomcat7/test:/usr/local/apache-tomcat-7.0.47/webapps/test -v /coke/mydockerfile/tomcat7/tomcat7logs/:/usr/local/apache-tomcat-7.0.47/logs --privileged=true coke_tomcat7
    

     

    注:此处我们建立了容器卷,还可以进行发布关联,日志关联,就不进行操作说明了,有兴趣的可以自己试试。

  • 相关阅读:
    2021/3/12
    2021/3/11
    2021/3/10
    2021/3/9
    2021/3/8
    2021/3/5
    2021/3/4
    2021/3/3
    2021/3/2
    2021/3/1
  • 原文地址:https://www.cnblogs.com/dwlovelife/p/11638322.html
Copyright © 2011-2022 走看看