资讯动态

CentOS 7 Docker RPM离线安装:版本对齐与依赖顺序实战指南

发布时间:2026/10/15 14:05:33 来源:尧图企业网站定制
简介本资源是一套专为CentOS 7系统离线部署Docker环境准备的完整RPM软件包集合面向Linux系统运维人员、容器技术初学者及受限网络环境下的企业IT工程师解决无外网YUM源时无法直接安装Docker及其依赖组件的核心痛点。压缩包共16个文件包含9个核心RPM包如docker-1.12.6、docker-client、docker-common、container-selinux、oci-systemd-hook等、3个.gz格式元数据文件primary.xml.gz、filelists.xml.gz、other.xml.gz用于构建本地YUM仓库以及3个.bz2索引文件和1个repomd.xml仓库描述文件整体大小19.27MB结构符合标准RPM仓库规范。已有382人学习下载用户可直接解压后通过createrepo命令快速搭建本地Docker安装源免去逐一手动下载依赖的繁琐过程并获得完整兼容CentOS 7的Docker 1.12.6版本运行栈含容器管理、镜像操作、SELinux集成与OCI运行时支持等关键能力。1. Docker RPM 包离线安装别急着yum install dockerCentOS 7 上装错版本可能连dockerd都起不来你手头刚拿到一个叫docker.rpm.tar的压缩包解压后是十几个.rpm文件心里想着“不就是装个 Docker 吗rpm -ivh *.rpm一把梭”——我去年在某高校实验室部署容器平台时就这么干过结果systemctl start docker报错Failed to start docker.service: Unit not found查了两小时才发现tar 包里混着docker-ce-cli-20.10.24和containerd.io-1.6.32但主包却是docker-ce-24.0.7三者 ABI 不兼容dockerd进程一启动就 core dump。这不是玄学是 RPM 依赖树没对齐的硬伤。这套docker.rpm.tar明显是为离线环境打包的完整依赖集常见于政企内网、金融测试区、教育专网等无法直连download.docker.com的场景。它不面向新手一键安装而是给运维/部署工程师准备的「可控交付单元」版本锁定、无网络依赖、可审计、可复刻。如果你正卡在「Docker 怎么离线安装」「docker-ce 和 docker-ce-cli 版本怎么配」「containerd.io 装哪个才不翻车」这篇就是为你写的血泪验证笔记。2. 解包与环境校验先看清 tar 包里到底有啥再决定装不装2.1 解压并列出所有 RPM 文件带版本号和架构拿到docker.rpm.tar别急着装。先确认它是否真包含完整依赖链。用以下命令解压并结构化查看# 创建专用工作目录避免污染当前路径 mkdir -p /tmp/docker-rpm-install cd /tmp/docker-rpm-install # 解压 tar 包注意不是 .tar.gz是纯 tar tar -xf ~/Downloads/docker.rpm.tar # 列出所有 RPM按名称排序并提取关键字段包名、版本、架构 for rpm in *.rpm; do rpm -qpi $rpm 2/dev/null | \ awk -F: /^Name:/ {name$2} /^Version:/ {ver$2} /^Architecture:/ {arch$2} END {printf %-30s %s-%s.%s\n, name, name, ver, arch} done | sort提示输出应类似containerd.io containerd.io-1.6.32-3.1.el7.x86_64 docker-ce docker-ce-24.0.7-1.el7.x86_64 docker-ce-cli docker-ce-cli-24.0.7-1.el7.x86_64 docker-ce-rootless-extras docker-ce-rootless-extras-24.0.7-1.el7.x86_64 docker-scan-plugin docker-scan-plugin-0.27.0-1.el7.x86_64重点核对三点所有包Name前缀是否统一为docker-ce*或containerd.io排除混入docker-engine等旧分支docker-ce与docker-ce-cli的主版本号如24.0.7是否完全一致必须一致否则docker命令调用dockerd会报client version mismatch架构是否为x86_64CentOS 7 默认或aarch64ARM 服务器与你的系统uname -m输出严格匹配。2.2 校验目标系统基础环境OS 版本、内核、cgroup离线安装最怕「包能装上服务起不来」。先执行三行命令锁死底线# 1. 确认 OS 是 CentOS 7非 CentOS 8因 el7 与 el8 RPM 不兼容 cat /etc/centos-release # 应输出类似 CentOS Linux release 7.9.2009 (Core) # 2. 确认内核 ≥ 3.10Docker 最低要求且启用 overlay2推荐存储驱动 uname -r # 如 3.10.0-1160.el7.x86_64 ✅ grep -i overlay /proc/filesystems # 应有 nodev overlay 行 ✅ # 3. 确认 systemd 版本 ≥ 219CentOS 7.9 自带 2197.2 是 2197.0 是 208 ❌ systemctl --version | head -1 # 输出 systemd 219 或更高 ✅参数说明overlay2是 Docker 官方推荐的存储驱动比devicemapper更稳定、性能更好。若grep无输出需升级内核或重装系统CentOS 7.6 默认启用systemd 219是dockerd使用--containerd参数连接外部 containerd 的最低门槛低于此版本会报unknown service type错误若系统是 CentOS 7.0–7.5强烈建议先yum update kernel* systemd升级到 7.9 再操作否则后续 90% 概率失败。2.3 检查现有 Docker 是否残留防止冲突很多机器之前用curl get.docker.com装过或手动编译过残留配置会干扰 RPM 安装# 查看是否已安装任何 docker 相关包 rpm -qa | grep -E docker|containerd|runc # 查看 docker 相关进程和服务状态 ps aux | grep -E (dockerd|containerd) | grep -v grep systemctl list-unit-files | grep docker # 清理仅当确认要全新安装时执行 sudo systemctl stop docker docker.socket containerd sudo systemctl disable docker docker.socket containerd sudo rpm -e $(rpm -qa | grep -E docker|containerd|runc) --nodeps 2/dev/null || true sudo rm -rf /var/lib/docker /var/run/docker.sock /etc/docker逻辑说明--nodeps是必须的因为离线 RPM 包里docker-ce依赖containerd.io而rpm -e默认会检查依赖关系导致卸载失败。我们宁可清空再装也不留半残配置。3. RPM 安装顺序与依赖解析为什么不能rpm -ivh *.rpm3.1 必须按依赖拓扑顺序安装非字母序RPM 包之间存在强依赖docker-ce→docker-ce-cli→containerd.io→runc。若顺序错rpm -ivh会直接报Failed dependencies并退出。正确顺序如下按rpm -qpR实际解析安装顺序RPM 包名示例依赖说明1containerd.io-1.6.32-3.1.el7.x86_64.rpm提供containerd二进制及 socket被docker-ce调用2runc-1.1.12-1.el7.x86_64.rpmcontainerd.io的底层运行时必须先于 containerd3docker-ce-cli-24.0.7-1.el7.x86_64.rpmdocker命令行工具依赖containerd.io4docker-ce-24.0.7-1.el7.x86_64.rpmdockerd主服务依赖docker-ce-cli和containerd.io5docker-ce-rootless-extras-24.0.7-1.el7.x86_64.rpm可选仅当需 rootless 模式时安装为什么 runc 在 containerd 之前containerd.ioRPM 的Requires: runc是硬依赖rpm -ivh会校验。虽然runc本身无外部依赖但若后装containerd.io安装会失败。这是 RPM 数据库的原子性要求。3.2 逐个安装并验证签名防篡改使用rpm -ivh --force --nodeps是危险操作会跳过依赖检查导致运行时崩溃。正确做法是分步安装 强制依赖校验# 步骤 1安装 containerd.io它依赖 runc所以先装 runc sudo rpm -ivh runc-1.1.12-1.el7.x86_64.rpm sudo rpm -ivh containerd.io-1.6.32-3.1.el7.x86_64.rpm # 步骤 2安装 CLI 工具它不依赖 docker-ce但依赖 containerd.io sudo rpm -ivh docker-ce-cli-24.0.7-1.el7.x86_64.rpm # 步骤 3安装主服务它依赖前两者 sudo rpm -ivh docker-ce-24.0.7-1.el7.x86_64.rpm # 步骤 4验证所有包是否注册进 RPM 数据库 rpm -qa | grep -E docker|containerd|runc | sort # 应输出全部 4 个包名不含 .rpm 后缀参数说明rpm -ivh中iinstall,vverbose,hhash显示安装进度条不加--force或--nodeps若某步报Failed dependencies: xxx is needed by yyy说明你漏装了前置包回退一步检查--force仅在极特殊场景如覆盖旧配置文件使用此处严禁。3.3 验证 RPM 安装后文件落地位置安装完成后关键二进制和配置路径必须存在这是后续启动的基础# 检查二进制是否存在且可执行 ls -l /usr/bin/docker /usr/bin/dockerd /usr/bin/containerd /usr/bin/runc # 应全为 -rwxr-xr-x 权限大小 10MBdockerd 通常 40MB # 检查 systemd 服务文件是否生成 ls -l /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/containerd.service # 应存在且 docker.service 中 ExecStart 指向 /usr/bin/dockerd # 检查默认配置目录 ls -l /etc/docker/daemon.json # 可能不存在首次安装但目录必须存在 sudo mkdir -p /etc/docker逻辑说明/usr/bin/dockerd是 Docker Engine 主进程docker.service就是它的 systemd 封装/usr/lib/systemd/system/docker.service是 RPM 包自带的服务定义不要手动创建否则版本不匹配daemon.json是可选配置文件首次安装为空我们稍后会写入生产级配置。4. 配置与启动从dockerd启动失败到docker info成功4.1 编辑/etc/docker/daemon.json生产环境必备默认配置不启用overlay2、不设镜像加速、不限制资源线上必改。创建安全、稳定的配置{ storage-driver: overlay2, storage-opts: [overlay2.override_kernel_checktrue], log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, live-restore: true, default-ulimits: { nofile: { Name: nofile, Hard: 65536, Soft: 65536 } } }参数说明storage-driver: overlay2强制使用 overlay2避免 fallback 到 devicemapper后者在 CentOS 7 上易出 inode 耗尽overlay2.override_kernel_checktrue绕过内核版本检查CentOS 7.9 内核 3.10 支持 overlay2但 Docker 有时误判live-restore: true允许 Docker daemon 重启时容器不停机高可用必需default-ulimits提升单容器文件描述符上限防Too many open files错误。保存后重载 systemd 配置sudo systemctl daemon-reload4.2 启动 containerdDocker 的底层守护进程dockerd启动前必须确保containerd已运行否则报connection refused# 启动并设开机自启 sudo systemctl enable containerd sudo systemctl start containerd # 验证状态必须 active (running) sudo systemctl status containerd --no-pager -l | head -10 # 关键行Active: active (running) ✅ # 检查 containerd socket 是否监听 sudo ss -tuln | grep :0 # 应看到 u_str 类型的 /run/containerd/containerd.sock注意containerd是独立守护进程不是dockerd的子进程。dockerd通过 Unix socket/run/containerd/containerd.sock与之通信。若 socket 不存在dockerd启动必败。4.3 启动 dockerd 并排查典型失败现在启动主服务sudo systemctl enable docker sudo systemctl start docker如果失败按此顺序排查# 1. 查看最近 20 行日志最直接 sudo journalctl -u docker -n 20 --no-pager # 2. 若日志显示 failed to load listeners: no sockets found检查 selinux sudo sestatus # 若为 enforcing临时设 permissive 测试 sudo setenforce 0 sudo systemctl start docker # 成功则需调整 selinux 策略 # 3. 若日志含 graphdriver failed检查 overlay2 内核支持 sudo modprobe overlay echo $? # 应为 0 lsmod | grep overlay # 应有输出 # 4. 若报 port already allocated检查 2375/2376 端口占用 sudo ss -tuln | grep :237[56]逻辑说明journalctl -u docker是第一排查入口90% 问题在此暴露SELinux 是 CentOS 7 离线环境最大黑匣子setenforce 0是快速验证手段生产环境需用semanage port -a -t docker_port_t -p tcp 2375永久放行modprobe overlay是加载内核模块若失败需确认内核是否支持zcat /proc/config.gz | grep OVERLAY_FS。5. 避坑指南5 个真实踩过的坑与后悔药5.1 现象systemctl start docker无响应journalctl显示dockerd: command not found原因docker-ceRPM 安装时/usr/bin/dockerd文件权限被错误设置为600只读而非755。这是某些定制 RPM 打包脚本的 bug。解决sudo chmod 755 /usr/bin/dockerd sudo systemctl start docker5.2 现象docker info报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?原因docker.service文件中ExecStart指向了/usr/bin/dockerd-current旧版路径但 RPM 安装的是/usr/bin/dockerd。解决# 编辑服务文件修正路径 sudo sed -i s|/usr/bin/dockerd-current|/usr/bin/dockerd|g /usr/lib/systemd/system/docker.service sudo systemctl daemon-reload sudo systemctl restart docker5.3 现象docker run hello-world拉取镜像超时journalctl显示Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection原因离线环境未配置镜像仓库registry mirror且dockerd默认直连registry-1.docker.io不可达。解决在/etc/docker/daemon.json中添加 registry mirrors需内网已有 Harbor 或 Nexusregistry-mirrors: [https://your-mirror.internal:5000]然后sudo systemctl restart docker。5.4 现象docker ps返回空但docker info正常journalctl有levelerror msgfailed to mount overlay,upperdirnot exist原因/var/lib/docker/overlay2目录属主不是root:root或磁盘空间不足df -h /var/lib/docker 1GB。解决sudo chown -R root:root /var/lib/docker sudo systemctl restart docker # 若磁盘不足清理旧镜像docker system prune -a -f5.5 现象docker version显示 client 24.0.7server 20.10.24报client version mismatch原因docker-ce-cli和docker-ceRPM 版本号不一致如 tar 包混入不同版本。解决# 卸载全部重新按顺序安装同版本包 sudo rpm -e docker-ce docker-ce-cli containerd.io runc --nodeps # 严格按 24.0.7 全套重装从 tar 包中精确筛选 sudo rpm -ivh runc-1.1.12-1.el7.x86_64.rpm \ containerd.io-1.6.32-3.1.el7.x86_64.rpm \ docker-ce-cli-24.0.7-1.el7.x86_64.rpm \ docker-ce-24.0.7-1.el7.x86_64.rpm6. 验证与压测从hello-world到 100 容器并发启动6.1 基础功能验证5 步走完执行以下命令每步成功才算真正装通# 1. 检查 daemon 是否健康 sudo systemctl is-active docker # 应输出 active # 2. 检查 client/server 版本一致 docker version --format {{.Server.Version}} {{.Client.Version}} # 应输出 24.0.7 24.0.7 # 3. 拉取并运行最小镜像不联网用本地缓存 docker run --rm hello-world # 输出 Hello from Docker! ✅ # 4. 检查存储驱动 docker info | grep Storage Driver # 应输出 Storage Driver: overlay2 # 5. 检查网络模式 docker network ls | grep bridge # 应有 bridge 网络状态 local技巧docker run --rm hello-world是黄金验证命令。它不依赖外网镜像内置不写磁盘--rm自动清理5 秒内完成。失败即代表核心链路断裂。6.2 生产级压力验证模拟真实负载光跑通hello-world不够。我一般会用以下脚本验证高并发稳定性#!/bin/bash # save as /tmp/docker-stress.sh echo Starting 100 nginx containers... for i in $(seq 1 100); do docker run -d --name stress-$i -p $((8080i)):80 nginx:alpine /dev/null 21 done wait echo Waiting 30s for containers to stabilize... sleep 30 # 统计运行中容器数 RUNNING$(docker ps --filter statusrunning --format {{.Names}} | wc -l) echo Running containers: $RUNNING / 100 # 检查是否有崩溃 CRASHED$(docker ps --filter statusexited --format {{.Names}} | wc -l) if [ $CRASHED -gt 0 ]; then echo ⚠️ $CRASHED containers crashed! docker ps --filter statusexited --format ID: {{.ID}} Name: {{.Names}} fi # 清理 docker rm -f $(docker ps -aq) /dev/null执行与观察chmod x /tmp/docker-stress.sh sudo /tmp/docker-stress.sh正常应输出Running containers: 100 / 100若CRASHED 0大概率是overlay2inode 耗尽或内存不足dmesg | grep -i out of memory此脚本模拟了真实业务中批量启停容器的场景比单容器验证更可靠。6.3 长期运行监控项上线前必查装完不是终点以下是上线前我必盯的 4 个指标监控项检查命令合格标准不合格后果Docker daemon 内存占用ps aux --sort-%memgrep dockerdhead -1overlay2 inode 使用率df -i /var/lib/docker/overlay2Used% 85%新建容器失败报no space left on devicecontainerd socket 响应sudo timeout 5 ctr -n moby containers list /dev/null echo OK输出OKdockerd无法调度容器Docker 日志轮转ls -lh /var/log/docker.log*最大单个 10MB总数 ≤ 3日志撑爆磁盘我的习惯从那以后我每次部署docker.rpm.tar都强制走一遍这 4 项检查再发给 QA。哪怕多花 3 分钟也比半夜被 call 起来救火强。希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑