Singularity 容器概述
说实话,我第一次接触 Singularity 时,心里想的也是——又一个容器工具?跟 Docker 差不多吧?
后来在生物信息学的生产环境里踩了坑,才明白这东西根本就是另一回事。
今天咱们就聊聊:Singularity 到底是什么?它跟 Docker 差在哪?又能用在哪些地方?
什么是 Singularity?
Singularity(现在叫 Apptainer)是一个专门为高性能计算(HPC)和科学计算设计的容器平台。
它的核心目标很简单:让科学家能轻松打包、分发、运行复杂的软件环境,而且不需要 root 权限。
我个人习惯把 Singularity 理解为——一个可以随身携带的计算环境。你想啊,你在笔记本上配好的分析流程,装了一堆依赖库和工具,结果到了超算集群上发现版本不对、权限不够、路径乱七八糟。Singularity 就是来解决这个问题的。
它的镜像是一个单一文件(.sif 格式)。就一个文件,拷贝到哪都能跑。我有个项目,一台 CentOS 6 的老服务器,一台 Ubuntu 20 的集群,靠一个 .sif 文件,居然没出任何环境问题。嗯,那感觉还挺爽的。
Singularity 的工作原理
Singularity 利用 Linux 内核的 namespaces 和 cgroups 做资源隔离,但跟 Docker 不一样的是,它默认把宿主机的用户 ID 直接映射到容器里。
这意味着——你在容器里看到的是你自己的账号权限,而不是 root。
我曾经调试一个容器,发现里面无法读写某些文件,搞了半天发现是 Singularity 默认用当前用户运行,而不是像 Docker 那样默认 root。后来我就学会用 --fakeroot 选项了。
--fakeroot 可以在没有真正 root 权限的情况下模拟 root 环境,装些需要 root 才能装的包。但注意,这只是欺骗安装脚本,真正的内核隔离还在。Singularity 与 Docker 的核心区别
先列一个对比表,一目了然。
| 维度 | Docker | Singularity |
|---|---|---|
| 运行权限 | 默认需要 root | 普通用户即可运行 |
| 镜像格式 | 多层镜像(layers) | 单一 .sif 文件 |
| 用户映射 | 默认 root | 默认当前用户 |
| 集成度 | 低,隔离开 | 高,可以访问宿主机GPU、网络、文件系统 |
| 典型场景 | 微服务、CI/CD、本地开发 | HPC、科学计算、生物信息学 |
你看上面这张表,关键点就三个:
- 运行权限——Singularity 不需要 root,所以能在集群调度器(SLURM、PBS)里直接跑。
- 镜像格式——.sif 文件是单一的、可验证的、不可变的,方便分发和存档。
- 用户映射——容器里的用户就是你,文件权限问题天然解决。
说个真实的例子。我有个同事在超算上想用 Python 3.10,但系统默认是 2.7。他试了 Docker,调度器直接拒绝——因为他没有 docker 命令的权限。后来换成 Singularity,一行拉镜像,一行执行,十分钟搞定。
应用场景
Singularity 主要集中在三大场景:
- 生物信息学与计算生物学——这是我最常用的场景。比如跑 RNA-seq 流程、基因组组装,依赖关系复杂得要命。用 Singularity 打包好,队友直接拉文件就能复现分析结果。
- 高性能计算(HPC)集群——集群不允许普通用户装软件,而且可能几百个节点环境不同。Singularity 的“解压即用”特性特别适合。
- 可重复性研究——发表论文时附上 .sif 文件,审稿人只要一行命令就能跑出同样的结果。我遇到过审稿人要求提供容器,直接把 .sif 文件当附件发过去,再也没被质疑过“环境不对”。
本章知识结构图
上面这张图把两者的特点对比清了。左边 Docker 适合权限宽松的微服务场景,右边 Singularity 扎根在集群和科学计算领域。记住一点:Docker 用来跑 Web 服务,Singularity 用来跑计算工作流。
singularity pull docker://... 可以直接从 Docker Hub 拉镜像,但转换后的文件里有些环境变量跟你原始的 Dockerfile 不完全一致。建议你在 Singularity 的 .def 文件里重新构建,反而更可控。