4. 安装 NVIDIA Container Toolkit:让容器真正用上 GPU

Docker 装好了,Isaac Sim 镜像也拉下来了。但如果你直接 docker run,大概率会报错——容器里根本找不到 GPU。为什么?因为 Docker 默认只管理 CPU 和内存,GPU 这种硬件资源需要额外「搭桥」。

这个桥,就是 NVIDIA Container Toolkit。说白了,它把宿主机的 NVIDIA 驱动和 CUDA 库「映射」进容器,让容器里的程序以为自己直接跑在物理机上。我当年第一次配的时候,卡在这一步整整半天,后来才发现是 toolkit 版本和驱动不匹配。

4.1 安装前的检查清单

动手之前,先确认三件事。少了任何一件,后面都会踩坑。

检查项 命令 预期结果
NVIDIA 驱动已安装 nvidia-smi 显示 GPU 型号、驱动版本、CUDA 版本
Docker 已安装并运行 docker info 显示 Server Version,无报错
系统架构 uname -m x86_64 或 aarch64
⚠️ 驱动版本红线
NVIDIA Container Toolkit 要求驱动版本 ≥ 450.80.02(Linux)。如果你还在用 418 或 440 的老驱动,请先升级。我有个同事在 Ubuntu 18.04 上硬扛 440 驱动,折腾了两天没跑起来,最后升到 470 一步到位。

4.2 安装 NVIDIA Container Toolkit

官方推荐用 apt 仓库安装,干净又省心。我个人习惯用这个流程,几乎没出过问题。

步骤 1:添加 NVIDIA 官方仓库

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

这里有个小细节:$distribution 会自动识别你的系统版本,比如 Ubuntu 22.04 会变成 ubuntu22.04。如果你手动指定版本,反而容易出错。

步骤 2:安装 toolkit 和运行时

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit nvidia-container-runtime

嗯,这里要注意。有些教程只装 nvidia-container-toolkit,但 Isaac Sim 需要完整的运行时支持。我建议两个都装上,省得后面补装。

步骤 3:配置 Docker 运行时

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

nvidia-ctk 这个工具会自动修改 Docker 的 daemon.json,添加 nvidia 运行时。你可以用 cat /etc/docker/daemon.json 确认一下,应该能看到类似这样的内容:

{
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}

4.3 验证 GPU 在容器内的可用性

装完别急着跑 Isaac Sim,先用一个轻量级镜像验证。我习惯用 nvidia/cuda:12.2.0-base-ubuntu22.04,因为它小,启动快。

docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

如果看到和宿主机一样的 GPU 信息,恭喜你,通了!

但有时候输出是这样的:

docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]

别慌。这通常意味着 Docker 没有正确识别 nvidia 运行时。检查一下 daemon.json 是否配置正确,或者重启 Docker 试试。

💡 我的验证三板斧
第一板:nvidia-smi 看驱动。
第二板:docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi 看容器。
第三板:docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvcc --version 看 CUDA 工具链。
三板斧都过了,GPU 容器化基本稳了。

4.4 常见安装问题排查

我整理了几个高频问题,都是我在项目里真实踩过的坑。

问题 1:nvidia-smi 报「command not found」

原因:驱动没装,或者 PATH 没包含 /usr/bin。
解决:先跑 ls /usr/bin/nvidia-smi 确认文件存在。如果不存在,重装驱动。如果存在,检查 echo $PATH 是否包含 /usr/bin。

问题 2:容器内 nvidia-smi 显示「No devices were found」

原因:容器没挂载 GPU 设备,或者 --gpus 参数写错了。
解决:确认命令里带了 --gpus all。如果还不行,试试 --gpus '"device=0"' 指定具体 GPU。

问题 3:docker run 报「nvidia-container-cli: initialization error」

原因:toolkit 版本和驱动不兼容,或者 nvidia-container-runtime 没正确注册。
解决:升级 toolkit 到最新版:sudo apt-get install --only-upgrade nvidia-container-toolkit。然后重新配置运行时。

问题 4:容器启动成功,但 Isaac Sim 报「CUDA error: out of memory」

原因:宿主机 GPU 显存被其他进程占满了。
解决:用 nvidia-smi 查看显存占用,杀掉无关进程。或者用 --gpus '"device=0"' 指定显存空闲的 GPU。

📌 一句话总结
NVIDIA Container Toolkit 的核心作用就是让 Docker 容器能调用 GPU。安装三步走:加仓库、装包、配运行时。验证用 nvidia-smi 在容器里跑一遍。遇到问题先查驱动版本和 daemon.json。

4.5 知识结构图:GPU 容器化全流程

下面这张图把整个流程串起来了。从宿主机硬件到容器内应用,每一层的关系一目了然。

NVIDIA Container Toolkit 安装与验证流程 宿主机层 NVIDIA 驱动 (≥450.80.02) + CUDA 工具链 NVIDIA Container Toolkit nvidia-container-toolkit + nvidia-container-runtime Docker 运行时配置 nvidia-ctk runtime configure → daemon.json 容器内 GPU 可用 docker run --gpus all → nvidia-smi 验证 通过 ✓ 失败 排查 💡 验证通过后,Isaac Sim 容器即可正常调用 GPU 进行渲染和物理仿真 常见失败原因:驱动版本过低、daemon.json 未生效、容器运行时未重启

4.6 进阶:配置非 root 用户运行

默认情况下,Docker 需要 root 权限。但 Isaac Sim 开发时,你肯定不想每次都 sudo。我建议把当前用户加入 docker 组:

sudo usermod -aG docker $USER
newgrp docker

然后验证:

docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

如果还报权限错误,检查一下 /var/run/docker.sock 的权限:

ls -l /var/run/docker.sock
# 应该显示 srw-rw----  root docker

我曾经在一台新服务器上忘了加组,结果每次跑容器都要输密码,烦得很。加完组之后记得注销重新登录,组权限才会生效。

4.7 验证 Isaac Sim 的 GPU 调用

最后一步,用 Isaac Sim 的轻量测试镜像验证完整链路:

docker run --rm --gpus all -it --name isaac-test \
  nvcr.io/nvidia/isaac-sim:2023.1.1 \
  bash -c "python3 -c 'import torch; print(torch.cuda.is_available())'"

输出 True 就说明一切就绪。如果输出 False,回到 4.4 节排查。

🔧 我的经验
如果 torch 报 CUDA 版本不匹配,别急着重装 toolkit。先看看容器里的 CUDA 版本:cat /usr/local/cuda/version.txt,然后和宿主机驱动支持的 CUDA 版本对比。很多时候只是容器镜像的 CUDA 版本太新,换个老一点的 tag 就解决了。