栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Docker相关知识点(五) [DockerFile]

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Docker相关知识点(五) [DockerFile]

5.1、什么是DockerFile?
  • 当我们前面学习Docker的时候,我们每一次完善的容器需求,都需要很多行Docker命令才能完成
  • 而DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的自动化脚本,我们可以通过DockerFile基于基础镜像,充实基础镜像,将该镜像打造成我们所需要的镜像,供我们后续的使用.

    官网介绍: Docker官方文档
5.2、编写DockerFile三步骤
  • 编写DockerFile文件
  • docker build命令构建镜像
  • docker run 依赖镜像运行容器实例
5.2.1、编写DockerFile常用保留字
  • FROM`:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from

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

  • RUN:容器构建时需要运行的命令,有以下两种格式

    • shell格式

      RUN <命令行命令》
      # <命令行命令> 等同于,在终端操作的shell命令
      
    • exec格式

      RUN ["可执行文件","参数","参数2"]
      # 例如:
      # RUN ["./test.php","dev","offline"]等价于 RUN ./test.php dev offline
      
    • RUN是在docker build时运行的

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

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

  • USER:指定该镜像以什么样的用户取执行,如果都不执行,默认为root

  • ENV:用来在构建过程中指定环境变量

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

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

    • COPY src dest
    • COPY[“src”,"dest]
    • :容器内的指定路径,该路径不用实现建好。路径不存在的话,会自动创建。
  • VOLUME:容器数据卷,用于数据保存和持久化工作

  • CMD:指定容器启动后的要干的事

    • 一个DockerFile中会有很多个CMD命令,但是只有最后一个CMD命令将会生效,CMD会被docker run 之后携带的参数替换掉
  • ENTRYPOINT:指定容器启动后要干的事

    • 和CMD的区别在于:ENTRYPOINT不会被docker run 命令后携带的参数替换,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序
5.2.2、docker build命令详解(基于官方文档)
  • docker build命令会从一个DockerFile文件和context来构建镜像.构建的上下文是指定位置的文件集PATH或URL.这个PATH是本地文件系统上的目录,URL是一个Git存储库位置.
  • 构建上下文是递归处理的,因此,PATH包括任何子目录,并且URL包括存储库以及子模块.
    docker build .
    
    • 上述示例显示了一个使用当前目录(.)作为构建上下文的构建命令.
    • 构建由Docker守护程序来运行,而不是由CLI运行.构建过程所做的第一件事就是将整个上下文文档(递归)发送给守护进程,最好从一个空目录作为上下文执行,并将DockerFIle保存在该目录中.仅添加构建DockerFile所需的文件.
    • 不要将根目录“/”用作PATH构建上下文,因为这会导致构建过程会将整个硬盘驱动器的全部内容传输给Docker守护线程
    • 要在构建上下文中使用文件,DockerFile指的是在指令中指定的文件,例如COPY指令.若要提高构建的性能,可以通过将.dockerignore文件添加到上下文目录中来排除文件和目录.dockerignore具体使用请参照官网教程: dockerignore help Doc
    • 当Dockerfile被调用时Dockerfile位于上下文的根中.我们可以使用-f 标志 docker build 命令来指向文件系统中任何位置的Dockerfile.
    docker build -f /path/to/a/Dockerfile
    
    • 如果构建成功,我们可以指定保存的新镜像的存储库和标记(Tag)
    docker build -t shykes/myapp
    
    • 倘若我们要在构建后将镜像标记到多个存储库中,我们也可以在运行命令-t后添加多个存储库和标记
    • 在Docker 守护进程执行 运行Dockerfile指令之前.它会对Dockerfile进行一次初步的验证,如果Dockerfile语法不正确,则会返回错误信息
    • Docker的守护进程会一条一条的执行Dockerfile中的指令,必要时,会将Dockerfile文件中的每一条指令的执行结果commit成一个新的镜像.最终返回一个新镜像的ID,Docker守护进程会自动清理我们发送的context上下文.
    • 每条指令都是独立运行的,并会创建一个新图像 - 因此RUN cd /tmp不会对下一条指令产生任何影响。
    • 只要有可能,Docker 就会使用构建缓存来docker build 显着加速该过程。这由CACHED控制台输出中的消息指示。
5.3、DockerFile构建过程解析
  • DockerFile内容基础知识
    • 每条保留字指令都必须为大写字母,并且后面要跟随至少一个参数
    • 指令按照从上到下,顺序执行
    • #: 井号表示注释
    • 每条指令都会创建一个新的镜像并对镜像进行提交
  • DockerFile执行流程大致如下:
    • Docker会从基础镜像中实例化一个容器,后续操作基于该容器进行操作的
    • 会逐条执行DockerFile中的命令,充实基础镜像相关功能
    • 然后执行Commit命令,提交成一个新的镜像
    • 然后,DockerFile会重新将这个新的镜像实例化成一个新的容器,后续操作基于该容器进行操作
    • 最后,执行DockerFile中的下一条指令,直到所有的指令都执行完成
虚悬镜像(dangling images)
  • 什么是虚悬镜像
    • 仓库名、标记(TAG)都为的镜像,俗称虚悬镜像(dangling images)
  • 虚悬镜像是怎么出现的呢?
    • 场景:当我们从Docker远程仓库中pull下来一个镜像(例如 jdk1.8),这时,该镜像作者又重新发布了一个新的jdk1.8镜像,该镜像中修复了一些BUG,这时,我们需要重新pull下来该镜像,旧的jdk1.8镜像名会被新的镜像名所取代,旧的镜像名和TAG标签都为,我们就称该旧镜像为虚悬镜像
  • 如果出现虚悬镜像,我们应该怎么做呢?
  • 虚悬镜像已经失去了使用的价值,我们需要对虚悬镜像进行删除操作
    • 可以使用docker image prune命令查看本地images中是否含有虚悬镜像,使用docker rmi 镜像ID来删除虚悬镜像

      我的docker中没有虚悬镜像,所以,删除的大小为0B
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号