1. 为什么需要 NVIDIA Container Toolkit?

在 Docker 中运行深度学习、AI 计算或图形渲染应用时,通常需要调用 GPU 加速。但默认情况下,Docker 容器无法直接访问宿主机的 NVIDIA 显卡,这时就需要 NVIDIA Container Toolkit(原名 nvidia-docker)来打通容器与 GPU 之间的桥梁。

核心功能

  • 允许 Docker 容器直接访问宿主机上的 NVIDIA GPU。
  • 自动挂载 GPU 驱动和 CUDA 库到容器内。
  • 兼容主流容器运行时(Docker、containerd、Podman)。

2. NVIDIA Container Toolkit 组件解析

该工具包主要由以下组件构成:

组件名称 作用
nvidia-container-toolkit 核心组件,负责在容器启动时注入 GPU 相关设备与驱动。
libnvidia-container 底层库,处理容器与 GPU 的交互逻辑。
nvidia-container-runtime 替换 Docker 默认的 runc,支持 GPU 设备的动态绑定。

3. 手动安装步骤(附脚本解析)

以下是你的脚本逐行解析,已优化为完整安装流程:

步骤 1:添加 GPG 密钥

1
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg ./gpgkey

./gpgkey是我下载到本地的gpgkey文件

  • 作用:将 NVIDIA 的 GPG 密钥转换为二进制格式,确保软件包来源可信。

步骤 2:配置镜像源(国内加速)

1
2
3
curl -s -L https://mirrors.ustc.edu.cn/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sudo sed 's#deb https://nvidia.github.io#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://mirrors.ustc.edu.cn#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
  • 关键点
    • 使用中科大镜像源(mirrors.ustc.edu.cn)替代官方源,加速下载。
    • [signed-by] 指定密钥路径,避免安全警告。

步骤 3:安装工具包

1
2
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
  • 注意:安装时会自动依赖 libnvidia-containernvidia-container-runtime

步骤 4:配置 Docker 运行时

1
2
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
  • 作用
    • nvidia-ctk 命令生成 /etc/docker/daemon.json,将默认运行时替换为 nvidia-container-runtime
    • 重启 Docker 使配置生效。

4. 验证安装是否成功

运行一个测试容器,检查 GPU 是否可见:

1
docker run --rm --gpus all nvidia/cuda:12.2-base nvidia-smi

预期输出

1
2
3
4
5
6
7
8
9
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.05 Driver Version: 535.86.05 CUDA Version: 12.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A |
| 30% 45C P0 25W / 180W | 0MiB / 12288MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
  • --gpus all:允许容器使用所有 GPU。
  • 若看到 GPU 信息,则配置成功!

5. 常见问题与解决方案

Q1:安装后 Docker 无法启动

  • 原因daemon.json 配置错误。
  • 修复
    1
    2
    sudo rm /etc/docker/daemon.json
    sudo systemctl restart docker

Q2:容器内无法找到 GPU

  • 检查项
    1. 宿主机驱动是否正常(nvidia-smi 能否运行)。
    2. Docker 运行时是否为 nvidiadocker info | grep Runtime)。

Q3:如何指定使用特定 GPU?

1
docker run --gpus '"device=0,1"' nvidia/cuda:11.0-base nvidia-smi  # 仅使用 GPU 0 和 1

6. 提一嘴:Kubernetes 中的 GPU 支持

若需在 K8S 中使用 GPU,需额外配置:

  1. 安装 NVIDIA Device Plugin:
    1
    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.1/nvidia-device-plugin.yml
  2. 在 Pod 中声明资源:
    1
    2
    3
    resources:
    limits:
    nvidia.com/gpu: 1

7. 总结

  • NVIDIA Container Toolkit 是 Docker 调用 GPU 的必备工具。
  • 通过 --gpus 参数控制容器对 GPU 的访问权限。
  • 生产环境中建议结合 Kubernetes Device Plugin 管理集群 GPU 资源。

你的安装脚本已完美覆盖关键步骤,建议保存为 install-nvidia-docker.sh 方便复用!

附完整脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# 一键安装 NVIDIA Container Toolkit
set -e

echo "[1/4] 添加 GPG 密钥..."
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg ./gpgkey

echo "[2/4] 配置镜像源..."
curl -s -L https://mirrors.ustc.edu.cn/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sudo sed 's#deb https://nvidia.github.io#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://mirrors.ustc.edu.cn#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list >/dev/null

echo "[3/4] 安装工具包..."
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

echo "[4/4] 配置 Docker..."
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

echo "验证安装:"
docker run --rm --gpus all nvidia/cuda:12.2-base nvidia-smi