如何搭建Ubuntu 22.04上CUDA 12.5与NVIDIA驱动555的Docker GPU容器环境?

摘要:教程概述 目标 在 Ubuntu 22.04 系统中,完成「NVIDIA 555 驱动(原生支持 CUDA 12.5)+ CUDA 12.5 Toolkit + NVIDIA Container Tool
教程概述 目标 在 Ubuntu 22.04 系统中,完成「NVIDIA 555 驱动(原生支持 CUDA 12.5)+ CUDA 12.5 Toolkit + NVIDIA Container Toolkit」全环境部署,实现宿主机 / 容器双端 CUDA 12.5 开发 / 运行能力,解决版本冲突、依赖断裂、Docker 识别 GPU 等核心问题。 环境基础 系统:Ubuntu 22.04 LTS (amd64) GPU:NVIDIA GeForce RTX 2080 Ti(适配 555 驱动,其他 GPU 通用) 最终目标:宿主机nvcc -V显示 12.5,Docker 容器运行nvidia/cuda:12.5.0-devel-ubuntu22.04并正常调用 GPU + nvcc 一、前置准备:清理旧环境(避免版本冲突) 1.1 卸载旧版本 NVIDIA 驱动 / CUDA bash 运行 # 彻底卸载所有 NVIDIA 相关包 sudo apt purge -y nvidia-* libnvidia-* cuda-* # 清理残留依赖 sudo apt autoremove -y --purge # 删除 DKMS 残留 sudo rm -rf /usr/src/nvidia-* sudo dkms remove --all nvidia # 清空 CUDA 残留目录 sudo rm -rf /usr/local/cuda* 1.2 备份关键配置(可选) bash 运行 # 备份 apt 源和 Docker 配置 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak 2>/dev/null 1.3 重启系统(清空内核模块残留) bash 运行 sudo reboot 二、步骤 1:安装 NVIDIA 555 驱动(适配 CUDA 12.5) 555 是 NVIDIA 官方适配 CUDA 12.5 的稳定版,避开 590 版本的依赖冲突问题。 2.1 添加 NVIDIA 官方源 bash 运行 # 安装密钥和源 wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb # 更新源 sudo apt update 2.2 安装 555 驱动(仅驱动,不装 CUDA 元包) bash 运行 # 安装 555 驱动(跳过推荐依赖,避免拉取 590 版本) sudo apt install -y nvidia-driver-555 --no-install-recommends # 重启系统使驱动生效 sudo reboot 2.3 验证驱动安装 bash 运行 nvidia-smi 预期输出: plaintext +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 555.42.06 Driver Version: 555.42.06 CUDA Version: 12.5 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce RTX 2080 Ti Off | 00000000:01:00.0 Off | N/A | | 34% 46C P8 25W / 260W | 1MiB / 22528MiB | 0% Default | +-----------------------------------------+------------------------+----------------------+ 核心验证点:Driver Version: 555.x、CUDA Version: 12.5。 三、步骤 2:离线安装 CUDA 12.5 Toolkit(绕开 APT 依赖冲突) 通过 NVIDIA 官方离线.run包安装,避免 APT 源依赖混乱(核心解决 590 版本冲突问题)。 3.1 下载 CUDA 12.5 离线包 bash 运行 # 创建临时目录 mkdir -p ~/cuda125 && cd ~/cuda125 # 下载最新 CUDA 12.5 离线包(适配 Ubuntu 22.04) wget https://developer.download.nvidia.com/compute/cuda/12.5.1/local_installers/cuda_12.5.1_555.42.06_linux.run # 赋予执行权限 chmod +x cuda_12.5.1_555.42.06_linux.run 3.2 静默安装 CUDA 12.5 Toolkit(仅装工具包,不装驱动) bash 运行 # 关键参数:--toolkit 仅装工具包,--driver false 跳过驱动(已手动装 555) sudo ./cuda_12.5.1_555.42.06_linux.run --silent --toolkit --driver false --toolkitpath=/usr/local/cuda-12.5 3.3 配置 CUDA 环境变量(永久生效) bash 运行 # 写入当前用户环境变量 echo -e "\n# CUDA 12.5 环境变量" >> ~/.bashrc echo "export CUDA_HOME=/usr/local/cuda-12.5" >> ~/.bashrc echo "export PATH=\$CUDA_HOME/bin:\$PATH" >> ~/.bashrc echo "export LD_LIBRARY_PATH=\$CUDA_HOME/lib64:\$LD_LIBRARY_PATH" >> ~/.bashrc # 加载环境变量 source ~/.bashrc # (可选)配置系统级环境变量(所有用户生效) sudo echo -e "\n# CUDA 12.5 系统环境变量" >> /etc/profile sudo echo "export CUDA_HOME=/usr/local/cuda-12.5" >> /etc/profile sudo echo "export PATH=\$CUDA_HOME/bin:\$PATH" >> /etc/profile sudo echo "export LD_LIBRARY_PATH=\$CUDA_HOME/lib64:\$LD_LIBRARY_PATH" >> /etc/profile sudo source /etc/profile 3.4 验证 CUDA Toolkit 安装 bash 运行 nvcc -V 预期输出: plaintext nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2024 NVIDIA Corporation Built on Thu_Jun__6_02:18:23_PDT_2024 Cuda compilation tools, release 12.5, V12.5.82 Build cuda_12.5.r12.5/compiler.34385749_0 核心验证点:release 12.5。 四、步骤 3:配置 NVIDIA Container Toolkit(Docker 调用 GPU) 4.1 安装 nvidia-docker2(核心组件,解决 Docker 识别 GPU 问题) bash 运行 # 添加 NVIDIA Container Toolkit 源 curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list # 更新源并安装 nvidia-docker2 sudo apt update sudo apt install -y nvidia-docker2 4.2 配置 Docker 守护进程(加载 NVIDIA 运行时) bash 运行 # 覆盖/生成正确的 daemon.json 配置 sudo echo '{ "ipv6": false, "registry-mirrors": ["http://docker.882286.xyz"], "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } }' > /etc/docker/daemon.json # 重启 Docker 服务 sudo systemctl daemon-reload sudo systemctl restart docker 4.3 验证 Docker 运行时配置 bash 运行 sudo docker info | grep -i runtime 预期输出: plaintext Runtimes: io.containerd.runc.v2 nvidia runc Default Runtime: runc 核心验证点:nvidia出现在 Runtimes 列表中。 五、步骤 4:验证 Docker 容器运行 CUDA 12.5 5.1 关键说明:CUDA 镜像选择 镜像标签 包含组件 是否有 nvcc 用途 12.5.0-base-ubuntu22.04 仅 CUDA Runtime ❌ 无 运行已编译的 CUDA 程序 12.5.0-devel-ubuntu22.04 Runtime + Toolkit(含 nvcc) ✅ 有 开发 / 编译 CUDA 程序 5.2 运行 CUDA 12.5 开发镜像(验证 nvcc + GPU) bash 运行 # 运行 devel 镜像,验证 nvcc 和 GPU 识别 sudo docker run --rm --gpus all nvidia/cuda:12.5.0-devel-ubuntu22.04 bash -c "nvcc -V && echo '---' && nvidia-smi" 预期输出: plaintext nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2024 NVIDIA Corporation Built on Wed_Apr_17_19:19:55_PDT_2024 Cuda compilation tools, release 12.5, V12.5.40 Build cuda_12.5.r12.5/compiler.34080961_0 --- +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 555.42.06 Driver Version: 555.42.06 CUDA Version: 12.5 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce RTX 2080 Ti Off | 00000000:01:00.0 Off | N/A | | 34% 46C P8 25W / 260W | 1MiB / 22528MiB | 0% Default | +-----------------------------------------+------------------------+----------------------+ 六、常见问题与解决方案 问题 1:Docker 报错could not select device driver "" with capabilities: [[gpu]] 原因:缺少nvidia-docker2组件,Docker 无法识别 GPU 驱动。 解决:重新安装nvidia-docker2(参考步骤 4.1),重启 Docker。 问题 2:容器内报错exec: "nvcc": executable file not found in $PATH 原因:使用了base镜像(无 nvcc),仅devel镜像包含编译器。 解决:改用nvidia/cuda:12.5.0-devel-ubuntu22.04镜像。 问题 3:安装驱动时出现590 版本依赖冲突 原因:APT 源自动拉取 590 版本,与 555 冲突。 解决:清理 590 缓存(sudo rm -f /var/cache/apt/archives/*590*.deb),通过apt-preferences锁定 555 版本。 问题 4:CUDA 安装时报--no-driver未知参数 原因:CUDA 12.x 离线包参数调整,--no-driver改为--driver false。 解决:使用--silent --toolkit --driver false参数(参考步骤 3.2)。 七、总结 本教程完成了从「环境清理 → 驱动升级 → CUDA 安装 → Docker 配置 → 容器验证」的全流程,核心解决了: NVIDIA 590 版本依赖冲突问题(选择 555 稳定版); APT 源依赖混乱问题(离线安装 CUDA 12.5); Docker 无法识别 GPU 驱动问题(安装 nvidia-docker2); CUDA 镜像无 nvcc 问题(选择 devel 镜像)。 最终实现: 宿主机:555 驱动 + CUDA 12.5 Toolkit,支持 CUDA 程序编译; Docker 容器:无缝调用 GPU,运行 CUDA 12.5 开发 / 运行环境。 该环境可直接用于 CUDA 程序开发、深度学习训练、容器化 GPU 部署等场景。