zoukankan      html  css  js  c++  java
  • Docker学习(五) Dockerfile基础命令

    Docker学习(五) Dockerfile基础命令

    此处输入图片的描述


    学习Dockerfile,需要对它的基础命令进行了解

    FROM - 基于基准镜像

    尽量使用官方提供的基准镜像

    • [x] FROM tomcat:8.5.50-jdk8-openjdk #制作基准镜像(基于tomcat:8.5.50-jdk8-openjdk)
    • [x] FROM centos #制作基准镜像基于centos:latest
    • [x] FROM scratch #不依赖任何基准镜像

    LEBEL & MAINTAINER - 说明信息

    • [x] MAINTAINER albk.tech #当前镜像由哪个个人/机构维护
    • [x] LABEL version="1.0" # 说明其它描述信息,这些信息不产生功能影响,只是方便阅读
    • [x] LABEL description - "BK个人博客"

    WORKDIR - 设置工作目录

    WORKDIR 支持相对路径和绝对路径,建议使用绝对路径,这样Dockerfile看起来更加清晰,更容易进行维护

    • [x] WORKDIR /usr/local/albk #设置工作目录和linux的cd命令类似,但是如果目标目录不存在,具有自动创建目录的功能

    ADD & COPY - 设置工作目录

    • [x] ADD hello / # 将hello文件夹复制到容器的根路径下
    • [x] ADD test.tar.gz / # 解压缩test.tar.gz并复制到容器的根路径下
    • [x] ADD除了复制,还具备添加远程文件的功能,类似于wget 和curl功能,在实际使用中比较少

    ENV - 设置环境常量

    尽量使用环境常量, 设置常量后,后面的代码可以使用该常量,修改时只需要修改常量定义即可,可提高程序的维护性

    • [x] ENV JAVA_HOME /usr/local/openjdk8 设置JAVA_HOME常量
    • [x] RUN ${JAVA_HOME}/bin/java -jar albk.jar #使用常量执行指令

    RUN & CMD & ENTRYPOINT - 执行指令

    这3条指令都可以执行命令,他们的区别如下

    • [x] RUN #在build构建时执行命令
    • [x] ENTRYPOINT #容器启动时执行命令
    • [x] CMD #容器启动后执行默认的命令或参数

    本质上是执行时机不同
    RUN上在构建镜像时(docker build),对镜像内部文件或资源进行调整,创建后镜像是只读的不允许修改
    CMD|ENTRYPOINT在容器创建(docker run )时执行,对容器内资源进行修改

    RUN-构建时运行

    • [x] RUN yum install -y vim #Shell命令格式

    • 使用该方式,会创建一个子进程去执行命令

    • 执行完毕之后,子进程销毁,并返回主进程

    • [x] RUN ["yum","install","-y","vim"] # Exec命令格式

    • 使用该方式,会用Exec进程替换当前进程,并且保持PID不变

    • 执行完毕,直接退也,并不会返回之前的进程环境

    这两种命令格式,推荐使用后者, 本质区别就是是否创建子进程

    ENTRYPOINT 启动命令 - 入口点

    • [x] ENTRYPOINT 用于在容器启动时执行命令
    • 如果在程序中存在多个ENTRYPOINT同,只有最后一个会被执行
    • ENTRYPOINT ["ps"] 推荐使用Exec格式

    CMD默认命令

    • [x] 用于设置默认执行的命令
    • 如果Dockerfile中出现多个CMD,只有最后一个被执行
    • CMD被称为默认命令是指,如果在容器启动时,没有附加指令,使用的默认指令
    • 如果容器启动时附加指令则CMD会被忽略
    • CMD ["ps" , "-ef"] 推荐使用Exec格式

    CMD与ENTRYPOINT区别对比

    CMD如果启动附加了指令,则不会执行,而ENTRYPOINT一定会被执行

    创建Dockerfile

    mkdir -p /usr/local/docker/commandtest
    cd /usr/local/docker/commandtest
    vim Dockerfile

    FROM tomcat
    RUN ["echo" ,"image building ...."]
    ENTRYPOINT ["ps"]
    CMD ["-ef"]
    

    保存退出

    编译Dockerfile

    `docker build -t albk.tech/commandtest .

    可以看到RUN命令内容在docker build阶段,已经执行`

    此处输入图片的描述

    docker run albk.tech/commandtest

    此处输入图片的描述

    • 可以看到ENTRYPOINT和CMD命令进行合并了,然后执行了组合命令ps -ef
    • 这样可能看不出他们的区别,我们接下来看一下
      docker run albk.tech/commandtest -aux

    此处输入图片的描述

    在运行时传入 -aux之后,最终运行的命令是ps -aux,所以说CMD命令不一定执行,当在运行时候,有指定命令,会运行指定的代码,而不是默认代码,这样的组合有很大的好处,可以在不改变Dockerfile的前提下,提供更灵活的配置

    写在最后

    相关文章会首发公众号,可以关注公号albk,关注后可以获取大量学习视频

    期望热爱技术的你一起来交流,获取最新资料和学习资源,可以关注公众号albk, 个人博客 !

  • 相关阅读:
    第一节:SpringMVC概述
    SpringMVC【目录】
    Windows 系统快速查看文件MD5
    (error) ERR wrong number of arguments for 'hmset' command
    hive使用遇到的问题 cannot recognize input
    Overleaf支持的部分中文字体预览
    Understanding and Improving Fast Adversarial Training
    Django2实战示例 第十三章 上线
    Django2实战示例 第十二章 创建API
    Django2实战示例 第十一章 渲染和缓存课程内容
  • 原文地址:https://www.cnblogs.com/albk/p/12219908.html
Copyright © 2011-2022 走看看