CentOS 7 离线部署NVIDIA Container Toolkit全攻略
1. 环境准备打好离线部署的基础在CentOS 7上离线部署NVIDIA Container Toolkit之前我们需要确保基础环境已经就绪。这就像盖房子前要先打好地基一样重要。我遇到过不少新手直接跳过了环境检查结果后面安装时各种报错浪费了大量时间排查问题。首先确认NVIDIA驱动是否安装。运行nvidia-smi命令如果能看到GPU信息表格说明驱动已经正确安装。这个表格会显示GPU型号、驱动版本、CUDA版本等关键信息。如果提示命令不存在那就需要先离线安装NVIDIA驱动。这里有个坑要注意CentOS 7默认使用nouveau开源驱动它会和NVIDIA官方驱动冲突。我们需要先禁用nouveau具体操作是# 创建黑名单配置文件 echo blacklist nouveau /etc/modprobe.d/blacklist.conf echo options nouveau modeset0 /etc/modprobe.d/blacklist.conf # 重建initramfs mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak dracut /boot/initramfs-$(uname -r).img $(uname -r) # 重启进入命令行模式 systemctl set-default multi-user.target reboot重启后在命令行模式下安装下载好的NVIDIA驱动.run文件。记得给文件添加执行权限然后运行安装程序。安装完成后再次运行nvidia-smi确认驱动正常工作。接下来是Docker环境的准备。离线安装Docker稍微麻烦些需要先在有网络的机器上下载好Docker的二进制包。推荐下载静态二进制版本解压后直接就能用。我通常这样做tar xzvf docker-20.10.9.tgz sudo cp docker/* /usr/bin/然后配置systemd服务创建/etc/systemd/system/docker.service文件内容可以参考Docker官方文档。配置完成后启动Docker服务sudo systemctl daemon-reload sudo systemctl enable docker sudo systemctl start docker2. 获取离线RPM包解决依赖关系的艺术离线环境下最头疼的就是依赖关系问题。我建议先在一台相同CentOS 7版本的有网络机器上准备好所有需要的RPM包。这里有个小技巧使用yum的downloadonly插件可以只下载不安装。sudo yum install -y yum-plugin-downloadonly sudo yum install -y --downloadonly --downloaddir/path/to/download \ nvidia-container-toolkit \ nvidia-container-runtime \ libnvidia-container1 \ libnvidia-container-tools \ nvidia-docker2这个命令会把所有需要的RPM包下载到指定目录。我整理了一份关键组件的作用说明组件名称功能描述是否必需libnvidia-container容器运行时底层库是nvidia-container-toolkit核心工具包是nvidia-container-runtime容器运行时接口是nvidia-docker2Docker集成插件推荐安装下载完成后把这些RPM包拷贝到目标服务器的某个目录比如/opt/nvidia-rpms/。这里有个经验之谈最好把整个目录结构都保留因为有些包可能会依赖特定路径下的文件。3. 安装配置一步步搞定NVIDIA容器支持现在进入实际安装阶段。首先进入存放RPM包的目录批量安装所有包cd /opt/nvidia-rpms sudo rpm -Uvh *.rpm --nodeps --force这里使用了--nodeps和--force参数这在离线环境下有时是必要的。但要注意这可能会跳过一些依赖检查如果后续出现问题可能需要手动补充缺失的依赖包。安装完成后需要配置Docker使用NVIDIA运行时。这个步骤很关键我见过不少配置不当导致的问题。运行以下命令生成默认配置sudo nvidia-ctk runtime configure --runtimedocker sudo systemctl restart docker这个命令会自动创建/etc/docker/daemon.json文件。我们可以检查下这个文件的内容是否正确{ runtimes: { nvidia: { path: nvidia-container-runtime, runtimeArgs: [] } }, default-runtime: nvidia }如果文件内容不对可以手动编辑。这里有个常见问题如果之前已经存在daemon.json文件新配置可能会被合并而不是覆盖。建议先备份原有文件。4. 验证与排错确保一切正常工作安装完成后我们需要验证NVIDIA Container Toolkit是否正常工作。首先检查工具包版本nvidia-ctk --version然后运行一个测试容器看看能否正常使用GPUdocker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi如果一切正常你会看到和在宿主机上运行nvidia-smi类似的输出。这意味着容器已经可以访问GPU了。在实际使用中可能会遇到各种问题。这里分享几个我遇到的典型问题及解决方法Docker启动失败检查日志journalctl -u docker常见原因是内核版本不匹配或缺少libcuda.so。解决方法是在有网络的机器上下载对应版本的依赖包。CUDA版本不兼容容器内的CUDA版本不能高于宿主机驱动支持的版本。可以通过nvidia-smi查看支持的最高CUDA版本。多GPU设备隔离可以通过docker run --gpus device0,1指定使用哪些GPU设备。5. 高级配置与优化建议对于生产环境我们还需要考虑一些高级配置。比如限制容器对GPU资源的使用docker run --rm --gpus device0,capabilitiesutility,compute nvidia/cuda:11.0-base nvidia-smi这个命令限制了容器只能使用GPU的计算能力不能访问其他功能。对于多租户环境特别有用。另一个重要建议是预先下载好需要的CUDA镜像。在离线环境下可以这样做# 在有网络的机器上拉取镜像 docker pull nvidia/cuda:11.0-base # 保存镜像为文件 docker save -o cuda-11.0-base.tar nvidia/cuda:11.0-base # 在目标机器上加载镜像 docker load -i cuda-11.0-base.tar对于长期运行的离线环境建议建立本地的RPM和Docker镜像仓库。这样管理起来更方便也能避免每次都要手动传输文件。6. 实际应用案例分享最后分享一个我在实际项目中的经验。我们需要在一个完全隔离的政府内网环境中部署AI推理服务。环境限制非常严格不仅没有外网连USB接口都被禁用。这种情况下我们是这样做的先在测试环境完全模拟生产环境的硬件配置包括GPU型号、CentOS版本等。使用yumdownloader工具下载所有依赖包包括间接依赖。我们创建了一个完整的依赖树repoquery --requires --recursive --resolve nvidia-container-toolkit | xargs yumdownloader把所有包和镜像通过安全审核后刻录到光盘再导入生产环境。在生产环境安装时遇到了glibc版本冲突的问题。最后发现是因为测试环境和生产环境的内核版本有细微差别。解决方法是在生产环境单独编译了兼容版本的glibc。这个案例告诉我们在离线环境下部署环境一致性检查至关重要。即使是小版本号的差异也可能导致意想不到的问题。