在开始Docker环境搭建之前,确保系统已正确安装NVIDIA显卡驱动是首要任务。显卡驱动不仅影响图形显示性能,更是GPU加速计算的基础。以下是详细安装步骤:
访问NVIDIA官方驱动下载页面(https://www.nvidia.com/drivers),根据显卡型号和操作系统版本选择适配的驱动。对于生产环境,建议选择长期支持版本(LTS)而非最新版本,以确保稳定性。
注意:务必确认显卡型号与驱动版本的兼容性,不匹配的驱动可能导致系统不稳定或性能下降。
卸载旧版驱动(如存在):
bash复制sudo apt-get purge nvidia*
禁用系统自带的nouveau驱动:
bash复制echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u
重启系统进入纯命令行模式:
bash复制sudo systemctl set-default multi-user.target
sudo reboot
安装编译依赖:
bash复制sudo apt-get update
sudo apt-get install build-essential gcc make
运行下载的驱动安装包:
bash复制sudo sh NVIDIA-Linux-x86_64-<version>.run
安装完成后验证:
bash复制nvidia-smi
正常输出应显示GPU状态信息,类似:
code复制+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.05 Driver Version: 535.86.05 CUDA Version: 12.2 |
|-------------------------------+----------------------+----------------------+
| 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 ... Off | 00000000:01:00.0 Off | N/A |
| N/A 45C P8 N/A / N/A | 200MiB / 8192MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
在Ubuntu系统上安装Docker CE前,需要确保系统已更新并安装必要依赖:
bash复制sudo apt-get update
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
添加Docker的GPG密钥:
bash复制curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
设置稳定版仓库:
bash复制echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新软件包索引并安装Docker:
bash复制sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
验证安装:
bash复制sudo docker run hello-world
成功运行应输出"Hello from Docker!"等欢迎信息。
为避免每次执行docker命令都需要sudo,可将当前用户加入docker组:
bash复制sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
验证权限:
bash复制docker ps
应能正常列出容器而无需sudo。
重启Docker服务:
bash复制sudo systemctl restart docker
若遇到警告:
code复制Warning: The unit file, source configuration file or drop-ins of docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
执行:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
设置开机自启:
bash复制sudo systemctl enable docker
确保系统已安装以下依赖:
bash复制sudo apt-get update && sudo apt-get install -y --no-install-recommends \
curl \
gnupg2
添加GPG密钥:
bash复制curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
添加仓库源:
bash复制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
指定版本安装以确保兼容性:
bash复制export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.18.1-1
sudo apt-get update
sudo apt-get install -y \
nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}
编辑或创建配置文件:
bash复制sudo tee /etc/docker/daemon.json <<EOF
{
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
EOF
重启Docker使配置生效:
bash复制sudo systemctl restart docker
运行测试容器验证GPU访问:
bash复制docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
输出应与直接在主机运行nvidia-smi的结果一致。
问题1:nvidia-smi命令报错"NVIDIA-SMI has failed..."
解决方案:
bash复制lsmod | grep nvidia
问题2:Docker容器无法识别GPU
解决方案:
bash复制docker info | grep -i runtime
bash复制docker run --runtime=nvidia --rm nvidia/cuda:11.0-base nvidia-smi
问题1:非root用户无法使用docker命令
解决方案:
bash复制groups $USER
bash复制newgrp docker
问题2:Docker服务启动失败
解决方案:
bash复制journalctl -u docker.service -b
bash复制sudo docker daemon --validate
bash复制sudo systemctl stop docker
sudo rm -rf /var/lib/docker
sudo systemctl start docker
限制容器可用的GPU数量:
bash复制docker run --gpus 2 nvidia/cuda:11.0-base nvidia-smi
指定使用特定GPU:
bash复制docker run --gpus '"device=0,1"' nvidia/cuda:11.0-base nvidia-smi
启用GPU持久化模式可减少初始化延迟:
bash复制sudo nvidia-smi -pm 1
使用DCGM监控工具:
bash复制docker run -d --gpus all --name dcgm \
-v /var/run/nvidia-podman:/var/run/nvidia-podman \
nvidia/dcgm:2.2.9
通过容器实现多CUDA版本共存:
bash复制docker run --gpus all -it nvidia/cuda:11.0-base
docker run --gpus all -it nvidia/cuda:12.0-base
在实际部署中,我曾遇到一个典型问题:当多个容器共享GPU时,由于缺乏资源限制,某个容器的异常导致整个GPU被占满。解决方案是通过--gpus参数明确分配资源,并结合cgroups进行更精细的控制。