镜像概述
# 镜像
平台中的镜像指 “Docker镜像”,镜像中打包了完整的操作系统,可通过镜像将其压缩的操作系统运行在容器中,相当于一个虚拟机,但本质上不是虚拟机,容器停止则操作系统停止。
在平台中,镜像用于为 AI 模型调试和训练提供环境,这个环境就是指内置了部分 AI 研发所需工具的操作系统。当您提交训练或提交开发环境初始化任务时,平台会根据任务关联的镜像,将其打包的操作系统运行在容器中供您调试和训练使用。
目前平台提供了开箱即用的官方镜像,同时也提供了基于官方镜像制作私有镜像的能力,暂不支持上传镜像。
# Docker镜像及分层结构
Docker 镜像是由多层镜像叠加而成,镜像层数可能会很多,每层镜像针对不同的目的有其独立的能力和变更,上层变更覆盖下层但不会修改下层镜像本身,因此镜像层可被多个容器共享,Docker 镜像总大小为所有镜像层的镜像大小总和。
- 最底层是一个文件引导系统,即 bootfs,Docker 用户不会与引导文件系统有直接的交互。
- 第二层是 root 文件系统 rootfs,通常是一种或多种操作系统,例如 ubuntu 等。
- 第三层及之后的每层是一个镜像叠加的另一个镜像,各层镜像可能都有其独立的能力,也可以一层只安装一个服务以提高复用性。
- 最顶层,仅当从这个镜像启动容器时,Docker 会在最顶层加载一个读写文件系统作为容器。
运行时会在最顶层加载容器层,容器层之下都可成为镜像层,对操作系统的修改都只发生在容器层,容器层记录对镜像的修改并以修改后的状态覆盖下层镜像提供服务,但实际不修改下层镜像本身。
# 官方镜像
平台为提高您的工作效率,为您提供了开箱即用的官方镜像,镜像中预置了 AI 研发常用工具、框架(TensorFlow/Pytorch)、软件包和所依赖的库,并且软件包之间的兼容性经过测试,可保证开发环境、训练环境的稳定性,您可以直接使用官方镜像开始研发或训练,详细信息请参考 官方镜像说明。
您也可基于官方镜像进一步安装其他所需工具,并制作您自己的镜像,以便后续使用。
# 临时镜像
将当前环境制作为镜像时,选择 临时保存 方式制作来的镜像即为临时镜像。
临时保存 是通过 docker commit
的方式构建镜像,当您在开发环境中进行了软件的安装和修改,然后通过 docker commit
来提交修改,这一次会提交您在系统中的所有修改,包括容器运行产生的日志文件、更新的包或进行的文件更改等,然后形成一层新的镜像。
当您运行这个临时镜像时,会先加载原有的镜像层,然后在最上层加载临时保存时形成的新镜像,再加载容器层,叠加形成一个完整的操作系统。
综上所述,使用临时保存(docker commit)方式保存镜像有如下缺点:
- 镜像臃肿:单次会提交系统中所有的更改,所得镜像会偏大,该方式形成的镜像如作为父镜像则无法被更改,即使在下一层镜像中做了删除操作,父镜像中的内容也无法被真正删除,依然会计入镜像总大小。
- 可复用性低:提交而形成的新镜像层内容较杂无针对性,可复用/共享性低。
- 不可审计:提交的更改明细无处可查,不确定新镜像包含哪些内容,存在安全隐患。
# 标准镜像
将当前环境制作为镜像时,选择 标准构建 方式制作来的镜像即为标准镜像。
标准构建 是通过 docker build
命令在基础镜像中执行 dockerfile 中的命令,dockerfile 中的每一条命令会形成一层镜像,直到所有命令执行完成,则形成了基础镜像叠加多层镜像的标准镜像。dockerfile 文件中的命令可由用户自行控制,保证其每条命令的针对性,这样每条命令形成的镜像可为其他容器所复用,作为其镜像层中的一层。
当运行这个标准镜像时,会先加载基础镜像然后按照 dockerfile 中命令的执行顺序加载各层镜像,最后再最顶层加载容器层。
使用标准构建(dockerfile)方式构建镜像,有如下有点:
- 内容精简:根据 dockerfile 在简洁的基础镜像上做镜像叠加,父镜像可通过 dockerfile 修改。
- 可复用性高:每层镜像都是根据 dockerfile 中的指令生成,可以为多个容器共享。
- 可追溯与审计:有 dockerfile 文件,可追溯审计当前镜像中包含哪些内容,可以了解这个镜像的从零到有。
# 镜像使用说明
镜像相关的操作请参考: