为什么要在容器里搭建开发环境呢?主要出于两个实际考虑:一来可以为不同的项目配置独立、纯净的环境,避免不同技术栈或版本之间的冲突;二来也能有效保护宿主机系统,即使容器内的环境配置出了问题,也不会影响到主机本身的稳定。
本文将详细介绍在 Ubuntu 系统中,利用 Docker 创建并配置一个能够调用 GPU、并包含 CUDA Toolkit 和 CUDNN 的完整开发环境的步骤。其核心原理是,宿主机需安装好 NVIDIA GPU 驱动,然后通过特殊的 Docker 运行时(如 nvidia-docker)来调用宿主的 CUDA Driver,进而在容器内虚拟出 CUDA 环境以供使用。
1 搭建步骤
1.1 宿主机环境:安装 NVIDIA GPU 驱动
首先,确认你的显卡型号:
lspci | grep -i vga
然后,使用 apt 包管理器来安装推荐驱动:
sudo ubuntu-drivers devices
sudo ubuntu-drivers autoinstall
安装完成后,请重启电脑。重启后,在终端运行 nvidia-smi 命令。如果能看到驱动版本和显卡信息,说明驱动安装成功。
1.2 安装 Docker
在 Ubuntu 上,可以通过 apt 直接安装 Docker:
sudo apt update
sudo apt-get install docker.io
为了让 Docker 容器能够访问宿主机的 GPU,我们需要安装 NVIDIA Container Toolkit(过去也叫 nvidia-docker2)。安装后它会为 Docker 建立 GPU 运行时支持。
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
安装并重启 Docker 服务后,运行以下命令来验证安装是否成功。这个命令会启动一个临时容器并运行 nvidia-smi:
sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
如果成功,你将看到与宿主机运行 nvidia-smi 时类似的显卡信息输出。
1.4 拉取镜像并创建容器
至此,宿主机和 Docker 的基础环境已准备完毕。接下来,我们将在容器内部署具体的 CUDA 开发环境。
NVIDIA 官方提供了预置了不同版本 CUDA 和 CUDNN 的 Docker 镜像,其标签(tag)命名非常有规律。例如,我们以 11.4.2-cudnn8-devel-ubuntu20.04 这个标签为例进行说明:
11.4.2: 表示 CUDA Toolkit 的版本号。
cudnn8: 表示镜像中包含了 cuDNN 8 库。
devel: 非常重要。如果你想在容器内使用 nvcc 编译器以及完整的头文件、库文件进行开发,必须选择 devel 版本,而不是 runtime 版本。
ubuntu20.04: 表示镜像基于的操作系统版本。
请根据你宿主机驱动支持的 CUDA 版本,选择合适的镜像标签。这里我们拉取示例镜像:
docker pull nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04
镜像拉取成功后,即可创建我们自己的开发容器。创建时务必使用 --gpus all 参数来启用 GPU 支持。
docker run -itd -v ~/work:/work --name=Ubuntu20.04-CUDA --gpus all nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04
这个命令创建了一个名为 Ubuntu20.04-CUDA 的守护态容器,并将宿主机的 ~/work 目录挂载到容器的 /work 目录,方便文件交换。
容器创建并运行后,可以通过以下命令进入容器并进行验证:
docker exec -it Ubuntu20.04-CUDA bash
在容器内部,分别运行 nvidia-smi 和 nvcc -V。如果前者能正常显示GPU信息,后者能正确输出 CUDA 编译器版本,那么恭喜你,一个基于 Docker 的、支持 GPU 加速的 CUDA 开发环境就已经搭建完成了!你可以在这个隔离的环境里安心地进行你的AI模型开发或高性能计算项目了。
希望这篇步骤清晰的指南能帮你顺利避坑。如果在搭建过程中遇到其他问题,或想分享你的容器化开发心得,欢迎来 云栈社区 与大家一起交流探讨。