ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS 7.6离线部署Docker与NVIDIA容器运行时实战指南

CentOS 7.6离线部署Docker与NVIDIA容器运行时实战指南 简介对于需要在离线或内网环境部署GPU容器服务的运维与开发工程师这是一套可直接落地的CentOS 7.6 Docker与NVIDIA Docker离线安装资源包。资源集成docker-ce-19.03.12与nvidia-docker2.4的完整组件压缩包共30个文件、约91.98MB以rpm安装包为主体20个同时包含gz/bz2运行时依赖、gpg校验文件、daemon.json配置模板和txt安装说明。目录按docker-ce与nvidia-docker2分别组织覆盖Docker核心客户端、容器运行时以及NVIDIA容器工具包和底层库无需联网即可批量安装。配置样例和说明文档可直接套用适合内网服务器集群批量交付或作为离线应急包。目前已有3312人学习下载可显著缩短Docker与GPU容器运行环境的搭建时间。 这两年帮内网环境配置GPU服务器撞到最多的需求就是“CentOS 7.6离线装Docker和NVIDIA容器运行时”。外网环境一条curl的事到了隔离网络里就变成了一连串问题没有yum源、依赖缺包、装完docker又发现GPU用不了。这套组合我反反复复跑了好几遍今天把完整流程和踩过的坑一次性整理出来给同样卡在离线部署的朋友做个参考。这篇主要覆盖四件事为什么推荐Docker CE 19.03 nvidia-docker2这套经典组合、离线yum源怎么搭、安装步骤怎么走、以及我实际碰到过哪些坑。适合正在搭GPU推理环境、训练环境或者需要在内网批量交付Docker运行时的运维和算法工程师。1. 方案选型背后的思考为什么是19.03 nvidia-docker21.1 版本锁定是最省心的选择很多人一上来就问为什么不用最新的Docker我的观点是离线环境里版本越新坑越多。CentOS 7.6自带的内核是3.10.xDocker新版对内核特性、iptables版本、nftables都有要求很多老内核直接就不满足。Docker CE 19.03这个版本本身就是为了兼容CentOS 7系列做得很稳的一个选择cgroup driver、iptables兼容性都是反复验证过的而且支持--gpus参数配合nvidia-docker2的runtime注入GPU容器跑起来非常顺。另一个现实原因很多公司的GPU服务器操作系统固定是CentOS 7.6而且不允许随便升级内核。在这个前提下19.03几乎是唯一能让Docker官方源、nvidia-docker2源、老内核三者同时兼容的版本组合。如果你用Docker 20.10以上虽然也支持GPU但部分老版本nvidia-container-runtime会和新docker的containerd存在兼容性问题反而多出许多不必要的联调时间。1.2 离线部署的整体思路不是“下载个安装包”而是“搭一套本地源”离线安装最大的误区是以为docker-ce就一个rpm包拷过去装就行了。实际docker-ce依赖很长一串container-selinux、containerd.io、docker-ce-cli、iptables相关组件等等nvidia-docker2那边还要依赖nvidia-container-toolkit和libnvidia-container。手动一个个找依赖能把人逼疯稍有不慎就版本对不上。因此我的方案是在有网络的一台同系统机器上把整套依赖全部拉下来生成一个本地yum仓库然后整体打包拷贝到离线机器上。这样离线机器当次安装相当于用了一个“内网yum源”所有依赖关系由yum自动解决装起来干净利落也和在线安装体验几乎一致。这套方案的好处很明显可重复使用。同一个包目录可以copy到任何一台同配置离线机未来还要加机器就不需要重新折腾。我建议把整个离线源目录保留好甚至打个tar包放到U盘里走到哪儿都能用。2. 第一步在有网环境构建完整离线依赖源2.1 准备目录结构和基础工具在任何一台可以联网、并且系统是CentOS 7.6的机器上操作即可。虚拟机也好临时云主机也行只要架构一致都是x86_64就行。先创建目录结构mkdir -p /opt/docker-offline/{docker-ce,nvidia-docker}然后安装两个必要工具yum-utils提供yumdownloader和reposynccreaterepo用来生成yum仓库元数据。也可以顺手装repotrack在yum-utils中后面要用它拉全量依赖。yum install -y yum-utils createrepo2.2 添加docker-ce官方源Docker官方源是必须的不能用系统自带的base源因为docker-ce的包只在自己的源里。yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo添加完后注意不要急着下载全部最新版。因为我们要锁定19.03所以要确认源里有哪些具体版本yum list docker-ce --showduplicates | sort -r看到19.03.15这类的版本号就可以记下来。同样查看docker-ce-cli和containerd.io的可用版本保证三者兼容。这里我习惯直接锁定所有组件版本避免yum在解析依赖时自动拉到更高版本破坏一致性。2.3 拉取docker-ce全量依赖包这里我不太建议用yumdownloader因为它只下载你指定的包不会自动下载所有依赖如果依赖缺了你还得一个一个补齐效率太低。更好用的是repotrackyum-utils里自带它能递归地把所有被依赖的rpm全部拉下来。cd /opt/docker-offline/docker-ce repotrack docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io执行完以后目录里会出现几十个rpm包里面不仅有docker-ce本体还包含container-selinux、docker-ce-rootless-extras、iptables、libnfnetlink等一系列运行时依赖。此时可以数一下数量正常应该有20个以上的包。注意repotrack拉取时如果源里同时存在多个版本建议先用yum list --showduplicates确定准确版本号再执行否则可能拉回一个你并不想要的版本。2.4 添加nvidia-docker2源并抓取GPU运行时nvidia-docker2目前维护节奏已经没有早期那么快但它的安装机制仍然适合CentOS 7.6配合19.03这个组合。关键是它依赖的nvidia-container-toolkit和libnvidia-container必须拉到本地。先添加NVIDIA官方repocurl -s -L https://nvidia.github.io/nvidia-docker/rhel7.6/nvidia-docker.repo -o /etc/yum.repos.d/nvidia-docker.repo如果网络环境访问不了这个地址也可以手动创建repo文件指向https://nvidia.github.io/nvidia-docker/rhel7.6/。添加完之后查看可用版本yum list nvidia-docker2 --showduplicates yum list nvidia-container-toolkit --showduplicates确认版本后同样用repotrack拉全依赖包cd /opt/docker-offline/nvidia-docker repotrack nvidia-docker2 nvidia-container-toolkit libnvidia-container1这个目录里会包含nvidia-container-runtime-hook、nvidia-container-runtime、libnvidia-container-tools等关键组件。看到这些包就说明拉齐了。2.5 生成repo元数据并打包在两个目录下分别执行createrepo生成yum仓库索引createrepo /opt/docker-offline/docker-ce createrepo /opt/docker-offline/nvidia-docker然后整体打包准备搬运到离线机器cd /opt tar czf docker-offline-centos7.6.tar.gz docker-offline这个tar包通常在500MB到1GB之间取决于拉取的包数量和版本。拷贝方式不限U盘、scp、内网文件服务器都行。我习惯在包旁边放一个README.txt注明适用系统版本、docker版本、nvidia-docker2版本、拉包日期方便后续追溯。3. 第二步离线机上配置本地yum源并完成安装3.1 关闭系统自带源配置本地repo拿到tar包后解压到离线机器上目录结构保持不变。tar zxf docker-offline-centos7.6.tar.gz -C /opt进入离线机的/etc/yum.repos.d/目录一定要把系统自带的CentOS-Base.repo、CentOS-Media.repo等文件全部移走或者禁用否则yum会先去访问外网在离线环境下会出现长时间卡住、最后报错的情况。cd /etc/yum.repos.d/ mkdir backup mv *.repo backup/然后新建一个本地repo文件比如local-docker.repo写入以下内容[docker-ce-local] nameDocker CE Local Repo baseurlfile:///opt/docker-offline/docker-ce gpgcheck0 enabled1 [nvidia-docker-local] nameNVIDIA Docker Local Repo baseurlfile:///opt/docker-offline/nvidia-docker gpgcheck0 enabled1建议gpgcheck直接设为0离线环境下验证GPG签名没有意义反而可能因为缺少公钥导致安装失败。执行一下yum清理和缓存更新yum clean all yum makecache此时yum repolist应该能看到两个本地仓库。3.2 安装Docker CE并启动直接指定版本安装yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io这一步yum会自动解析依赖从本地仓库补齐所有需要的包。看到Complete!之后先别急着启动我习惯先把daemon.json配置好再进行启动因为后边nvidia-docker2也要往这个文件里加内容一次写到位可以减少一次重启。mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, storage-driver: overlay2, storage-opts: [ overlay2.override_kernel_checktrue ] } EOF这里特别解释一下storage-driver的选择。CentOS 7.6的XFS文件系统默认是支持overlay2的但内核3.10对overlay2原本有检测限制必须加上overlay2.override_kernel_checktrue才能强制启用。不加这个参数docker会用默认的vfs磁盘占用翻倍且性能差很多。启动Docker并设置开机自启systemctl enable --now docker执行docker version看到Client和Server版本都是19.03.15说明Docker本体已经正常工作了。3.3 安装nvidia-docker2并配置运行时离线仓库里已经有nvidia-docker2的源了直接安装yum install -y nvidia-docker2安装完成后nvidia-docker2的postinstall脚本一般会自动修改daemon.json加入nvidia runtime配置但是我遇到过脚本不生效的情况所以建议手动检查一下/etc/docker/daemon.json如果缺少runtimes字段就手动补上{ exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, storage-driver: overlay2, storage-opts: [ overlay2.override_kernel_checktrue ], runtimes: { nvidia: { path: /usr/bin/nvidia-container-runtime, runtimeArgs: [] } } }如果安装的版本用的是nvidia-container-runtime-hook而不是nvidia-container-runtime那么runtime的path要对应改成hook的实际路径。可以用which nvidia-container-runtime或which nvidia-container-runtime-hook确认一下别想当然。配置好后重启dockersystemctl daemon-reload systemctl restart docker验证docker能识别到nvidia运行时docker info | grep -i runtime输出里应包含nvidia这一项。然后再验证GPU是否真正透传到容器内部。先把宿主机驱动确认一下nvidia-smi能正常输出再拉一个cuda基础镜像测试如果离线环境没有镜像仓库可以用docker save/load提前导入一个cuda镜像docker run --rm --runtimenvidia -e NVIDIA_VISIBLE_DEVICESall nvidia/cuda:10.0-base nvidia-smi输出和宿主机一致的GPU信息说明nvidia-docker2已经彻底生效。3.4 完整自检清单以下项目建议全部过一遍避免遗漏导致的后续问题docker version客户端和服务端版本一致都是19.03.15docker infoStorage Driver为overlay2Runtimes中包含nvidiasystemctl is-enabled docker输出enabled保证开机自启nvidia-smi宿主机可正常看到GPUdocker run --rm --runtimenvidia -e NVIDIA_VISIBLE_DEVICESall cuda镜像 nvidia-smi容器内可见GPU以上全部通过这套环境就能交付了。4. 离线部署常见坑位与排查办法4.1 yum源没切干净安装时卡在“Loading mirror speeds”这个问题出现的频率最高。很多机器默认的CentOS-Base.repo配置里带着mirrorlist链接离线环境下yum会反复尝试连接外网导致安装命令长时间没有反应。解决方式就是我在3.1节写的进入/etc/yum.repos.d/后把原有repo文件全部移到backup目录只保留本地repo文件。如果机器上装了epel源也要一并移走。判断当前源是否干净可以用这个命令快速验证yum repolist如果输出里只有docker-ce-local和nvidia-docker-local说明已经干净了。如果还有base、epel之类的仓库继续清理。4.2 nvidia-smi在容器内看不到GPU这个问题的原因有几种最常见的是daemon.json里的runtime没配置对或者restart docker的时候没重启彻底。先执行docker info | grep -i runtime确认nvidia runtime是否被识别。另一种可能是NVIDIA_VISIBLE_DEVICES环境变量没传或者传成了void。正确写法是all或者具体GPU的UUID。还有一种比较隐蔽的情况宿主机NVIDIA驱动版本和新版libnvidia-container不兼容。如果驱动版本过老比如390.x以下老版本libnvidia-container反而更稳定可以尝试降低离线源中nvidia-container-toolkit的版本重装一遍。4.3 docker启动失败报“iptables: No chain/target/match by that name”这个问题在CentOS 7.6上非常经典。原因是Docker 19.03在启动时会尝试操作iptables nat表而老系统可能没有正确加载相关内核模块。解决方案modprobe br_netfilter echo br_netfilter /etc/modules-load.d/br_netfilter.conf同时确保net.ipv4.ip_forward为1sysctl -w net.ipv4.ip_forward1 echo net.ipv4.ip_forward 1 /etc/sysctl.conf如果还是不行检查系统SELinux状态建议直接设置为disabled或permissiveDocker和SELinux的兼容性问题在CentOS 7.6上很容易踩sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config setenforce 04.4 用docker-compose时提示版本不支持很多离线环境会用到docker-compose注意docker-compose和docker-compose-plugin是两回事。19.03时代对应的docker-compose是独立二进制不能用新版v2插件替代。直接把docker-compose的Linux二进制下载后放到/usr/local/bin/并加执行权限即可和离线安装docker本身没有冲突。另外顺带提醒一句如果后续要拷贝镜像给离线机器用docker save导出tar目标机器上docker load导入别用docker exportexport会丢镜像历史信息体积大且无法保证完整还原。4.5 拷包过程中rpm包损坏内网传文件时偶尔出现校验不通过或者在createrepo时发现某些包无法解析。我建议在源机器上执行完repotrack后用rpm -K批量校验一下find /opt/docker-offline -name *.rpm -exec rpm -K {} \;批量校验结果里看到OK就基本放心。传输工具建议用rsync配合--checksum参数或者传完再比对文件大小能有效避免包损坏。最后分享两个实际操作的小技巧第一整个离线目录建议永久保留不要装完就删。后续如果还需要给别的机器部署直接把tar包拷过去解压按3.1节配置一下repo就能用整个流程十分钟内搞定。我已经这个包复用在了好几台服务器上每次都很稳定。第二如果你管理的离线机器不止一台可以考虑在其中一台配置并启动httpd把离线rpm目录通过HTTP共享出去其余机器repo里直接指向http://主机IP/docker-offline/docker-ce。这样做的好处是后续任何一台机器需要补充安装包时只需要在源机器上更新一次目录所有机器都能同步使用不需要每台机器都去手动改repo。U盘来回拷贝这种事干一次就够够的了。这套方案的核心逻辑就是四个字一次拉全。不管是Docker还是NVIDIA的依赖只要在搭建离线源的时候足够细心把版本、依赖、元数据都处理好离线安装的体验完全可以接近在线环境。遇到问题的时候不要盲目去网上找零散的包回头检查一下本地源和repo配置大多数坑都能快速定位。本文还有配套的精品资源点击获取
返回列表