zoukankan      html  css  js  c++  java
  • 【Application】Docker DockerFile解析(五)

    DockerFile介绍

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

      在docker hub 上搜索并查看centos的DockerFile如下:

        

      DockerFile基础知识

      1、每条保留字指令都必须为大写字幕且后面要跟随至少一个参数  

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

      3、#表示注释

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

      DockerFile构建过程

      1、docker从基础镜像运行一个容器

      2、执行一条指令并对容器作出修改

      3、执行类似docker commit的操作提交一个新的镜像层

      4、docker再基于刚提交的镜像运行一个新容器

      5、执行dockerfile中的下一条指令直到所有指令都执行完成

      案例:

        可以参考【Application】Docker 容器数据卷(四)中,添加容器数据卷的方式二:使用DockerFile添加,此过程对比DockerFIle的构建过程

    DockerFile保留字

      1、FROM

        基础镜像,当前新镜像是基于那个镜像的

      2、MAINTAINER

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

      3、RUN

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

      4、EXPOSE

        当前容器对外暴露一个端口

      5、WORKDIR

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

      6、ENV

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

      7、ADD

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

      8、COPY

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

        用法一:COPY src dest

        用法二:COPY ["src", "dest"]

      9、VOLUME

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

      10、CMD

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

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

      11、ENTRYPOINT

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

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

      12、ONBUILD

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

      A案例-Base镜像(scratch)

        Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

    1 FROM scratch

      B案例-自定义镜像mycentos

        1、编写DockerFile文件

     1 # 基础镜像 centos镜像
     2 FROM centos
     3 
     4 # 镜像维护者的姓名和邮箱地址
     5 MAINTAINER H__D<H__D@163.com>
     6 
     7 # 环境变量
     8 ENV MYPATH /usr/local
     9 
    10 # 工作目录
    11 WORKDIR $MYPATH
    12 
    13 # 构建时运行安装vim命令
    14 RUN yum -y install vim
    15 
    16 # 构建时运行安装net-tools
    17 RUN yum -y install net-tools
    18 
    19 # 当前容器对外暴露一个端口
    20 EXPOSE 80
    21 
    22 # 启动时运行命令
    23 CMD echo $MYPATH
    24 
    25 CMD echo "build success .............."
    26 
    27 CMD /bin/bash 

        2、构建

          命令格式:docker build -t 新镜像名字:TAG .

          命令:docker build -f dockerfile2 -t test/mycentos:1.2 .

          

          

        3、运行

          命令格式:docker run -it 新镜像名字:TAG

          命令:docker run -it test/mycentos:1.2

          

        4、列出镜像的变更历史

          命令格式:docker history 镜像名:TAG

          命令:docker history test/mycentos:1.2

          

      C案例-CMD/ENTRYPOINT镜像案例

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

        1、CMD:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

          1)新建一个dockerfile4,内容如下:

    1 # 基础镜像 centos镜像
    2 FROM centos
    3 
    4 # 启动时运行命令 
    5 CMD ["/bin/echo", "Hello"]
    View Code

          2)通过dockerfile4,构建test/mycmd镜像

            命令:docker build -f dockerfile4 -t test/mycmd .

          3)测试

            命令:docker run -it test/mycmd

            命令:docker run -it test/mycmd /bin/echo "ABC"

            

        2、ENTRYPOINT:可以追加参数

          1)新建一个dockerfile3,内容如下:

     1 # 基础镜像 centos镜像
     2 FROM centos
     3 
     4 # 启动时运行命令 
     5 ENTRYPOINT ["/bin/echo", "Hello"]  
     6 
     7 # docker run -it [image] 运行后输出 
     8 # hello world
     9 # docker run -it [image] "命令行" 运行后输出
    10 # hello 命令行
    View Code

          2)通过dockerfile3,构建test/myentrypoint镜像

            命令:docker build -f dockerfile3 -t test/myentrypoint .

          3)测试

            命令:docker run -it test/myentrypoint

            命令:docker run -it test/myentrypoint "ABC"

            

      D案例-ONBUILD

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

        1、新建一个dockerfile5文件,内容如下:

    1 # 基础镜像 centos镜像
    2 FROM centos
    3 
    4 # 被子镜像触发
    5 ONBUILD RUN echo "now, build action is ok .............."
    6 
    7 # 启动时运行命令
    8 CMD ["/bin/bash"]

        2、通过dockerfile5构建test/mycentos:1.5镜像

          命令:docker build -f dockerfile5 -t test/mycentos:1.5 .

        3、新建一个dockerfile6文件,基础镜像是test/mycentos:1.5,内容如下:

    1 # 基础镜像 centos镜像
    2 FROM test/mycentos:1.5
    3 
    4 # 启动时运行命令
    5 CMD ["/bin/bash"] 

        4、通过dockerfile6构建test/mycentos:1.6镜像

          命令:docker build -f dockerfile6 -t test/mycentos:1.6 .

        

        通过观察,可以看到ONBUILD命令的作用

      E案例-自定义镜像Tomcat9

        1、新建一个dockerfile9文件,内容如下:

     1 # 基础镜像 centos镜像
     2 FROM test/mycentos:1.5
     3 
     4 # 被子镜像触发
     5 ONBUILD RUN echo "now, build action is ok .............."
     6 
     7 # 启动时运行命令
     8 CMD ["/bin/bash"]
     9 
    10 
    11 # 基础镜像 centos镜像
    12 FROM centos
    13 
    14 # 启动时运行命令 
    15 ENTRYPOINT ["/bin/echo", "Hello"]  
    16 CMD ["world"]
    17 
    18 #  docker run -it [image] 运行后输出 
    19 # hello world
    20 # docker run -it [image] "命令行" 运行后输出
    21 # hello 命令行
    22 
    23 
    24 # 基础镜像 centos镜像
    25 FROM centos
    26 
    27 # 镜像维护者的姓名和邮箱地址
    28 MAINTAINER H__D<H__D@163.com>
    29 
    30 # 把宿主机当前上下文中的c.txt拷贝到容器/usr/local/路径下
    31 COPY c.txt /usr/local/container.txt
    32 
    33 # 把java与tomcat添加到容器中
    34 ADD jdk-8u181-linux-x64.tar.gz /usr/local/
    35 ADD apache-tomcat-9.0.12.tar.gz /usr/local/
    36 
    37 # 配置java与tomcat环境变量
    38 ENV JAVA_HOME /usr/local/jdk1.8.0_181
    39 ENV JRE_HOME $JAVA_HOME/jre 
    40 ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib 
    41 ENV PATH $JAVA_HOME/bin:$PATH
    42 
    43 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.12
    44 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.12
    45 ENV PATH $CATALINA_HOME/bin:$PATH
    46 
    47 # 环境变量
    48 ENV MYPATH /usr/local
    49 
    50 # 工作目录
    51 WORKDIR $MYPATH
    52 
    53 # 构建时运行安装vim命令
    54 RUN yum -y install vim
    55 
    56 # 构建时运行安装net-tools
    57 RUN yum -y install net-tools
    58 
    59 # 当前容器对外暴露一个端口
    60 EXPOSE 8080
    61 
    62 # 启动时运行命令
    63 # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.12/bin/startup.sh"]
    64 # CMD ["/usr/local/apache-tomcat-9.0.12/bin/catalina.sh", "run"]
    65 CMD /usr/local/apache-tomcat-9.0.12/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.12/logs/catalina.out
    View Code

        2、通过dockerfile9构建test/mytomcat:2.0镜像

          命令:docker build -f dockerfile9 -t test/mytomcat:2.0 .

        3、测试,启动镜像:

          命令:docker run -it -p 8080:8080 test/mytomcat:2.0

      

  • 相关阅读:
    让CEF支持FLASH(非安装插件的形式)
    解决SQLServer 2008 日志无法收缩,收缩后大小不改变
    HTML Socket实现 .NET
    JS基础之BOM对象
    JavaScript对象
    JS函数
    JavaScript概述
    CSS块级元素和行内元素
    返回顶部示例
    CSS属性操作二
  • 原文地址:https://www.cnblogs.com/h--d/p/12571827.html
Copyright © 2011-2022 走看看