架构概览#
NVIDIA 容器堆栈的架构设计使其能够支持生态系统中的任何容器运行时。该堆栈的组件包括
NVIDIA 容器运行时 (
nvidia-container-runtime
)NVIDIA 容器运行时钩子 (
nvidia-container-toolkit
/nvidia-container-runtime-hook
)NVIDIA 容器库和 CLI (
libnvidia-container1
,nvidia-container-cli
)
NVIDIA 容器堆栈的组件打包为 NVIDIA 容器工具包。
这些组件的使用方式取决于所使用的容器运行时。对于 docker
或 containerd
,NVIDIA 容器运行时 (nvidia-container-runtime
) 被配置为符合 OCI 标准的运行时,其组件流程如下图所示

cri-o
和 lxc
的组件流程如下图所示。应该注意的是,在这种情况下,不需要 NVIDIA 容器运行时组件。

让我们简要了解 NVIDIA 容器堆栈中的每个组件,从最低级别的组件开始,逐步向上
组件和软件包#
NVIDIA 容器工具包的主要软件包是
nvidia-container-toolkit
nvidia-container-toolkit-base
libnvidia-container-tools
libnvidia-container1
这些软件包之间的依赖关系如下所示
├─ nvidia-container-toolkit (version)
│ ├─ libnvidia-container-tools (>= version)
│ └─ nvidia-container-toolkit-base (version)
│
├─ libnvidia-container-tools (version)
│ └─ libnvidia-container1 (>= version)
└─ libnvidia-container1 (version)
其中 version
用于表示 NVIDIA 容器工具包版本。
注意
过去,nvidia-docker2
和 nvidia-container-runtime
软件包也曾作为 NVIDIA 容器堆栈的一部分进行讨论。这些**软件包**应被视为已弃用,因为它们的功能已与 nvidia-container-toolkit
软件包合并。这些软件包可能仍然可用,以便引入对 nvidia-container-toolkit
的依赖,并确保较旧的工作流程继续运行。有关这些软件包的更多信息,请参阅版本早于 v1.12.0
的文档存档。
NVIDIA 容器库和 CLI#
这些组件分别打包为 libnvidia-container-tools
和 libnvidia-container1
软件包。
这些组件提供了一个库和一个简单的 CLI 实用程序,用于自动配置利用 NVIDIA GPU 的 GNU/Linux 容器。该实现依赖于内核原语,并设计为与容器运行时无关。
libnvidia-container
提供了一个定义明确的 API 和一个包装器 CLI(称为 nvidia-container-cli
),不同的运行时可以调用它,以便将 NVIDIA GPU 支持注入到它们的容器中。
NVIDIA 容器运行时钩子#
此组件包含在 nvidia-container-toolkit
软件包中。
此组件包含一个可执行文件,该文件实现了 runC
prestart
钩子所需的接口。此脚本在容器创建之后但在启动之前由 runC
调用,并被授予访问与容器关联的 config.json
的权限(例如,此 config.json )。然后,它获取 config.json
中包含的信息,并使用它来调用带有适当标志集的 nvidia-container-cli
CLI。其中最重要的标志之一是应将哪些特定的 GPU 设备注入到容器中。
NVIDIA 容器运行时#
此组件包含在 nvidia-container-toolkit-base
软件包中。
此组件过去曾是 runC
的完整分支,其中注入了 NVIDIA 特定的代码。自 2019 年以来,它已成为主机系统上安装的本机 runC
的一个轻薄包装器。nvidia-container-runtime
接受 runC
规范作为输入,将 NVIDIA 容器运行时钩子作为 prestart
钩子注入其中,然后调用本机 runC
,并将修改后的 runC
规范与该钩子集一起传递给它。对于 v1.12.0
及更高版本的 NVIDIA 容器运行时,此运行时还对 OCI 运行时规范执行其他修改,以注入 NVIDIA 容器 CLI 未处理的特定设备和挂载。
重要的是要注意,此组件不一定特定于 docker(但它特定于 runC
)。
NVIDIA 容器工具包 CLI#
此组件包含在 nvidia-container-toolkit-base
软件包中。
此组件是一个 CLI,其中包括许多用于与 NVIDIA 容器工具包交互的实用程序。此功能包括配置诸如 docker
之类的运行时以与 NVIDIA 容器工具包一起使用,或生成 容器设备接口 (CDI) 规范。
那么我应该使用哪个软件包?#
安装 nvidia-container-toolkit
软件包足以满足所有用例。此软件包不断增强,增加了额外的功能和工具,以简化容器和 NVIDIA 设备的使用。
要将 Kubernetes 与 Docker 一起使用,您需要配置 Docker daemon.json
以包含对 NVIDIA 容器运行时的引用,并将此运行时设置为默认运行时。NVIDIA 容器工具包包含一个实用程序来更新此文件,如 docker
特定的安装说明中所强调的那样。
有关在各种 Linux 发行版上安装 NVIDIA 容器工具包的更多信息,请参阅 安装 NVIDIA 容器工具包。
软件包仓库#
上面列出的各种组件的软件包可在这些项目的 GitHub 仓库的 gh-pages
分支中找到。这对于可能希望访问实际软件包(.deb
和 .rpm
)以支持离线安装的气隙部署尤其有用。
对于不同的组件
nvidia-container-toolkit
https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/
libnvidia-container
https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/
注意
自 NVIDIA 容器工具包版本 1.6.0
发布以来,所有组件的软件包都发布到上面列出的 libnvidia-container
repository <https://nvidia.github.io/libnvidia-container/>
。对于较旧的软件包版本,请参阅文档存档。
软件版本也托管在仓库的 experimental
分支上,并在测试/验证后升级到 stable
分支。要访问 NVIDIA 容器工具包的最新 experimental
功能,您可能需要将 experimental
分支添加到 apt
或 yum
仓库列表中。安装说明包括有关如何为软件包管理器添加这些仓库列表的信息。