Docker / WSL2 里 GPU 用不了:驱动在宿主机,容器里只装 runtime
宿主机的 nvidia-smi 一切正常,进了容器就报 could not select device driver 或 nvidia-smi 找不到 —— 根因是容器默认不把 GPU 传进去,必须装 nvidia-container-toolkit 且加 --gpus all。最高频的误判是在容器里装显卡驱动:驱动必须装在宿主机,容器里只需要 CUDA runtime。WSL2 则是另一条线,显存与 Windows 共享且有版本门槛。
本地大模型部署排错DockerWSL2GPU这条适用于
- 在 Docker 或 WSL2 里跑 GPU 任务(驱动在宿主机)
- 容器内报「找不到 GPU / 用不了卡」
版本指纹
Windows 11 + Docker Desktop + WSL2;命令来自 Docker/NVIDIA 官方文档口径(非本机实测)
具体做法
# ========== 线 1:Docker 容器内 GPU 不可用 ==========
# 报错样例:
# docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]
# ① 宿主机先确认驱动在(这一步不通,后面都白搭)
$ nvidia-smi
# ② 安装容器工具包(Ubuntu 例)
$ sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker
# ③ 启动容器时必须显式请求 GPU
$ docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
# ^^^^^^^^^^^ 少了这个,容器里永远看不到卡
④ 容器内用 nvidia-smi 验证;能用即直通成功
# ========== 线 2:WSL2 显存/GPU 异常 ==========
# ① 确认 WSL 已是较新版本(旧版有显存识别 bug)
$ wsl --version
# ② 在 %UserProfile%\.wslconfig 里配置(改完必须 wsl --shutdown 重启)
# [wsl2]
# memory=48GB
# processors=16
$ wsl --shutdown
# ③ WSL 内验证
$ nvidia-smi # 应能直接看到卡(WSL 走的是 Windows 驱动,不需另装)
失效边界
适用边界:两条线(Docker 直通 / WSL2 共享)症状相似但根因不同,先判断自己属于哪条。本机环境为 Windows 11 + Docker Desktop + WSL2,未在本机复现容器直通(本机以原生 Windows 跑 ComfyUI 为主),命令来自 Docker 与 NVIDIA 官方文档口径,非本机实测值。一个易踩点:WSL2 的显存是动态占用、与 Windows 共享,nvidia-smi 显示的「总显存」不等于你能独占的显存。
适用边界:两条线(Docker 直通 / WSL2 共享)症状相似但根因不同,先判断自己属于哪条。本机环境为 Windows 11 + Docker Desktop + WSL2,未在本机复现容器直通(本机以原生 Windows 跑 ComfyUI 为主),命令来自 Docker 与 NVIDIA 官方文档口径,非本机实测值。一个易踩点:WSL2 的显存是动态占用、与 Windows 共享,nvidia-smi 显示的「总显存」不等于你能独占的显存。