资讯动态

离线环境部署GPU服务器:CentOS 7.6安装Docker与NVIDIA容器全攻略

发布时间:2026/10/4 22:59:33 来源:尧图企业网站定制
简介离线环境下部署容器运行环境常受依赖包缺失和版本兼容问题困扰这份资源针对CentOS 7.6服务器提供Docker CE 19.03与NVIDIA Docker 2.4的一体化离线安装方案适合内网运维、GPU服务器管理员及需要在无外网条件搭建容器深度学习环境的开发者。资源包共30个文件压缩后约92MB主体为20个RPM安装包涵盖docker-ce、containerd.io、nvidia-container-toolkit、nvidia-container-runtime等核心组件及系统依赖另附daemon.json配置、安装说明TXT、GPG签名和软件仓库元数据便于离线校验和按步骤执行。目前已有3312人学习下载在同类离线安装资料中实用参考价值较高。包内安装流程清晰先批量安装Docker相关RPM并启动服务再安装NVIDIA Docker组件最后用提供的daemon.json替换默认配置以启用GPU运行时同时提示自定义安装路径能有效减少依赖冲突和配置错误帮助读者快速搭建可用的Docker容器GPU环境。1. CentOS 7.6 离线装 Docker为什么离线比在线更考验基本功在 AI 训练机和推理服务器的交付现场CentOS 7.6 离线安装 docker-ce 19.03 和 nvidia-docker2 几乎是一道必考题。内网机房没有外网yum 源连不上在线环境里一条yum install -y docker-ce就能搞定的事到了离线环境却经常卡在依赖解析上docker-ce 的 rpm 包本身不难拿真正难缠的是 nvidia-container-toolkit 那一串互相咬合的老版本组件。这篇直接拆解整条链路怎么在联网机器上把包备齐、目标机上怎么搭本地 yum 仓库、docker-ce 19.03 和 nvidia-docker2 安装时的版本匹配怎么做、以及最后怎么验证 GPU 容器真的能把显卡映射进去。适合要给内网交付 GPU 服务器的运维、算法工程师也适合手里只有离线介质、被 NVIDIA 驱动和 Docker 版本折腾过的人。2. 离线安装前置rpm 包汇总、本地 yum 仓库与内核检查离线安装的核心不是“把 rpm 文件拷过去”而是让目标机的 yum 在没有外网时也能完成依赖解析。这一步做扎实后面装 docker 和 nvidia-docker2 就是一个yum install的事做不扎实后面各种缺库、缺签名、版本被替换的坑全都会冒出来。先准备包再搭仓库最后检查内核和文件系统。2.1 在联网机器上把依赖全部拉下来我一般会专门找一台跟目标机同版本CentOS 7.6 x86_64的联网机器配好 docker-ce 官方源和 epel 源然后用yum install --downloadonly把目标软件包连同全部依赖一起拉到一个目录里。这个命令比yumdownloader更省心因为它天然做依赖解析下载下来的就是完整闭环。# 在联网机器上先安装 downloadonly 插件CentOS 7 默认自带确认一下即可 yum install -y yum-plugin-downloadonly # 拉取 docker-ce 19.03 相关包及其全部依赖 yum install --downloadonly --downloaddir/data/docker-rpms \ docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io # 拉取 nvidia-docker2 相关包需要先配好 nvidia 的 rhel7 仓库地址 yum install --downloadonly --downloaddir/data/nvidia-rpms \ nvidia-docker2-2.5.0参数说明--downloadonly只下载不安装--downloaddir指定包存放目录。拉 docker-ce 时containerd.io的版本号要和 docker-ce 兼容一般用同一个发布批次里的版本。nvidia-docker2 单独放一个目录不要和 docker 的包混在一起后面装的时候好区分。这里我把 docker-ce 拉到 19.03.15这是 19.03 系列比较靠后的补丁版本如果你只有 19.03.019.03.14 的包也没关系安装逻辑一样。2.2 目标机搭建本地 yum 仓库把/data/docker-rpms和/data/nvidia-rpms两个目录整个拷到目标机合并放到一个目录比如/opt/offline-rpms然后用createrepo生成仓库元数据。这里有个很现实的问题目标机离线createrepo这个工具本身可能也没装所以要趁着联动机还在线时把createrepo的 rpm 也一起拉下来随包带过去。# 目标机上执行如果没有 createrepo先 rpm -ivh 安装随包带来的 createrepo mkdir -p /opt/offline-rpms cp -r /data/docker-rpms/* /data/nvidia-rpms/* /opt/offline-rpms/ cd /opt/offline-rpms createrepo ./ # 生成 repodata 目录 # 写入本地仓库配置 cat /etc/yum.repos.d/local.repo EOF [local-offline] nameLocal Offline RPM Repo baseurlfile:///opt/offline-rpms enabled1 gpgcheck0 EOF yum clean all yum makecache配置说明baseurl指向本地目录用file://协议gpgcheck0是离线本地仓库的常见做法因为本地包经过自己核对没必要再验签名同时也避免后面安装时报 GPG 签名错误。createrepo ./会在目录下生成repodata子目录yum 只有看到它才会认为这是一个合法仓库。做完后yum makecache能刷出仓库缓存用yum repolist能看到local-offline仓库处于 enabled 状态。2.3 内核与文件系统检查docker 跑起来依赖内核模块、存储驱动和网络转发这三样在离线环境里最容易踩雷必须在装 docker 之前检查完。# 检查内核版本和 overlay 模块 uname -r modprobe overlay lsmod | grep overlay # 检查存储驱动条件数据分区如果用了 xfs必须确认 ftype1 mount | grep -E / |xfs | head -5 xfs_info /var | grep ftype # docker 数据目录所在分区的检查 # 检查 ip_forwarddocker 跨容器网络依赖它 sysctl net.ipv4.ip_forward检查结果怎么判断内核版本最好是 3.10.0-957 及以上这是 CentOS 7.6 的默认内核通常没问题。lsmod | grep overlay有输出就说明模块在。ftype1是 overlay2 存储驱动的硬性要求如果显示ftype0docker 启动时会直接报错这块没有任何后悔药只能重新格式化分区或者把 docker 的数据目录切到 ext4 分区。ip_forward为 1 是正常的为 0 的话容器之间网络会不通常见是物理机没开启转发导致的。3. docker-ce 19.03 离线部署安装顺序、daemon 配置与镜像导入docker-ce 19.03 是 Docker 正式支持--gpus标志的起点版本选它做 GPU 场景完全是因为和 nvidia-docker2 的兼容性最稳。这一章把安装顺序和配置讲透顺序错了依赖会打架配置少了后面接 nvidia-docker2 还得返工。3.1 rpm 包安装顺序先把本地仓库里的 docker-ce 装好。我的建议是不要用rpm -ivh *.rpm一把梭因为有多个版本的docker-ce-cli、containerd.io混在一起时rpm 命令不会帮你解析依赖顺序装到一半报缺依赖是常事。走 yum 本地仓库让它自动解析最省心。# 通过本地仓库安装自动解析依赖关系 yum install -y docker-ce docker-ce-cli containerd.io # 如果想手动确认版本可用 rpm 指定顺序安装 cd /opt/offline-rpms rpm -Uvh --nogpgcheck containerd.io-*.x86_64.rpm rpm -Uvh --nogpgcheck docker-ce-cli-*.x86_64.rpm rpm -Uvh --nogpgcheck docker-ce-*.x86_64.rpm参数说明--nogpgcheck跳过签名验证本地仓库里gpgcheck0时其实可以不加但直接对 rpm 文件操作时加上更保险。rpm -Uvh的U是升级安装对首次安装和后续补版本都适用。手动安装时严格按 containerd.io → cli → ce 的顺序来因为 docker-ce 主包要求 cli 和 containerd 先就位。装完先不急着启动下一步把 daemon.json 配好再systemctl start docker避免启动两次。3.2 daemon.json 与存储驱动确认docker 的配置集中在/etc/docker/daemon.json离线环境不需要配置 registry mirror但数据目录、cgroup 驱动这些必须显式写清楚。CentOS 7.6 用 systemd 管理服务cgroup 驱动必须对齐成systemd否则后面和 Kubernetes 对接时会出现 cgroup 双重管理的问题。mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { data-root: /data/docker, exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: {max-size: 100m, max-file: 3}, storage-driver: overlay2, max-concurrent-downloads: 10 } EOF systemctl daemon-reload systemctl enable --now docker # 验证安装结果 docker version docker info | grep -E Storage Driver|Cgroup Driver|Docker Root Dir配置项说明># 联网机器上导出镜像以 nvidia/cuda:10.2-base 为例 docker pull nvidia/cuda:10.2-base docker save nvidia/cuda:10.2-base -o /data/images/cuda102-base.tar gzip /data/images/cuda102-base.tar # 压缩后体积小很多方便传输 # 目标机导入 cd /opt/offline-images gunzip cuda102-base.tar.gz docker load -i cuda102-base.tar # 确认镜像 tag 正确后打标 docker tag nvidia/cuda:10.2-base nvidia/cuda:10.2-base命令说明docker save -o指定输出文件docker load -i从 tar 文件导入。gzip压缩这一步在镜像有几个 GB 时非常值内网传输耗时能减少一半以上。tar 包解压进来后docker images能看到镜像名和 tag 都保留了原来的值如果 registry 地址要改写用docker tag重新打标即可。镜像最好集中放一个目录和 rpm 包分开管理后面验证 GPU 用的就是刚导入的这个 cuda 镜像。4. nvidia-docker2 离线安装版本匹配、仓库替换与 runtime 配置nvidia-docker2 是整条链路里最容易出幺蛾子的一环。它本质上不是一个独立的运行时而是一个元包安装时会拉起来一串组件nvidia-container-runtime、libnvidia-container1、nvidia-container-toolkit。这些组件跟 docker-ce 的版本咬得特别紧版本错了直接导致 dockerd 启动失败所以第四章我把版本匹配规则和安装手法单独拆开讲。4.1 版本匹配docker-ce 19.03 和 nvidia-docker2 的对应关系nvidia-docker2 的 2.x 系列面向 docker 19.03 时代内部依赖的nvidia-container-runtime和nvidia-container-toolkit是 1.x 的老版本线。给 CentOS 7.6 配对的常用基线是docker-ce 19.03.15 nvidia-docker2-2.5.0 libnvidia-container11.3 或 1.4 系列。这个组合我实测过多次兼容性最稳。不要把新版nvidia-container-toolkit2.x 那条线硬配到 docker-ce 19.03 上新版 toolkit 默认对接的是 docker 20.10 的 runtime 机制配上去轻则--gpus参数不生效重则 daemon 直接拒绝启动。离线环境里最忌讳“装最新版”的惯性思维nvidia-docker2 这个场景是典型的“越旧越稳”。# 查看本地仓库里实际拉到的 nvidia 相关包 rpm -qa | grep -E nvidia-container|libnvidia-container这条命令在装之前和装之后都要跑一遍目的是确认仓库里的包版本确实落在上面说的基线上。如果有 2.x 的 toolkit 混进来先把那些包排除掉重新拉取对应 1.x 版本的 rpm 再继续。4.2 离线安装 nvidia-docker2 并锁定 docker 版本安装 nvidia-docker2 最需要注意的不是装不上而是装的过程中把 docker 版本悄悄换掉。nvidia 的仓库里通常带着一版它自己维护的 docker 包如果你用yum install nvidia-docker2不带任何约束yum 可能会因为依赖关系把 docker-ce 19.03 替换成仓库里的默认版本这一步是无数人踩过的坑。# 推荐做法一直接 rpm 指定版本安装绕开 yum 依赖替换 cd /opt/offline-rpms rpm -Uvh --nogpgcheck \ libnvidia-container1-*.x86_64.rpm \ libnvidia-container-tools-*.x86_64.rpm \ nvidia-container-toolkit-*.x86_64.rpm \ nvidia-container-runtime-*.x86_64.rpm \ nvidia-docker2-2.5.0-*.x86_64.rpm # 推荐做法二如果走 yum必须用 --exclude 锁住 docker 包 yum install -y nvidia-docker2-2.5.0 --excludedocker-ce,docker-ce-cli命令说明rpm 方式安装时包名顺序有讲究libnvidia-container1和libnvidia-container-tools先装然后是 toolkit、runtime最后是 nvidia-docker2 元包。Uvh会把已经存在的组件升级到指定版本不会产生包冲突。走 yum 时--exclude是保命参数它明确告诉 yum 不许动 docker-ce 和 docker-ce-cli。装完后立刻再跑一次rpm -qa | grep docker确认 docker-ce 还是 19.03.15docker 版本没变才算装对。4.3 daemon.json 注册 nvidia runtime 与 GPU 容器验证nvidia-docker2 装完后不会自动改 daemon.json需要手动把 runtime 注册进去。这里有个细节只注册 nvidia runtime不要把default-runtime设成 nvidia否则所有容器都会被强制挂载 GPU跑普通业务容器时会多出不必要的资源开销也更容易触发 NVML 的报错。cat /etc/docker/daemon.json EOF { data-root: /data/docker, exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: {max-size: 100m, max-file: 3}, storage-driver: overlay2, max-concurrent-downloads: 10, runtimes: { nvidia: { path: nvidia-container-runtime, runtimeArgs: [] } } } EOF systemctl daemon-reload systemctl restart docker # 用刚才导入的 cuda 镜像做 GPU 容器验证 docker run --rm --gpus all nvidia/cuda:10.2-base nvidia-smi配置说明runtimes.nvidia里的path指向可执行文件nvidia-container-runtime安 装后它会在/usr/bin下生成软链所以这里直接写命令名即可。runtimeArgs留空数组是标准写法。验证命令里的--gpus all是 docker 19.03 原生支持的参数如果输出里能看到显卡型号、驱动版本和显存信息说明 nvidia-docker2 链路已经打通。如果报错说找不到 nvidia-smi 或者 NVML 初始化失败就去查第五章的避坑记录。5. 离线部署避坑排查五个翻车现场与解决记录离线部署最大的问题是报错信息不完整很多问题看起来是“启动失败”或“找不到文件”根源却五花八门。下面这五条是我在这些年交付离线 GPU 环境时真实遇到的翻车现场每一条都按现象、原因、解决三段来写你可以直接对照排查。5.1 本地仓库安装时报 GPG 签名错误现象yum install docker-ce时报Public key for ....rpm is not installed或GPG key retrieval failed安装直接中断。原因目标机是干净的离线系统没有导入 docker-ce 官方源或 nvidia 源的 GPG key而 local.repo 里没关掉签名校验yum 拿不到公钥就拒绝安装任何 包。解决最简单的方式是把 local.repo 的gpgcheck显式设为 0前面搭仓库时我就是这么配的。如果坚持要保留签名校验就得单独把 key 文件拷进系统并执行rpm --import但离线场景下没这个必要本地包已经人工核对过来源关闭 gpgcheck 不会引入额外风险。5.2 装完 nvidia-docker2 后 docker 版本变了现象安装 nvidia-docker2 之前明明确认 docker-ce 是 19.03.15装完后docker version显示的 Client 和 Server 版本变成了别的版本号甚至docker-ce包被替换成了docker包。原因nvidia 仓库里带着它自己维护的 docker 版本使用yum install nvidia-docker2时yum 的依赖解析把 docker-ce 替换成了仓库中的默认版本。解决卸载被换掉的 docker 包重新安装 docker-ce-19.03.15然后再装 nvidia-docker2。第二次装的时候必须用rpm -Uvh指定包路径或者加--excludedocker-ce,docker-ce-cli参数锁版本。我现在的习惯是凡是涉及 nvidia-docker2 的安装一律走 rpm 指定文件的方式绝不使用裸的yum install。5.3 overlay2 启动报错 no such device现象systemctl start docker后docker info报Error starting daemon: error initializing graphdriver: operation not supported或者failed to mount overlaydaemon 进程反复重启。原因两种常见情况一是内核没有加载overlay模块二是 docker 数据目录所在分区的 xfs 文件系统在格式化时没带ftype1overlay2 依赖这个属性做索引。解决先modprobe overlay并写进/etc/modules-load.d/保证开机加载如果模块没问题那就是分区问题。数据分区是 xfs 的话在联网准备阶段就要确认xfs_info输出里ftype1不是就重做数据分区把 mkfs 参数加上-n ftype1。这一步改不了的话另一个出路是把>#!/bin/bash # check_docker_gpu.sh —— 离线环境的 GPU 容器可用性检查 set -e echo [1/4] 检查 docker 服务状态 systemctl is-active docker echo [2/4] 检查 nvidia runtime 注册 docker info -f {{json .Runtimes}} | grep -q nvidia echo nvidia runtime: OK echo [3/4] 验证 GPU 容器 docker run --rm --gpus all nvidia/cuda:10.2-base nvidia-smi -L echo [4/4] 检查容器 DeviceRequests docker run -d --name gpu-test --gpus all nvidia/cuda:10.2-base sleep 60 docker inspect gpu-test -f {{json .HostConfig.DeviceRequests}} docker rm -f gpu-test echo 全部通过GPU 容器可用脚本说明第 2 步用docker info的 JSON 输出判断 nvidia runtime 是否注册这里用-f模板提取Runtimes字段比docker info文本里 grep 更精确。第 3 步nvidia-smi -L只列出 GPU 列表比完整nvidia-smi输出更容易做自动化判断。第 4 步创建的sleep 60容器重点看HostConfig.DeviceRequests里有没有Driver: nvidia和Count: 1这类字段这两个字段存在说明 GPU 真的被调度给了容器。脚本跑完通过基本可以确定整套环境交付质量是可靠的。6.2 离线包归档与回滚习惯交付做完不等于事情结束离线包的管理习惯决定了你三个月后维护时会不会抓狂。我现在每个项目都会建一个离线包清单目录rpm 包按 docker 和 nvidia 分两个子目录images 单独放同时生成一份md5sum.txt和一份install.sh安装脚本。install.sh 里严格记录安装顺序、版本号、以及 daemon.json 的备份位置。# 归档目录结构示例 offline-env/ ├── docker-rpms/ # docker-ce 及依赖 ├── nvidia-rpms/ # nvidia-docker2 及依赖 ├── images/ # docker save 出来的镜像 tar 包 ├── md5sum.txt # 所有 rpm 和 tar 包的 md5 └── install.sh # 按顺序执行的安装脚本 # 生成校验清单 cd /opt/offline-env md5sum docker-rpms/*.rpm nvidia-rpms/*.rpm images/*.tar.gz md5sum.txt这套习惯是被一次事故逼出来的。之前我给一个异地机房交付离线环境包是让别人打包代发的到了现场 nvidia-container-toolkit 版本偏新和 docker-ce 19.03 对不上dockerd 起不来。现场没有外网只能翻原始包列表排查版本问题折腾了整整半天。从那以后我每次分发离线包都会强制走一遍rpm -qa | grep -E nvidia|docker的版本核对再拿安装目录里的 install.sh 从头到尾跑一遍确认无报错才交付。这个习惯不复杂但能挡掉大量远程维护的麻烦希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑