技术深度剖析
从核心来看,containers/storage是一个Go语言库,提供了用于管理容器镜像及其关联存储层的统一API。它本身并非存储系统,而是多个存储驱动之上的抽象层。该库的架构围绕三个关键概念展开:存储(stores)、层(layers)和容器(containers)。
- 存储(Stores):`Store`是主要入口点,代表一个存储位置(通常是文件系统上的一个目录)。它管理着一个层和容器的图谱。默认位置对于rootful操作是`/var/lib/containers/storage`,对于rootless操作则是`~/.local/share/containers/storage`。
- 层(Layers):每个镜像由只读层组成。containers/storage使用图数据库(通常是JSON文件或像boltdb这样的数据库)来追踪这些层。当创建容器时,会使用写时复制(CoW)策略在镜像层之上创建一个可写层(快照)。
- 容器(Containers):容器本质上是一个由镜像层加上可写层组成的已挂载文件系统。该库处理挂载、卸载以及追踪容器的状态。
该库支持多种存储驱动,每种驱动具有不同的性能和兼容性特征:
| 驱动 | CoW机制 | 性能 | 稳定性 | 用例 |
|---|---|---|---|---|
| overlayfs(默认) | 内核overlayfs | 快速,低开销 | 非常稳定(内核 >= 4.x) | 通用,rootless容器 |
| devicemapper | 精简配置(LVM) | 中等,可能降级 | 在许多发行版中已弃用 | 遗留系统,旧版RHEL |
| vfs | 无CoW(完整拷贝) | 慢,高磁盘占用 | 稳定 | 测试,调试,非Linux环境 |
| aufs | 联合挂载 | 良好 | 已弃用,不在主线内核中 | 遗留Docker设置 |
| btrfs | 子卷快照 | 良好 | 稳定(如果使用btrfs) | 使用btrfs作为根文件系统的系统 |
数据要点: overlayfs作为默认驱动占据压倒性优势,这归功于其内核原生实现、低开销以及对rootless容器的出色支持。Devicemapper和aufs实际上已是遗留技术,它们在containers/storage中的持续支持更多是为了向后兼容,而非创新。
该库的架构刻意与容器运行时(如runc或crun)解耦。这意味着像Podman这样的工具可以使用containers/storage来拉取镜像、创建层和挂载文件系统,然后将已挂载的文件系统交给运行时执行进程。这种关注点分离是相对于Docker单体式方法的一个主要架构优势,在Docker中存储和运行时紧密耦合。
GitHub上的开源仓库(github.com/containers/storage)见证了稳定但非爆炸性的增长——目前约有628颗星,每日缓慢增加。这个适中的星标数掩盖了其重要性;它是一个基础库,许多更知名的项目都依赖于此。最近的提交集中在改进rootless存储性能、增加对idmapped mounts等新内核特性的支持,以及加固代码以抵御恶意镜像。
关键参与者与案例研究
Red Hat是containers/storage的主要维护者,关键维护者包括Dan Walsh和Nalin Dahyabhai,两人都是容器生态的长期贡献者。该库是Podman项目的核心组件,Podman已成为Red Hat的旗舰容器管理工具,定位为Docker的即插即用替代品,默认以rootless模式运行。另一个Red Hat工具Buildah使用containers/storage来构建容器镜像,无需完整的守护进程。
在Red Hat之外,该库还被以下项目使用:
- CRI-O:Kubernetes的轻量级CRI实现,依赖containers/storage进行镜像和层管理。
- Skopeo:用于处理远程镜像仓库的工具,使用该库进行本地存储操作。
- Buildah:用于从头开始或从Dockerfile构建镜像。
- Podman Machine:用于在macOS和Windows上运行Podman,在Linux虚拟机内使用containers/storage。
一个值得注意的案例是Podman在安全性和rootless操作至关重要的企业环境中的采用。例如,IBM Cloud和Red Hat OpenShift已集成Podman和CRI-O,利用containers/storage提供更安全的容器运行时。该库处理用户命名空间映射和idmapped mounts的能力对于rootless容器至关重要,而Docker直到最近才开始充分支持这一特性。
主要容器工具的存储后端对比:
| 工具 | 存储库 | 默认驱动 | Rootless支持 | 关键差异化优势 |
|---|---|---|---|---|
| Docker | containerd + Docker自有存储驱动 | overlay2 | 有限(需要配置) | 成熟,广泛生态 |
| Podman | containers/storage | overlayfs | 一流