宿主机驱动和nvidia-smi正常但Docker容器看不到GPU,说明问题出在WSL2发行版未安装NVIDIA驱动及nvidia-container-toolkit、Docker Desktop未启用GPU支持、或daemon配置被错误手动修改;必须在WSL2内运行nvidia-smi验证、安装toolkit而非nvidia-docker2、通过Docker Desktop GUI启用WSL集成与GPU支持,并确保docker info显示nvidia runtime。

宿主机驱动和 nvidia-smi 能用,但 Docker Desktop 里容器看不到 GPU
这说明硬件和基础驱动没问题,问题出在 Docker Desktop 和 WSL2 之间的 GPU 透传链路上。Windows 用户最容易卡在这一步:nvidia-smi 在 PowerShell 或 WSL2 终端里能跑,但 docker run --gpus all nvidia/cuda:12.6.0-base-ubuntu22.04 nvidia-smi 报 could not select device driver "" with capabilities: [[gpu]]。
关键点在于:Docker Desktop 不是直接调用宿主机驱动,而是通过 WSL2 发行版里的 nvidia-container-toolkit 中转。WSL2 发行版必须自己装驱动、装 toolkit、配 runtime —— 宿主机装了没用,PowerShell 里能跑 nvidia-smi 也不代表 WSL2 里能跑。
- 检查 WSL2 发行版是否已安装 NVIDIA 驱动:在 Ubuntu 终端里运行
nvidia-smi,不是在 Windows CMD/PowerShell 里 - 确认 WSL2 发行版已安装
nvidia-container-toolkit(不是nvidia-docker2),且版本 ≥ 1.14.0 - Docker Desktop 设置中必须勾选
Use the WSL 2 based engine和Enable GPU support,两者缺一不可 - 重启顺序很重要:先关掉所有 WSL2 实例(
wsl --shutdown),再重启 Docker Desktop
daemon.json 里 runtime 配置正确,但 docker info 不显示 NVIDIA
docker info | grep -i nvidia 没输出,哪怕 /etc/docker/daemon.json 明明写了 "default-runtime": "nvidia" 和 "nvidia" runtime 路径,也说明配置没生效。
根本原因通常是:Docker Desktop 的 daemon.json 不在 WSL2 发行版的 /etc/docker/daemon.json,而是在 Windows 的 %APPDATA%\Docker\settings.json 或 Docker Desktop 自管的配置区。你改了 WSL2 里的文件,Docker Desktop 根本不读它。
- 不要手动编辑 WSL2 里的
/etc/docker/daemon.json;Docker Desktop 启动时会覆盖它 - 所有 runtime 配置应通过 Docker Desktop GUI 设置:Settings → Resources → WSL Integration → 勾选对应发行版 → 再进 Advanced → 确保 GPU support enabled
- 验证方式只有一种:
docker info输出里出现Runtimes: runc nvidia和Default Runtime: nvidia - 如果仍不显示,删掉 WSL2 发行版里的
/etc/docker/daemon.json,让 Docker Desktop 完全接管配置
WSL2 里装了 toolkit,但 nvidia-ctk runtime configure 报 command not found
这是 toolkit 安装不完整或 PATH 错乱的典型表现。nvidia-ctk 是 NVIDIA Container Toolkit 1.13+ 版本引入的 CLI 工具,旧包(如 nvidia-docker2)根本不带它。
错误命令示例:sudo nvidia-ctk runtime configure --runtime=docker --set-as-default 执行失败,提示 command not found,说明你可能误装了过时包,或者 apt 源没切对。
- 先确认安装源是否为官方推荐地址:
https://nvidia.github.io/libnvidia-container/stable/deb/,不是已弃用的nvidia-docker旧源 - 卸载旧包:
sudo apt remove nvidia-docker2 nvidia-container-runtime - 按官网步骤重装:
sudo apt install -y nvidia-container-toolkit(注意包名是nvidia-container-toolkit,不是nvidia-docker2) - 装完后执行
nvidia-ctk --version,输出应为nvidia-ctk: 1.x.x;若无输出,检查/usr/bin/nvidia-ctk是否存在且可执行
容器内 nvidia-smi 正常,但 PyTorch/TensorFlow 报 no CUDA-capable device
这种“半通”状态最让人迷惑:GPU 设备节点(/dev/nvidiactl 等)和 NVML 库都挂进去了,nvidia-smi 能查,但深度学习框架初始化失败,日志里常见 CUDA failure 100: no CUDA-capable device is detected。
核心矛盾在于:NVIDIA 驱动版本与容器内 CUDA Toolkit 版本不匹配。nvidia-smi 只依赖驱动,而 PyTorch 的 torch.cuda.is_available() 还要加载 libcudart.so 并做 runtime 兼容校验。
- 查宿主机驱动支持的最高 CUDA 版本:运行
nvidia-smi,右上角显示的 “CUDA Version: 12.6” 是驱动能支持的上限,不是已安装的 CUDA - 镜像里 CUDA 版本不能高于该值;比如驱动只支持到 12.4,却用了
nvidia/cuda:12.6.0-base,就会静默失败 - 临时验证法:进容器后运行
cat /usr/local/cuda/version.txt和nvidia-smi对比版本号 - 生产环境建议固定镜像 tag,例如用
nvidia/cuda:12.4.1-devel-ubuntu22.04而非:latest,避免隐式升级踩坑
nvidia-ctk 命令必须在 WSL2 里可用,否则整个链路在第一步就断了。


















