一说到容器,我们往往会脱口而出, Docker, 实际上Docker 仅仅是Linux 容器化的一种, 今天介绍的Apptainer 就是另外一种容器技术。
那么Apptainer 具体是一个什么东西呢? 跟Docker 有什么区别呢?
首先, 来回顾下什么是容器。
容器是一个隔离的环境,用于保存软件及其依赖项和配置。 容器可以在任何具有兼容容器技术的机器上运行。 容器实例可以从现有映像运行(部署)。 因此,用户必须首先构建(创建)镜像或获取现有镜像(例如从公共注册表中提取, 例如DockerHub)。 他们还可以彼此共享预构建的镜像,以便轻松地将软件分发到不同的系统,并且可以期望始终获得相同的结果。
Apptainer 和 Docker 是容器技术的不同实现。 Docker 是最流行的一种,但不幸的是不适合多用户环境。
Linux容器是一种使用单个 Linux 内核在控制主机上运行多个隔离的 Linux 系统(容器)的方法,
提供 cgroups 功能,允许对资源(CPU、内存、块 I/O、网络等)进行限制和优先级排序,而无需启动任何虚拟机。
Apptainer是一个容器平台。Apptainer(以前称为 )是一个免费的开源容器平台,允许您以简单、可移植、快速且安全的方式在独立映像(也称为“容器”)中创建和运行应用程序。 它执行操作系统级虚拟化,称为容器化。 Apptainer 适用于多用户环境,Apptainer 旨在为科学界和高性能计算 (HPC) 用例设计,可以运行 Singularity 以及 Docker 容器镜像。 使用 Apptainer,用户可以部署容器,并且在这些容器内部可以访问与在这些容器外部可以访问的相同资源。
Apptainer具有如下特点:
- 高度优化,可在笔记本电脑或高性能集群上运行,
- 非常快且轻量级 - 因为没有虚拟化,并且图像就像任何其他程序一样简单地执行,
- 实现运行容器的安全方式 - 可以轻松验证图像,
- 限制安全风险,因为它只能访问用户可访问的资源,
- 可以直接运行来自 Docker 存储库的映像(通过路径 docker://...)。
Apptainer 容器镜像是一个文件(例如 ubuntu_18.04.sif),包含执行该环境所需的所有程序和库,可以包含一小部分程序(带有库),或整个 Linux 操作系统(如 Alpine、CentOS 或 Ubuntu),在各种 Linux 操作系统和环境之间具有高度可移植性 - 它只需要安装 Apptainer,
容器文件系统环境在部署时默认是只读的(用户可以在运行时部分更改 ),
通常格式为.sif(奇点图像格式)、.sqfs(SquashFS)或.img(图像)ext3
也可以是一个目录而不是单个文件,包含所有需要的文件,可供容器外部的用户浏览。
为什么要使用Apptainer?
Apptainer 旨在以简单、可移植且可重复的方式在 HPC 集群上运行复杂的应用程序。 它首先由劳伦斯伯克利国家实验室开发,很快在其他 HPC 站点、学术站点等中流行起来。 Apptainer 是一个开源项目,拥有一个友好的开发人员和用户社区。 用户群不断扩大,Apptainer 现在在工业界和学术界的许多工作领域得到使用。
Apptainer 旨在允许容器像主机系统上的本机程序或脚本一样执行。 构建或运行容器不需要守护进程,并且安全模型与共享系统兼容。
因此,与 Univa Grid Engine、Torque、SLURM、SGE 等集群和调度程序的集成就像运行任何其他命令一样简单。 本地运行的程序使用的所有标准输入、输出、错误、管道、IPC 和其他通信路径都与容器内本地运行的应用程序同步。
Apptainer 倾向于对容器采用“集成而非隔离”的方法。 默认情况下,容器仅隔离挂载和用户命名空间,以便它们拥有自己的文件系统视图。 访问 GPU、高速网络和共享文件系统等硬件非常简单,不需要特殊配置。 对用户主目录、/tmp 空间和安装特定安装的默认访问使用户可以轻松地从容器化应用程序的可重复性中受益,而无需对其现有工作流程进行重大更改。 当更完整的隔离很重要时,Apptainer 可以使用额外的 Linux 命名空间以及其他安全和资源限制来实现这一点。
如果上面的介绍,还是有些干巴巴的话, 那么看一下Apptainer的常用命令,就会让你加深理解:
常用命令列表
- 从 Docker 存储库中提取容器镜像
$ apptainer pull docker://alpine:latest
- 在容器内启动交互式 shell
$ apptainer shell alpine_latest.sif
- 运行容器(这会执行其预定义的 runscript 命令)
$ apptainer run alpine_latest.sif
- 在容器内执行自定义命令
$ apptainer exec alpine_latest.sif cat /etc/os-release
-直接从 Docker 的存储库容器执行命令
$ apptainer exec docker://busybox:latest busybox | head -n1
- 直接从 Docker 镜像构建沙箱目录
$ apptainer build --sandbox alpine_sandbox docker://busybox:latest
-Shell 进入沙箱,假装是 root 用户并永久保存所有更改
$ apptainer shell --fakeroot --writable alpine_sandbox
-将沙箱转换为静态镜像
$ apptainer build alpine.sif alpine_sandbox