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 容器化全流程
下面这张图把整个流程串起来了。从宿主机硬件到容器内应用,每一层的关系一目了然。
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 就解决了。