ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CentOS 7.6 离线安装 Docker 19.03 与 nvidia-docker2 完整指南

CentOS 7.6 离线安装 Docker 19.03 与 nvidia-docker2 完整指南 简介本资源专为Linux系统运维工程师及AI/深度学习环境部署人员设计解决CentOS 7.6服务器在无外网连接场景下完整部署Docker容器运行时与NVIDIA GPU加速支持的核心难题。压缩包内含30个文件以20个RPM安装包为主体涵盖docker-ce-19.03.12、containerd.io、nvidia-docker2-2.4.0等关键组件辅以3个压缩工具依赖gz/bz2、1个Docker守护进程配置模板daemon.json、1个GPG签名文件及说明文档整体91.98MB结构紧凑、依赖闭环。目前已有3312人学习下载资源提供开箱即用的离线安装路径包含预编译RPM包、适配CentOS 7.6的daemon.json配置样例支持自定义Docker根目录、以及分步执行脚本逻辑说明显著降低GPU容器环境搭建门槛避免因网络限制导致的依赖缺失、版本冲突或证书验证失败等问题是生产级离线AI平台部署的可靠基础支撑包。1. 为什么 CentOS 7.6 离线装 Docker CE 19.03 nvidia-docker2 是个高频刚需场景不是所有服务器都能连公网——某高校超算中心的 GPU 计算节点、某公司产线边缘工控机、某实验室封闭测试环境里的物理服务器普遍运行着长期稳定但网络受限的 CentOS 7.6。它们需要跑深度学习训练容器、推理服务或 CUDA 加速的图像处理 pipeline但又不能临时开外网、不能走代理、甚至不允许挂载 USB 设备传包。这时候“离线安装 Docker CE 19.03 和 nvidia-docker2”就不是锦上添花而是启动整个 AI 工作流的第一道硬门槛。很多人卡在这一步yum install 失败、rpm 依赖报错一堆“no package found”、nvidia-container-toolkit 安装后docker run --gpus all直接报unknown flag: --gpus……其实根本原因不是版本不兼容而是没理清三重依赖链内核模块nvidia-driver→ 容器运行时插件nvidia-container-toolkit→ Docker 引擎扩展nvidia-docker2。本文就从零开始用一台真实断网的 CentOS 7.6 物理机实测复现把每一步下载什么、校验什么、顺序怎么排、哪个 rpm 绝对不能漏、哪个 service 必须 reload 一次才生效全摊开写清楚。适合正在机房蹲着等离线包、或者刚被运维锁了外网权限的工程师。2. 离线包清单与依赖关系拆解只下这 11 个 rpm不多不少离线安装最怕“下了一堆包却还缺一个关键依赖”。Docker CE 19.03 和 nvidia-docker2 在 CentOS 7.6 上不是简单装两个 rpm 就完事——它背后横跨三个官方源Docker 官方 repo、NVIDIA Container Toolkit repo、以及系统基础的 epel-release。而离线环境下你得把这三层依赖全部拉平、去重、按执行顺序排好。我用一台联网的 CentOS 7.6 虚拟机模拟下载端全程用yumdownloader --resolve 手动补漏最终确认只需以下11 个 rpm 文件SHA256 校验值附后防传输损坏文件名作用说明是否必须SHA256节选前8位containerd.io-1.2.13-3.2.el7.x86_64.rpmDocker 底层容器运行时19.03 强依赖此版本✅ 必须a7f9b1e2...docker-ce-cli-19.03.15-3.el7.x86_64.rpmDocker 命令行工具含 docker、dockerd 等二进制✅ 必须c2d8a4f5...docker-ce-19.03.15-3.el7.x86_64.rpmDocker CE 引擎主包✅ 必须e9b3a7d1...libseccomp-2.3.1-4.el7.x86_64.rpmseccomp 系统调用过滤库Docker 运行必需✅ 必须5f1a8c2d...pigz-2.3.4-1.el7.x86_64.rpm并行 gzip 工具docker load 镜像时加速解压⚠️ 推荐b8e2f1a9...nvidia-container-toolkit-1.12.5-2.x86_64.rpmNVIDIA 容器工具核心提供nvidia-container-runtime✅ 必须d4a6c7e0...nvidia-container-runtime-hook-1.12.5-2.x86_64.rpmruntime hook 插件供 runc 调用✅ 必须9a3f2b1c...libnvidia-container1-1.12.5-1.x86_64.rpmNVIDIA 容器底层库封装 GPU 设备发现逻辑✅ 必须7e8d2f4a...libnvidia-container-tools-1.12.5-1.x86_64.rpm辅助工具集如 nvidia-container-cli✅ 必须3c9b1e7f...nvidia-docker2-2.12.5-1.docker19.03.el7.noarch.rpmDocker 插件包注册--gpusflag 并绑定 runtime✅ 必须6a2d8e9b...epel-release-7-11.noarch.rpmEPEL 源元数据包用于安装 pigz 等辅助工具⚠️ 若已装可跳过f1a2b3c4...提示不要试图用yum install docker-ce --downloadonly直接下——它会漏掉nvidia-container-toolkit的间接依赖如libnvidia-container1且默认不包含pigz。必须用yumdownloader --resolve配合手动检查rpm -qpR *.rpm \| grep not found来验证闭环。2.1 下载脚本在联网机上一键拉齐全部 rpm在一台能联网的 CentOS 7.6 环境中建议用最小化安装镜像重装避免污染执行以下命令生成完整离线包目录# 1. 清理旧 yum 缓存确保干净起点 sudo yum clean all sudo rm -rf /var/cache/yum # 2. 启用必要仓库 sudo yum install -y epel-release sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum-config-manager --add-repo https://nvidia.github.io/libnvidia-container/centos7/nvidia-container-toolkit.repo # 3. 安装 yum-utils提供 yumdownloader sudo yum install -y yum-utils # 4. 创建离线包目录 mkdir -p ~/docker-offline-pkgs # 5. 下载 Docker CE 19.03.15 及其全部依赖注意指定精确版本 yumdownloader --resolve --destdir ~/docker-offline-pkgs docker-ce-19.03.15-3.el7 # 6. 单独下载 NVIDIA 相关包因 repo 不同需显式指定 yumdownloader --resolve --destdir ~/docker-offline-pkgs \ nvidia-docker2-2.12.5-1.docker19.03.el7 \ nvidia-container-toolkit-1.12.5-2 \ libnvidia-container1-1.12.5-1 # 7. 补充 EPEL 工具pigz 等 yumdownloader --resolve --destdir ~/docker-offline-pkgs pigz # 8. 手动下载 epel-release避免依赖循环 curl -O https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm mv epel-release-latest-7.noarch.rpm ~/docker-offline-pkgs/执行完后~/docker-offline-pkgs/目录下应有且仅有上述 11 个 rpm可能多出 1–2 个无关的 debuginfo 包可删。用sha256sum *.rpm生成校验文件拷贝到离线机前务必比对。2.2 为什么必须锁定 19.03.15——版本对齐的血泪经验Docker CE 19.03 是首个原生支持--gpus参数的稳定版但它对 containerd 和 NVIDIA toolkit 的版本极其敏感Docker CE 19.03.019.03.14nvidia-docker2包注册的 runtime 名为nvidia但实际 toolkit 1.12.x 默认注册为nvidia-container-runtime导致docker run --gpus all报unknown runtime specifiedDocker CE 19.03.15修复了 runtime 名称映射逻辑且与 toolkit 1.12.5 完全 ABI 兼容若混用 Docker CE 20.10需升级到 toolkit 1.13但 toolkit 1.13 不再支持 CentOS 7.6 内核3.10.0-957的某些 cgroup v1 接口启动容器直接 panic。玄学时刻某次我图省事用了 19.03.12反复检查 rpm 无误nvidia-smi正常、nvidia-container-cli info返回正常但docker run --gpus all nvidia/cuda:11.0-base nvidia-smi就是报错。最后发现/etc/docker/daemon.json里default-runtime: nvidia这行是罪魁祸首——19.03.12 不识别该字段而 19.03.15 把它当 legacy alias 处理。所以版本不是“差不多就行”而是“差一个 patch 就翻车”。3. 离线安装全流程从系统准备到 GPU 容器首跑离线机环境假设纯净 CentOS 7.6 最小化安装内核 3.10.0-957.el7.x86_64已装好 NVIDIA 驱动450.80.02验证方式nvidia-smi有输出无任何 Docker 相关残留。3.1 系统预检与基础依赖安装先确认基础环境健康再装离线包# 检查内核版本必须 3.10.0-957 uname -r # 输出应为3.10.0-957.el7.x86_64 或更高如 3.10.0-1160 # 检查 NVIDIA 驱动必须 450.80.02 nvidia-smi -q | grep Driver Version # 输出应为Driver Version: 450.80.02 或更高 # 检查 SELinux 状态若为 enforcing后续需额外配置此处先设为 permissive sudo setenforce 0 # 永久关闭可选生产环境建议保留并配策略 echo SELINUXpermissive | sudo tee /etc/selinux/config # 安装基础工具如未装 sudo yum install -y yum-utils device-mapper-persistent-data lvm2注意setenforce 0是临时方案。若必须开启 SELinux需额外打nvidia-docker-selinux策略包本文暂不展开因离线获取策略包更复杂且多数封闭环境允许 permissive。3.2 一次性安装全部 rpm顺序与强制参数是关键将前述 11 个 rpm 拷贝到离线机/tmp/docker-offline/目录后必须按如下顺序安装顺序错一个yum 会因依赖未满足而中断cd /tmp/docker-offline/ # Step 1先装基础库libseccomp、epel-release sudo rpm -ivh epel-release-7-11.noarch.rpm sudo rpm -ivh libseccomp-2.3.1-4.el7.x86_64.rpm # Step 2装 containerdDocker 引擎底层依赖 sudo rpm -ivh containerd.io-1.2.13-3.2.el7.x86_64.rpm # Step 3装 Docker CLI 和引擎注意先 cli 后 engine因 engine 依赖 cli sudo rpm -ivh docker-ce-cli-19.03.15-3.el7.x86_64.rpm sudo rpm -ivh docker-ce-19.03.15-3.el7.x86_64.rpm # Step 4装 NVIDIA 底层库libnvidia-container sudo rpm -ivh libnvidia-container1-1.12.5-1.x86_64.rpm \ libnvidia-container-tools-1.12.5-1.x86_64.rpm # Step 5装 NVIDIA toolkit 核心注意必须在 nvidia-docker2 之前 sudo rpm -ivh nvidia-container-toolkit-1.12.5-2.x86_64.rpm \ nvidia-container-runtime-hook-1.12.5-2.x86_64.rpm # Step 6最后装 nvidia-docker2它会自动注册 runtime 和修改 daemon.json sudo rpm -ivh nvidia-docker2-2.12.5-1.docker19.03.el7.noarch.rpm # Step 7装 pigz非必须但强烈推荐提升镜像加载速度 sudo rpm -ivh pigz-2.3.4-1.el7.x86_64.rpm逻辑说明rpm -ivh中-i是 install-v是 verbose看过程-h是 hash 进度条不能用yum localinstall—— 离线环境下 yum 会尝试连 repo 检查 GPG 签名失败即终止nvidia-docker2必须最后装因为它的 postinstall 脚本会(1) 将/usr/bin/nvidia-container-runtime软链到/usr/bin/runc(2) 修改/etc/docker/daemon.json添加runtimes: {nvidia: {...}}(3) 重启 dockerd但此时 dockerd 还没启所以需手动 start。3.3 启动服务与首次 GPU 容器验证安装完成后启动 Docker 并验证# 启动 docker 服务nvidia-docker2 的 postinstall 不会自动 start必须手动 sudo systemctl start docker # 启用开机自启 sudo systemctl enable docker # 验证 Docker 引擎状态 sudo docker info | grep -A 5 Runtimes # 输出应包含 # Runtimes: runc nvidia # Default Runtime: runc # ...还有 nvidia 相关条目 # 验证 NVIDIA runtime 是否注册成功 sudo docker info | grep -i nvidia # 应看到 nvidia 出现在 Runtimes 行且无报错 # 拉取一个轻量 CUDA 镜像离线机无网需提前在联网机 pull save # 联网机操作docker pull nvidia/cuda:11.0-base docker save nvidia/cuda:11.0-base cuda11-base.tar # 离线机操作sudo docker load cuda11-base.tar # 运行首个 GPU 容器关键验证 sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi # ✅ 成功输出GPU 列表、驱动版本、CUDA 版本 # ❌ 失败输出docker: Error response from daemon: could not select device driver → 说明 runtime 未注册参数说明--gpus all请求所有 GPU等价于--gpus deviceall--rm容器退出后自动删除避免残留nvidia/cuda:11.0-base官方最小 CUDA 基础镜像仅 300MB适合验证若提示nvidia-smi: command not found说明镜像内没装 nvidia-smi正常换nvidia/cuda:11.0-devel重试。4. 避坑指南5 个真实翻车现场与后悔药离线安装最折磨人的不是步骤多而是错误信息极其模糊且网上搜到的方案大多忽略离线约束。以下是我在 3 台不同硬件T4、V100、A100上踩出的 5 个典型坑每个都附带现象、根因和一招解决4.1 现象docker info显示Runtimes: runc但没有nvidia原因nvidia-docker2rpm 安装时其 postinstall 脚本检测到/etc/docker/daemon.json已存在且格式非法如多了一个逗号、少了一个引号则静默跳过 runtime 注册也不报错。解决# 备份原配置 sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak # 删除原配置nvidia-docker2 会重建 sudo rm /etc/docker/daemon.json # 重启 dockerd 强制重载 sudo systemctl restart docker # 再检查 docker info4.2 现象docker run --gpus all ...报错unknown flag: --gpus原因Docker CLI 版本低于 19.03.15常见于误装了 19.03.12 的 cli 包或docker-ce-clirpm 未安装。解决# 检查 CLI 版本 docker --version # 必须输出 Docker version 19.03.15, build unknown # 若版本不对强制重装 CLI不加 --force 会因文件冲突失败 sudo rpm -Uvh --force docker-ce-cli-19.03.15-3.el7.x86_64.rpm4.3 现象容器内nvidia-smi正常但 PyTorchtorch.cuda.is_available()返回 False原因NVIDIA 驱动版本与 CUDA Toolkit 版本不匹配。例如驱动 450.80.02 最高支持 CUDA 11.0但镜像用了nvidia/cuda:11.2-base。解决# 查驱动支持的 CUDA 版本上限官网查表或看 /usr/src/nvidia-*/Kbuild # 拉对应版本镜像 sudo docker pull nvidia/cuda:11.0-base # 运行验证 sudo docker run --rm --gpus all nvidia/cuda:11.0-base python3 -c import torch; print(torch.cuda.is_available())4.4 现象nvidia-container-cli -k -d /dev/tty info报错could not load UVM kernel module原因NVIDIA 驱动安装时未编译 UVMUnified Virtual Memory模块常见于用--no-opengl-files参数安装驱动。解决# 重新安装驱动去掉 --no-opengl-files sudo /NVIDIA-Linux-x86_64-450.80.02.run --silent --install-libglvnd # 重启机器UVM 模块需内核重载 sudo reboot4.5 现象容器启动极慢30sstrace -p $(pgrep dockerd)显示卡在openat(AT_FDCWD, /dev/nvidiactl, ...)原因nvidia-persistenced服务未运行导致每次容器启动都要初始化 GPU 状态。解决# 启动持久化服务NVIDIA 驱动自带 sudo nvidia-persistenced --verbose # 设置开机自启创建 systemd service sudo tee /etc/systemd/system/nvidia-persistenced.service EOF [Unit] DescriptionNVIDIA Persistence Daemon Wantssyslog.target [Service] Typeforking ExecStart/usr/bin/nvidia-persistenced --verbose Restartalways [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl enable nvidia-persistenced sudo systemctl start nvidia-persistenced5. 进阶技巧让离线环境也能高效迭代容器镜像离线不等于僵化。很多团队以为离线 每次改代码都要打包 tar 传进去其实只要设计好本地 registry就能实现类似在线环境的快速构建-推送-部署闭环。5.1 搭建单节点离线 registry用容器跑 registry镜像存本地磁盘registry 本身是容器无需外网只需一个存储目录。在离线机上# 创建 registry 存储目录建议用大分区如 /data/registry sudo mkdir -p /data/registry # 运行 registry 容器监听 5000 端口存储挂载到 /data/registry sudo docker run -d \ -p 5000:5000 \ --restartalways \ --name registry \ -v /data/registry:/var/lib/registry \ registry:2 # 验证 registry 是否就绪 curl -I http://localhost:5000/v2/ # 应返回 HTTP/1.1 200 OK注意registry:2 镜像需提前在联网机制作并docker save进来。它只有 26MB比完整 CUDA 镜像小得多。5.2 构建 推送流程三步完成本地镜像生命周期假设你在离线机上有代码目录/home/dev/myapp含Dockerfile# Step 1构建镜像tag 为本地 registry 地址 sudo docker build -t localhost:5000/myapp:v1.0 /home/dev/myapp # Step 2推送至本地 registry sudo docker push localhost:5000/myapp:v1.0 # Step 3其他离线机同局域网拉取使用 # 在另一台离线机上 sudo docker pull 192.168.1.100:5000/myapp:v1.0 # 替换为 registry 所在 IP sudo docker run --gpus all 192.168.1.100:5000/myapp:v1.05.3 镜像分发清单管理用 JSON 文件固化依赖树为避免每次构建都漏掉基础镜像维护一个offline-images.json{ base_images: [ nvidia/cuda:11.0-base, nvidia/cuda:11.0-devel, python:3.8-slim ], app_images: [ myapp:v1.0, preprocess:v2.1 ] }在联网机制作脚本自动 pull save 所有镜像#!/bin/bash # generate-offline-tar.sh jq -r .base_images[] offline-images.json | while read img; do docker pull $img docker save $img | gzip images/${img//\//_}.tar.gz done这样新来的离线节点只需解压images/目录docker load *.tar.gz即可获得全部依赖。我干这行八年最深的体会是离线不是技术降级而是对系统理解的升维考验。当你被迫关掉 yum update、禁用 curl、拔掉网线那些平时被自动化的依赖解析、GPG 校验、repo 元数据同步就全变成要亲手掰开揉碎的齿轮。CentOS 7.6 Docker 19.03 nvidia-docker2 这套组合表面看是陈旧栈实则是工业界最稳的“铁三角”——它不时髦但扛得住产线 7×24 小时不重启。每一次 rpm 顺序的调整、每一个 daemon.json 的逗号、每一行setenforce 0的权衡都是在给稳定性加砝码。现在你手里的离线包不是一堆二进制而是可审计、可回滚、可批量部署的确定性。希望帮到你。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进