镜像概述

更新时间:

# 镜像

平台中的镜像指 Docker 镜像,镜像中打包了完整的操作系统,可通过镜像将其压缩的操作系统运行在容器中,相当于一个虚拟机,但本质上不是虚拟机,容器停止则操作系统停止。
在平台中,镜像用于为 AI 模型调试和训练提供环境,这个环境就是指内置了部分 AI 研发所需工具的操作系统。当您提交训练或提交开发环境初始化任务时,平台会根据任务选择的镜像,将其打包的操作系统运行在容器中供您调试和训练使用。

# Docker镜像及分层结构

Docker 镜像是由多层镜像叠加而成,镜像层数可能会很多,每层镜像针对不同的目的有其独立的能力和变更,上层变更覆盖下层但不会修改下层镜像本身,因此镜像层可被多个容器共享,Docker 镜像总大小为所有镜像层的镜像大小总和。

  • 最底层是一个文件引导系统,即 bootfs,Docker 用户不会与引导文件系统有直接的交互。
  • 第二层是 root 文件系统 rootfs,通常是一种或多种操作系统,例如 ubuntu 等。
  • 第三层及之后的每层是一个镜像叠加的另一个镜像,各层镜像可能都有其独立的能力,也可以一层只安装一个服务以提高复用性。
  • 最顶层,仅当从这个镜像启动容器时,Docker 会在最顶层加载一个读写文件系统作为容器。

运行时会在最顶层加载容器层,容器层之下都可成为镜像层,对操作系统的修改都只发生在容器层,容器层记录对镜像的修改并以修改后的状态覆盖下层镜像提供服务,但实际不修改下层镜像本身。

# 临时镜像

将当前环境制作为镜像时,选择 临时保存 方式制作来的镜像即为临时镜像。
临时保存 是通过 docker commit 的方式构建镜像,当您在开发环境中进行了软件的安装和修改,然后通过 docker commit 来提交修改,这一次会提交您在系统中的所有修改,包括容器运行产生的日志文件、更新的包或进行的文件更改等,然后形成一层新的镜像。
当您运行这个临时镜像时,会先加载原有的镜像层,然后在最上层加载临时保存时形成的新镜像,再加载容器层,叠加形成一个完整的操作系统。
综上所述,使用临时保存(docker commit)方式保存镜像有如下缺点:

  • 镜像臃肿:单次会提交系统中所有的更改,所得镜像会偏大,该方式形成的镜像如作为父镜像则无法被更改,即使在下一层镜像中做了删除操作,父镜像中的内容也无法被真正删除,依然会计入镜像总大小。
  • 可复用性低:提交而形成的新镜像层内容较杂无针对性,可复用/共享性低。
  • 不可审计:提交的更改明细无处可查,不确定新镜像包含哪些内容,存在安全隐患。

# 标准镜像

将当前环境制作为镜像时,选择 标准构建 方式制作来的镜像即为标准镜像。
标准构建 是通过 docker build 命令在基础镜像中执行 dockerfile 中的命令,dockerfile 中的每一条命令会形成一层镜像,直到所有命令执行完成,则形成了基础镜像叠加多层镜像的标准镜像。dockerfile 文件中的命令可由用户自行控制,保证其每条命令的针对性,这样每条命令形成的镜像可为其他容器所复用,作为其镜像层中的一层。
当运行这个标准镜像时,会先加载基础镜像然后按照 dockerfile 中命令的执行顺序加载各层镜像,最后再最顶层加载容器层。
使用标准构建(dockerfile)方式构建镜像,有如下有点:

  • 内容精简:根据 dockerfile 在简洁的基础镜像上做镜像叠加,父镜像可通过 dockerfile 修改。
  • 可复用性高:每层镜像都是根据 dockerfile 中的指令生成,可以为多个容器共享。
  • 可追溯与审计:有 dockerfile 文件,可追溯审计当前镜像中包含哪些内容,可以了解这个镜像的从零到有。

# 环境镜像

由用户自己将运行的开发环境保存为环境镜像,这个环境镜像就与这个开发环境绑定,每次开发环境启动都将从这个环境镜像重启,即使您再次保存也都是覆盖之前的环境镜像。
除环境镜像以外的镜像都可理解为普通镜像。
环境镜像 vs 普通镜像

对比项 环境镜像 普通镜像
使用场景 仅开发环境启动时可以使用。 使用场景不受限制,可以在创建开发环境时选择,也可以在提交训练任务时选择。
公开性 不可设置公开性分享给他人使用。 可为其设置公开性分享给他人使用。
与开发环境 一个开发环境只能有一个环境镜像,第二次保存的环境镜像将会覆盖第一次保存的,当开发环境启动时会自动从环境镜像启动。 可从开发环境另存为多个普通镜像,对同一个环境另存为三次则会形成三个普通镜像。

# 镜像使用说明

您需自己准备镜像,平台为您提供镜像管理的能力,您可以在本地构建 AI 任务所需的镜像,然后在平台创建一个镜像仓库,并将您的镜像推送到仓库中。一个镜像仓库下可以推送多个镜像,各个镜像之间应该有不同的功能,它们通过 Tag 来区分。在完成以上操作后,您就可以利用这些镜像构建环境进行算法研发和离线训练。在镜像启动时,我们会为镜像注入一些环境变量以此来为您提供训练时所需的相关信息,有关环境变量的说明请参阅环境变量说明

镜像相关的操作请参考: