身处无外网的隔离机房,对着服务器上那块明明好的 NVIDIA 显卡,却只能在 Docker 容器外干瞪眼——这个场景我在过去两年里反复遇到。容器一启动,直接报 could not select device driver "" with capabilities: [[gpu]],查遍资料发现核心问题就是缺了 nvidia-container-toolkit,而离线环境安装它,偏偏不像在线环境加个 apt 源、yum 源那么简单。
这篇文章就围绕 nvidia-container-toolkit 离线安装这件事,从方案选型、离线包准备、deb/rpm 两系系统的具体安装步骤,到 Docker runtime 配置、GPU 容器验证,再到我踩过的各种坑,一次性讲清楚。适合正在内网部署 AI 推理环境、离线安装 Docker 后需要启用 GPU 的运维和算法工程师参考。
1. 离线安装的整体思路与方案选型
1.1 nvidia-container-toolkit 到底解决了什么问题
先理清一个概念:很多人在离线环境碰到的 GPU 不可用,并不是驱动没装好,而是 Docker 本身不知道怎么把宿主机上的 NVIDIA 驱动和 GPU 设备“介绍”给容器。从 Docker 19.03 开始,官方支持了 --gpus 参数,但底层真正干活的是一套叫 nvidia-container-toolkit 的组件。
这套工具的职责可以拆成三块:
- 设备发现:识别宿主机上的 GPU 型号、设备节点,比如
/dev/nvidia0、/dev/nvidiactl、/dev/nvidia-uvm这些,并映射进容器。 - 驱动挂载:把宿主机上的 NVIDIA 驱动相关库文件(libcuda.so、libnvidia-ml.so 等)注入到容器文件系统里。
- 运行时钩子:通过 Docker 的 runtime hook 机制,在容器启动前完成上述准备工作。
换句话说,宿主机驱动是“发动机”,nvidia-container-toolkit 是“变速箱”。只装驱动不装 toolkit,容器里永远看不到 GPU。
1.2 为什么离线环境安装特别容易卡壳
在线环境装这个工具,其实就两三条命令的事:
code复制curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
但离线环境的问题在于:没有外部网络,apt/yum 源全部失效;内网源又不一定有 NVIDIA 的仓库;就算有安装包,deb/rpm 依赖关系也可能把你卡住。更麻烦的是,很多内网环境不只是没有外网,连内网的软件源也只同步了一些常见基础包,和 GPU 沾边的组件基本为零。
另外还有一个容易忽略的点:国内有不少基于开源社区版二次开发的操作系统,比如各类麒麟系统、欧拉系统,它们的包管理体系和依赖库版本跟标准的 Debian/CentOS 有一定出入。网上很多教程是 Ubuntu 或 CentOS 的,照搬到这类系统上经常出现各种不兼容。
1.3 三条离线方案路线对比
针对离线安装,我实践下来主要有三条路线:
| 方案 | 操作复杂度 | 适用场景 | 主要风险 |
|---|---|---|---|
| 离线 deb/rpm 包手工安装 | 低 | 单机或少量机器,内网无统一源 | 依赖不满足时需要手动补齐 |
| 自建内网 apt/yum 仓库 | 中高 | 大批量服务器,需要标准化交付 | 前期搭建耗时,仓库维护成本 |
| 构建包含 toolkit 的容器镜像 | 中 | 应用本身已容器化,不依赖宿主机工具 | 需要提前规划镜像层次,灵活性差 |
对于绝大多数一次性部署场景,我强烈建议走第一个方案:直接下载好 deb/rpm 包,拿到内网里用 dpkg -i 或 rpm -ivh 安装。虽然有时候要手动解决依赖,但总体可控,而且排错路径清晰。等确认机器数量多、以后还可能要重复部署时,再考虑搭一个本地源。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 离线安装前要做好的三件事
2.1 确认系统架构与 Docker 版本
动手之前,先花两分钟把环境信息摸清楚。这一步看似简单,但很多人就是栽在架构不匹配上——比如下载了 x86_64 的安装包,结果机器是 ARM 架构(鲲鹏、飞腾等国产化平台很常见)。
在目标机器上依次执行以下命令:
bash复制# 查看系统发行版和版本号
cat /etc/os-release
# 查看内核架构
uname -m
# 查看 Docker 版本
docker version --format '{{.Server.Version}}'
# 查看 Docker 存储驱动等信息
docker info
架构方面注意区分:x86_64、aarch64、arm64 是不同的安装包;系统版本方面,Ubuntu 20.04 和 22.04 的 deb 包不通用,CentOS 7(el7)和 CentOS 8(el8)的 rpm 包也不通用。如果你在 Ubuntu 上装了 CentOS 的 rpm,或者反过来,包管理器会直接拒绝或者提
