WSL 配 GPU 用 Docker 的折腾指南(2026 年版)

在 WSL2 里头跑带 GPU 的 Docker 容器,这是做 AI 或者搞数据科学的人逃不过的一课。但自从 Docker 26 来了,再加上 NVIDIA 那套 CDI 的玩意儿,还有 CUDA 13 和 Ubuntu 24,不少人栽了跟头。

我这篇文章就是想带你从头开始,把那些坑一个个填上,最后弄个稳当的 GPU 加速环境出来。

你大概率会遇到这些错误:

  • CDI 那边说找不到供应商:no known GPU vendor found
  • 跑不起来,提示 nvidia-container-runtime not found
  • 要是用 AMD 卡,会报 AMD CDI spec not found
  • 配置冲突的提示:directives are specified both as a flag and in config

第一章:先把环境搭好,验证一下

1.1 你得有的东西(2026 年比较推荐的配置)

部件 最低要求 建议配置
Windows 10 21H2 以上 / 11 22H2 以上 Windows 11 23H2 以上
WSL 内核 5.15.90.1 以上 6.x 内核
Ubuntu 22.04 LTS 24.04 LTS
Docker 25.0 以上 26.0 以上
NVIDIA 驱动(在 Windows 上) 550.xx 以上 最新的 Game Ready / Studio 版本
GPU 至少 RTX 20 系 RTX 30 或 40 系

1.2 先确认 WSL 能识别 GPU

在装 Docker 相关的一堆东西之前,得先看看 WSL 自己能不能认出 GPU:

bash 复制代码
# 在 WSL 的终端里头跑这个
nvidia-smi

✅ 正常的话会显示 GPU 型号,比如 NVIDIA GeForce RTX 4090,还有 CUDA 版本和显存情况。

❌ 要是跑不出来,你就按这个顺序来排查:

  1. 在 Windows 上装最新的 NVIDIA 驱动
  2. 把 WSL 彻底关掉再开:wsl --shutdown
  3. 看看是不是用的 WSL 2:wsl -l -v(VERSION 那一列得是 2)

第二章:把 NVIDIA 的工具包装进去

2.1 添加官方软件源

注意:Ubuntu 自带的源里头,nvidia-container-toolkit 的版本早就过时了,非得用官方源不可。

bash 复制代码
# 1. 先装些依赖
sudo apt-get update && sudo apt-get install -y curl gnupg2 ca-certificates

# 2. 把 NVIDIA 的 GPG 密钥加进来
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
    sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

# 3. 加软件源
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

2.2 安装工具包

bash 复制代码
# 更新一下再安装
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit nvidia-container-runtime

# ✅ 看看装没装成功
nvidia-ctk --version
which nvidia-container-runtime

第三章:CDI 这玩意儿是啥,怎么配

3.1 CDI 解释一下

CDI(Container Device Interface)是 CNCF 弄出来的容器设备接口标准,用来让容器能统一访问主机上的硬件。Docker 25 以后默认就用 CDI 来处理 GPU 设备了。

我碰过很多次,CDI 报错九成是因为规范文件没生成好或者坏了。

3.2 生成 CDI 规范文件

bash 复制代码
# 1. 先建个目录
sudo mkdir -p /etc/cdi

# 2. 用官方工具生成文件
sudo nvidia-ctk cdi generate \
    --output=/etc/cdi/nvidia.yaml \
    --device-name-strategy=index \
    --vendor=nvidia.com

# 3. ✅ 看看生成的文件对不对
cat /etc/cdi/nvidia.yaml

3.3 这个文件长啥样

一个正常的 /etc/cdi/nvidia.yaml 大概是这样的:

yaml 复制代码
cdiVersion: "0.6.0"
kind: nvidia.com/gpu           # ⚠️ 这个必须完全一样!
devices:
  - name: "0"                  # GPU 设备的索引
    containerEdits:
      deviceNodes:
        - path: /dev/nvidia0
        - path: /dev/nvidiactl
        - path: /dev/nvidia-uvm
        - path: /dev/nvidia-uvm-tools

第四章:Docker 怎么配比较好

4.1 daemon.json 里的配置

编辑或者创建这个文件: /etc/docker/daemon.json

json 复制代码
{
    "iptables": false,
    "hosts": [
        "unix:///var/run/docker.sock"
    ],
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    },
    "cdi-spec-dirs": [
        "/etc/cdi",
        "/var/run/cdi"
    ]
}

4.2 WSL 启动脚本

弄个脚本来启动 Docker: /usr/local/bin/start-docker.sh

bash 复制代码
#!/bin/bash

if pgrep -x "dockerd" > /dev/null; then
    echo "✅ Docker 已经在运行了"
    exit 0
fi

echo "🚀 准备启动 Docker..."
nohup /usr/bin/dockerd > /var/log/docker.log 2>&1 &

sleep 2

if pgrep -x "dockerd" > /dev/null; then
    echo "✅ Docker 启动成功"
else
    echo "❌ 启动失败"
    exit 1
fi

记住一条:启动脚本里头别加命令行参数(比如 --host--iptables),这些统一用 daemon.json 管,免得冲突。

4.3 重启 Docker 让配置生效

bash 复制代码
# 给脚本加点执行权限
sudo chmod +x /usr/local/bin/start-docker.sh

# 重启 Docker
pkill dockerd && sleep 2 && sudo /usr/local/bin/start-docker.sh

# ✅ 看看配置有没有起作用
docker info | grep -A5 Runtimes
docker info | grep -i cdi

第五章:版本得匹配好

5.1 CUDA 镜像选哪个

镜像标签 CUDA 版本 Ubuntu 版本 适合干啥
nvidia/cuda:13.1.2-base-ubuntu24.04 13.1.2 24.04 LTS ✅ 推荐,最新稳定版
nvidia/cuda:12.6.3-base-ubuntu22.04 12.6.3 22.04 LTS 兼容性比较好
nvidia/cuda:11.8.0-base-ubuntu22.04 11.8.0 22.04 LTS 旧框架也能用(PyTorch/TensorFlow)

5.2 驱动版本的要求

CUDA 版本 最低 NVIDIA 驱动版本(在 Windows 上)
CUDA 13.x ≥ 550.xx
CUDA 12.x ≥ 525.xx
CUDA 11.8 ≥ 450.xx

在 WSL 里头有个关键点:Windows 上的驱动版本决定了 WSL 里面能支持的最高 CUDA 版本。


第六章:CDI 和传统 Runtime 比一下

6.1 技术架构上有什么不同

特性 传统的 --runtime=nvidia CDI 的 --gpus all
技术标准 NVIDIA 自己的方案 CNCF 的开放标准
什么时候引入 Docker 19.03 Docker 25.0 以后
设备怎么发现 nvidia-container-runtime-hook 容器运行时原生支持
配置放哪 daemon.json 的 runtime /etc/cdi/*.yaml
多厂商支持 只支持 NVIDIA NVIDIA / AMD / Intel 都行
WSL2 兼容性 ✅ 已经很成熟了 ⚠️ 2026 年还在完善

6.2 参数怎么用的不同

✅ 传统方法(稳当,WSL 里头推荐):

bash 复制代码
# 方式 A:runtime 加上环境变量
docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all ...

# 方式 B:只指定 runtime
docker run --runtime=nvidia ...

✅ CDI 方法(新标准):

bash 复制代码
# 方式 A:所有 GPU
docker run --gpus all ...

# 方式 B:指定 GPU 编号
docker run --gpus 0 ...
docker run --gpus '"device=0,1"' ...

6.3 推荐怎么用的策略

🎯 在 WSL2 里头(2026 年),我推荐这样来:

bash 复制代码
# ✅ 最好先用:传统方法(最稳)
docker run --rm --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all \
    nvidia/cuda:13.1.2-base-ubuntu24.04 nvidia-smi

# ✅ 备选:CDI 方法(配置正确才行)
docker run --rm --gpus all \
    nvidia/cuda:13.1.2-base-ubuntu24.04 nvidia-smi
环境 推荐方式 原因
WSL2 开发机 --runtime=nvidia 稳定性优先
原生 Linux --gpus all CDI 支持已经完善了
Kubernetes 集群 CDI 这是生态标准
生产环境 传统方式 成熟可靠

别犯这个错:两种方法别同时用!docker run --runtime=nvidia --gpus all ... 会冲突的。


✅ 第七章:验证一下

7.1 基本 GPU 可用性测试

bash 复制代码
# 测试 1:CDI 模式
docker run --rm --gpus all nvidia/cuda:13.1.2-base-ubuntu24.04 nvidia-smi

# 测试 2:传统兼容模式
docker run --rm --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all \
    nvidia/cuda:13.1.2-base-ubuntu24.04 nvidia-smi

7.2 跑个性能基准

bash 复制代码
# nbody 粒子模拟基准测试
docker run --rm --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

✅ 正常的话会输出:

Plain 复制代码
GPU Device 0: "NVIDIA GeForce RTX 4090" with compute capability 8.9
16384 bodies, total time for 10 iterations: 12.345 ms
= 4357.801 single-precision GFLOP/s

🔧 第八章:常见问题的解决办法

8.1 配置冲突

错误提示: directives are specified both as a flag and in the configuration file

怎么解决:

  • 看看启动脚本里头有没有重复的命令行参数

  • 统一用 daemon.json 管所有配置

  • 删掉 dockerd 启动时的 --iptables--host 这些参数

8.2 CDI 供应商发现失败

错误提示: failed to discover GPU vendor from CDI: no known GPU vendor found

怎么解决:

bash 复制代码
# 重新生成 CDI 文件
sudo rm -f /etc/cdi/*.yaml
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

# 看看 kind 字段对不对
grep "kind:" /etc/cdi/nvidia.yaml

8.3 运行时找不到

错误提示: exec: "nvidia-container-runtime": executable file not found in $PATH

怎么解决:

bash 复制代码
# 看看文件在不在
ls -la /usr/bin/nvidia-container-runtime

# 如果不在,重新安装
sudo apt-get install --reinstall nvidia-container-runtime

8.4 AMD 的 CDI 报错

错误提示: AMD CDI spec not found

怎么解决:

  • 这是 Docker 有个 bug,会错误地去查找 AMD 设备

  • 确保 /etc/cdi/ 目录下只有 nvidia.yaml

  • 删掉其他无关的 CDI 文件


⚡ 第九章:高级点儿的配置

9.1 多 GPU 怎么配

bash 复制代码
# 自动检测并生成多 GPU 配置
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

# 测试指定 GPU 运行
docker run --rm --gpus 0 nvidia/cuda:13.1.2-base-ubuntu24.04 nvidia-smi
docker run --rm --gpus 1 nvidia/cuda:13.1.2-base-ubuntu24.04 nvidia-smi

9.2 Windows 驱动更新后要做的

⚠️ 每次在 Windows 上更新 NVIDIA 驱动之后,必须执行:

bash 复制代码
# Windows 的命令提示符
wsl --shutdown

# 重新打开 WSL 之后
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
pkill dockerd && sleep 2 && sudo /usr/local/bin/start-docker.sh

9.3 Docker Desktop 用户注意

如果你用 Docker Desktop for Windows:

  1. 在 Docker Desktop 的设置里头 → Resources → WSL Integration → 启用你的 WSL 发行版

  2. 不需要在 WSL 里头单独装 Docker

  3. NVIDIA Container Toolkit 由 Docker Desktop 自动管理


✅ 第十章:做完之后核对一遍

等所有配置弄完,逐项检查:

nvidia-smi 在 WSL 里头正常显示 GPU 信息

nvidia-ctk --version 命令能跑

/etc/cdi/nvidia.yaml 文件存在,格式也对

/etc/docker/daemon.json 里配置了 nvidia runtime 和 CDI 路径

Docker 启动脚本里头没有冲突的命令行参数

docker run --rm --gpus all nvidia/cuda:13.1.2-base-ubuntu24.04 nvidia-smi 测试通过

nbody 基准测试能正常跑


📝 最后说几句

WSL2 加 Docker 加 GPU 加速的配置虽然坑不少,但只要明白 CDI 机制和配置冲突的根本原因,就能弄出一个稳定可靠的开发环境。

核心要点记一下:

  1. 永远用 NVIDIA 官方源装 container-toolkit

  2. 统一用 daemon.json 管 Docker 配置,别搞命令行参数冲突

  3. CDI 规范文件是 --gpus all 能工作的关键

  4. Windows 驱动更新后得重新生成 CDI 文件

  5. WSL2 里头最好用 --runtime=nvidia 传统方式,这样最稳

希望这篇指南能帮你在 WSL 里头顺利配好 Docker GPU 加速环境。

原创技术博客 · 开源项目分享 · AI全栈创作社区 idao.fun

相关推荐
SEO_juper4 小时前
新独立站冷启动收录全攻略:配置、推送、抓取配额优化完整手册
前端·谷歌·seo·跨境电商·外贸·geo·独立站
骑上单车去旅行4 小时前
openEuler 22.03 离线源码编译 Zabbix 7.0.27 完整最终整合手册
linux·运维·服务器·zabbix
TinssonTai4 小时前
这个 VS Code 插件让我的 AI Coding 又快又稳 - 旧瓶装新酒
前端·人工智能·程序员
体验家4 小时前
体验家 XMPlus 网页端问卷 SDK 技术解析:用几行 JavaScript 实现精准场景触发与防打扰机制
开发语言·前端·javascript
金融支付架构实战指南4 小时前
Milvus 向量检索服务 + SpringBoot 实战:电商商品语义检索与相似商品推荐
spring boot·后端·milvus·向量检索
向日葵.4 小时前
linux & qnx & git 命令 1
linux·运维·服务器
Maimai108084 小时前
Web3 前端交易系统如何落地:从下单 UI 到 Operation 编码、签名与实时状态更新
前端·react.js·ui·架构·前端框架·web3
齐 飞4 小时前
JDK21虚拟线程
java·后端
kidding7234 小时前
高效备忘清单工具类小程序
前端·计算机网络·微信小程序·小程序
fox_lht4 小时前
15.4.循环和迭代器的性能比较
开发语言·后端·学习·rust