一、背景
在 CentOS 7.9 服务器上使用 Docker 运行 NVIDIA GPU 容器时,除了安装 NVIDIA 显卡驱动,还需要安装 NVIDIA Container Toolkit。
在实际生产环境中,服务器经常无法直接访问互联网,因此比较常见的部署方式是:
text
联网 CentOS 7.9
│
├── 配置 CentOS Yum 源
├── 配置 NVIDIA Container Toolkit 源
├── 下载 RPM 及依赖
│
▼
打包 RPM 离线安装包
│
▼
离线 CentOS 7.9
│
├── 安装 RPM
├── 配置 Docker NVIDIA Runtime
└── 验证 GPU 容器
本文整理两套方案:
text
方案一:NVIDIA Container Toolkit 1.14.0
方案二:NVIDIA Container Toolkit 1.20.1
如果需要兼容已有老环境,可以选择 1.14.0。
如果是新部署环境,可以优先测试 1.20.1。
注意:CentOS 7 已经停止维护,新版本 NVIDIA Container Toolkit 也不再将 CentOS 7 作为当前官方重点测试平台。因此生产部署前建议先使用同版本 CentOS 7.9 测试机验证。
二、环境说明
本文测试环境:
text
操作系统:CentOS Linux 7.9.2009
架构:x86_64
容器运行时:Docker
安装方式:RPM 离线安装
查看系统:
bash
cat /etc/centos-release
uname -m
预期:
text
CentOS Linux release 7.9.2009 (Core)
x86_64
三、解决 CentOS 7 Yum 源失效
CentOS 7 已经 EOL,继续使用旧的:
text
mirrorlist.centos.org
可能出现:
text
Could not retrieve mirrorlist
Cannot find a valid baseurl for repo: base/7/x86_64
因此先切换到 CentOS 7.9.2009 Vault 镜像源。
3.1 备份原 Yum 配置
bash
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/CentOS-*.repo \
/etc/yum.repos.d/backup/ 2>/dev/null
3.2 配置阿里云 CentOS Vault
bash
cat > /etc/yum.repos.d/CentOS-Base.repo <<'EOF'
[base]
name=CentOS-7.9.2009 - Base - Aliyun
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/
gpgcheck=0
enabled=1
[updates]
name=CentOS-7.9.2009 - Updates - Aliyun
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/$basearch/
gpgcheck=0
enabled=1
[extras]
name=CentOS-7.9.2009 - Extras - Aliyun
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/$basearch/
gpgcheck=0
enabled=1
EOF
清理缓存:
bash
yum clean all
rm -rf /var/cache/yum
yum makecache
检查:
bash
yum repolist
四、安装 RPM 下载工具
安装:
bash
yum install -y curl wget yum-utils
检查:
bash
which curl
which yumdownloader
正常应该能够看到:
text
/usr/bin/curl
/usr/bin/yumdownloader
五、配置 NVIDIA Container Toolkit 仓库
下载 NVIDIA 官方 Repository:
bash
curl -s -L \
https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo \
-o /etc/yum.repos.d/nvidia-container-toolkit.repo
检查:
bash
cat /etc/yum.repos.d/nvidia-container-toolkit.repo
六、CentOS 7 GPG Repository Metadata 问题
CentOS 7 使用较老的 Yum/GPG 组件,实际配置 NVIDIA 仓库时可能遇到:
text
Gpg Keys not imported, cannot verify repomd.xml for repo libnvidia-container
如果出现该问题,可以关闭 Repository Metadata 的 GPG 检查:
bash
sed -i 's/^repo_gpgcheck=1/repo_gpgcheck=0/g' \
/etc/yum.repos.d/nvidia-container-toolkit.repo
注意:
text
repo_gpgcheck=0
表示关闭仓库元数据签名检查。
如果配置中:
text
gpgcheck=1
仍然保留,则 RPM 软件包自身的 GPG 校验仍可以继续启用。
重新建立缓存:
bash
yum clean all
rm -rf /var/cache/yum
yum makecache
七、查看 NVIDIA Container Toolkit 可用版本
执行:
bash
yum --showduplicates list \
libnvidia-container1 \
libnvidia-container-tools \
nvidia-container-toolkit \
nvidia-container-runtime
在本文环境中,可以看到多个版本,例如:
text
1.14.0
1.14.1
...
1.17.x
1.18.x
1.19.x
1.20.0
1.20.1
因此可以根据生产环境兼容性选择版本。
八、方案一:下载 NVIDIA Container Toolkit 1.14.0
对于需要兼容较老环境的 CentOS 7.9,可以选择:
text
libnvidia-container1 1.14.0-1
libnvidia-container-tools 1.14.0-1
nvidia-container-toolkit 1.14.0-1
nvidia-container-runtime 3.14.0-1
8.1 创建下载目录
bash
mkdir -p /root/nvidia-container-1.14.0
cd /root/nvidia-container-1.14.0
8.2 下载 RPM 及依赖
bash
yumdownloader --resolve \
libnvidia-container1-1.14.0-1 \
libnvidia-container-tools-1.14.0-1 \
nvidia-container-toolkit-1.14.0-1 \
nvidia-container-runtime-3.14.0-1
检查:
bash
ls -lh
查看 RPM 信息:
bash
rpm -qp --queryformat \
'%{NAME} %{VERSION}-%{RELEASE} %{ARCH}\n' *.rpm
九、方案二:下载 NVIDIA Container Toolkit 1.20.1
对于新部署环境,可以测试较新的:
text
NVIDIA Container Toolkit 1.20.1
主要软件包:
text
libnvidia-container1
libnvidia-container-tools
nvidia-container-toolkit-base
nvidia-container-toolkit
9.1 创建目录
bash
mkdir -p /root/nvidia-container-1.20.1
cd /root/nvidia-container-1.20.1
9.2 下载 RPM
执行:
bash
yumdownloader --resolve \
libnvidia-container1-1.20.1-1 \
libnvidia-container-tools-1.20.1-1 \
nvidia-container-toolkit-base-1.20.1-1 \
nvidia-container-toolkit-1.20.1-1
检查:
bash
ls -lh
查看具体版本:
bash
rpm -qp --queryformat \
'%{NAME} %{VERSION}-%{RELEASE} %{ARCH}\n' *.rpm
正常核心软件包应该类似:
text
libnvidia-container1 1.20.1-1 x86_64
libnvidia-container-tools 1.20.1-1 x86_64
nvidia-container-toolkit-base 1.20.1-1 x86_64
nvidia-container-toolkit 1.20.1-1 x86_64
新版 Toolkit 不建议再按照旧教程额外混装老版本:
text
nvidia-container-runtime-3.14.0
应尽量保证整套 NVIDIA Container Toolkit 软件包来自同一版本系列。
十、两个版本怎么选择
简单来说:
| 场景 | 建议 |
|---|---|
| 已有 CentOS 7 老环境 | 1.14.0 |
| 需要复刻已有生产环境 | 使用与原环境一致的版本 |
| 新部署 CentOS 7.9 | 优先测试 1.20.1 |
| 对稳定性要求高 | 先在测试机验证后再部署 |
| 新操作系统 | 优先使用较新的 Toolkit |
对于 CentOS 7.9,我个人更建议:
text
老生产环境
↓
保持原版本,不为了"最新"强行升级
新部署环境
↓
先测试 1.20.1
↓
Docker GPU 测试全部正常
↓
再制作离线包投入生产
十一、制作离线安装包
11.1 1.14.0
bash
cd /root
tar -czvf nvidia-container-1.14.0-centos7.tar.gz \
nvidia-container-1.14.0/
11.2 1.20.1
bash
cd /root
tar -czvf nvidia-container-1.20.1-centos7.tar.gz \
nvidia-container-1.20.1/
最后得到:
text
nvidia-container-1.14.0-centos7.tar.gz
nvidia-container-1.20.1-centos7.tar.gz
把对应文件复制到离线 CentOS 7.9 服务器即可。
十二、离线安装 1.14.0
解压:
bash
tar -xzvf nvidia-container-1.14.0-centos7.tar.gz
cd nvidia-container-1.14.0
安装:
bash
yum localinstall -y ./*.rpm
检查:
bash
rpm -qa | grep -E \
'nvidia-container|libnvidia-container'
十三、离线安装 1.20.1
解压:
bash
tar -xzvf nvidia-container-1.20.1-centos7.tar.gz
cd nvidia-container-1.20.1
安装:
bash
yum localinstall -y ./*.rpm
检查:
bash
rpm -qa | grep -E \
'nvidia-container|libnvidia-container'
十四、检查 NVIDIA 驱动
Container Toolkit 并不能代替 NVIDIA GPU 驱动。
首先执行:
bash
nvidia-smi
必须保证宿主机 NVIDIA 驱动本身工作正常。
如果:
bash
nvidia-smi
都不能正常识别 GPU,那么应该先解决宿主机 NVIDIA Driver 问题,而不是继续排查 Docker。
十五、验证 NVIDIA Container Toolkit
检查:
bash
nvidia-container-cli --version
新版还可以:
bash
nvidia-ctk --version
检查 runtime:
bash
which nvidia-container-runtime
以及:
bash
nvidia-container-runtime --version
十六、配置 Docker 使用 NVIDIA Runtime
如果安装的是支持 nvidia-ctk 的版本,可以执行:
bash
nvidia-ctk runtime configure --runtime=docker
然后:
bash
systemctl restart docker
检查:
bash
docker info | grep -i runtime
正常情况下应该能够看到:
text
nvidia
十七、手工配置 Docker Runtime
如果老版本环境无法使用 nvidia-ctk runtime configure,也可以手工配置。
创建:
bash
mkdir -p /etc/docker
编辑:
bash
vi /etc/docker/daemon.json
例如:
json
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
重启:
bash
systemctl daemon-reload
systemctl restart docker
检查:
bash
docker info | grep -i runtime
十八、测试 Docker GPU
宿主机首先确认:
bash
nvidia-smi
然后使用已有的 CUDA 镜像进行测试:
bash
docker run --rm \
--runtime=nvidia \
--gpus all \
<CUDA镜像> \
nvidia-smi
如果服务器已经有业务 CUDA 镜像,也可以直接使用已有镜像测试,避免离线环境重新拉取镜像。
正常情况下,容器中的:
bash
nvidia-smi
应该能够识别宿主机 GPU。
十九、常用排查命令
查看安装的软件包:
bash
rpm -qa | grep -E \
'nvidia|libnvidia'
查看 NVIDIA Runtime:
bash
which nvidia-container-runtime
查看 Toolkit:
bash
nvidia-ctk --version
查看 Container CLI:
bash
nvidia-container-cli --version
查看 Docker Runtime:
bash
docker info | grep -i runtime
查看 Docker:
bash
systemctl status docker
查看日志:
bash
journalctl -u docker -n 100 --no-pager
检查 GPU:
bash
nvidia-smi
二十、常见问题
1. Cannot find a valid baseurl
错误:
text
Cannot find a valid baseurl for repo: base/7/x86_64
原因通常是 CentOS 7 已 EOL,旧 mirrorlist 不再正常工作。
解决方法:
text
切换到 CentOS 7.9.2009 Vault 源
2. NVIDIA 仓库 GPG 校验失败
例如:
text
Gpg Keys not imported, cannot verify repomd.xml
可以检查:
bash
grep -E \
'gpgcheck|repo_gpgcheck|gpgkey' \
/etc/yum.repos.d/nvidia-container-toolkit.repo
CentOS 7 老环境如果 repository metadata 校验存在兼容问题,可以关闭:
text
repo_gpgcheck=0
然后:
bash
yum clean all
rm -rf /var/cache/yum
yum makecache
3. nvidia-container-runtime 找不到
检查:
bash
which nvidia-container-runtime
rpm -qa | grep nvidia-container
再检查软件包提供了哪些文件:
bash
rpm -ql nvidia-container-toolkit | \
grep runtime
4. Docker 看不到 GPU
按照以下顺序排查:
text
宿主机 nvidia-smi
↓
NVIDIA Driver
↓
libnvidia-container
↓
NVIDIA Container Toolkit
↓
nvidia-container-runtime
↓
Docker Runtime
↓
GPU Container
不要一开始就排查 Docker。
如果宿主机:
bash
nvidia-smi
失败,那么 Docker GPU 基本也无法正常工作。
二十一、总结
CentOS 7.9 已经属于生命周期结束的操作系统,因此搭建 NVIDIA GPU 容器环境时,需要特别注意 Yum 源和新版软件包兼容性。
本文整理了两种离线安装方案:
text
方案一
NVIDIA Container Toolkit 1.14.0
+
nvidia-container-runtime 3.14.0
适合:
已有老环境、兼容性优先、需要保持版本一致
以及:
text
方案二
NVIDIA Container Toolkit 1.20.1
适合:
新部署环境,希望使用较新的 NVIDIA Container Toolkit
实际生产环境建议遵循:
text
先在联网 CentOS 7.9 测试机下载
↓
完成实际安装
↓
验证 nvidia-smi
↓
验证 nvidia-container-cli
↓
验证 Docker Runtime
↓
验证 Docker GPU
↓
打包 RPM
↓
部署到离线生产服务器
对于已经稳定运行的老生产环境,没有必要单纯为了追求最新版本而升级 NVIDIA Container Toolkit。
对于新部署的 CentOS 7.9 环境,可以优先测试 1.20.1;如果出现 CentOS 7 兼容性问题,再考虑使用经过验证的较老版本。