尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

离线环境用docker.rpm.tar包安装Docker的完整实操指南

发布时间:2026/9/29 19:36:12

资讯中心
01
ARTICLE

离线环境用docker.rpm.tar包安装Docker的完整实操指南

离线环境用docker.rpm.tar包安装Docker的完整实操指南
简介内网或离线环境下安装Docker时yum源不可达、依赖包缺失是常见难题这套专为CentOS 7准备的docker.rpm.tar软件包能够直接消除这些阻碍。整个压缩包共16个文件大小19.27MB其中9个rpm文件包含了docker主程序、docker-client、docker-common等核心组件也提供container-selinux、oci-systemd-hook、oci-register-machine等必要依赖并且所有rpm均基于el7.centos构建与CentOS 7环境兼容良好。其余3个gz、3个bz2和1个xml文件构成repodata仓库元数据用于本地yum源对软件包的索引、校验与更新确保离线安装时依赖关系能被正确解析。资源适合有一定Linux基础、需要在服务器上快速部署或批量复制Docker环境的运维人员也适合教学实验场景中的演示与练习。解压后即可作为本地yum源的基础数据无需逐一下载依赖即可完成安装能有效节省时间并降低部署中断概率目前已有379人学习下载值得作为CentOS离线安装Docker的常用素材收藏备用。1. docker.rpm.tar 软件包是什么离线装 Docker 的现实答案你在没有外网的服务器上yum install docker多半会卡在“无法定位软件包”这行字上更麻烦的是内网机器全部没配软件源连 rpm 依赖都拉不回来。这时候运维手里递过来一个docker.rpm.tar包就是全部家当——把一套已经整理好的 docker 安装文件包含 docker-ce 主程序、containerd、runc 等 rpm 安装包打进 tar 压缩包离线环境里用它就能完成部署。这个方案解决的问题一句话讲清没有互联网没有 yum 源能不能装 Docker能只要你手里有这个 tar 包。适合的读者很明确刚接手内网环境的新手、做离线交付的集成工程师、以及需要在客户机房冷启动 Docker 的驻场运维。接下来我按实际操作顺序拆开说。2. 先看懂 docker.rpm.tar 的内部结构两种常见形态与核对命令2.1 解压前先摸清压缩格式拿到文件第一步不是tar -zxvf而是先确认压缩格式。常见docker.rpm.tar实际有三种情况纯 tar 打包、gzip 压缩的 tar.gz、以及 xz 压缩的 tar.xz。格式判断用一眼命令file docker.rpm.tar # 输出示例: gzip compressed data, was docker.rpm.tar, last modified: ... # 或: POSIX tar archive这里教一个实用习惯tar -zxvf是经典写法但-z参数只适用于 gzip。遇到 xz 压缩包就得换成tar -xf。我一般偷懒用tar -xf一把梭GNU tar 会自动识别压缩格式省掉判断环节mkdir /opt/docker-offline tar -xf docker.rpm.tar -C /opt/docker-offline ls /opt/docker-offline参数说明-C指定解压目标目录防止直接解到当前目录搞乱文件层级。解压后先别急着装看到目录里是散落的.rpm文件还是嵌套了一个 rpm 子目录这决定了后续安装命令写法。2.2 两种常见包形态安装策略完全不同我在项目里见到过的 docker 离线包结构基本是两种形态 A纯 rpm 目录。目录下一堆docker-ce-*.rpm、docker-ce-cli-*.rpm、containerd.io-*.rpm、docker-compose-plugin-*.rpm外加一些依赖如container-selinux、fuse-overlayfs等。这种包来源通常是官方 yum 源上yumdownloader或createrepo抓下来的所有依赖已经收齐。安装策略直接用 rpm 或本地 yum 源不需要联网。形态 Brpm 目录 镜像 脚本。除了 rpm 文件还有docker-images.tar.gz保存的容器镜像、install.sh、docker.service等额外内容。这种包考虑得更远装完 docker 引擎还要docker load把离线镜像导入甚至脚本里写好了 systemd 配置。你的部署节奏就要跟着它的脚本走。核心区别在依赖链是否完整。形态 A 装到一半报Requires: xxx缺依赖是家常便饭形态 B 有时又过度集成镜像是别人环境的tag 跟你预期不一致。2.3 安装前必须做的三个核对命令安装前我会固定跑三个命令把家族病史先查清楚# 1. 看当前机器有没有装过 docker 相关旧包 rpm -qa | grep -E docker|containerd|podman # 2. 看 rpm 包的基本信息确认版本和来源 rpm -qpi /opt/docker-offline/docker-ce-*.rpm | head -20 # 3. 如果是形态 A检查依赖是否齐全 rpm -qpR /opt/docker-offline/docker-ce-*.rpm | grep -E docker|containerd|runc核心参数说明-q是查询-p指定针对 rpm 文件操作而不是系统已装包-i看信息-R看依赖。为什么-R输出要 grep 一把因为依赖列表里还有libc.so.6这种系统库那是 glibc 负责的事你只要关心 docker 相关的组件是否互相匹配就够。如果输出里的依赖项在目录中都能找到对应 rpm说明这包基本完整。注意版本匹配是离线装 Docker 的核心玄学点。CentOS 7 配 docker 20.10 是成熟组合配 docker 24 就要额外注意内核版本内核 3.10 装新版 docker 会出现各种 cgroup 报错。装前先uname -r看一眼比装完再排错省一小时。3. 离线安装 docker.rpm.tar 的完整操作rpm 到 systemd 的全程步骤3.1 为什么我推荐用本地 yum 源而不是裸 rpm 安装直接用rpm -ivh *.rpm是最容易翻车的做法——rpm 对依赖顺序极其敏感docker-ce 报缺 containerd.io、containerd.io 又报缺别的依赖一个循环下来你就要手动按依赖倒序逐个装这是新手必经之路但真没必要。更稳的做法是利用 yum 的本地安装特性它会把目录里的 rpm 当源自动解析依赖顺序cd /opt/docker-offline # 若目录内已经存在 repodata 子目录 yum install -y ./docker-ce-*.rpm ./docker-ce-cli-*.rpm ./containerd.io-*.rpm # 若没有 repodata可以用 createrepo 生成本地源 createrepo . yum install -y docker-ce docker-ce-cli containerd.io --disablerepo* --enablerepolocal两个命令的逻辑不一样第一条是 yum 直接安装本地文件适合依赖简单的情况第二条是先把当前目录变成 yum 仓库然后按包名安装。我习惯用第二条尤其当 rpm 数量超过 10 个时——--disablerepo*强制所有远程仓库失效--enablerepolocal指定只从本地源找包从机制上保证了离线。参数注意-y就是免确认跳过交互。如果报错说找不到createrepo命令说明机器上没装这个工具退回到第一条命令即可。3.2 万一 yum 不行rpm 手动分步安装的兜底写法本地 yum 源也不是总能顺利跑通。有些裁剪过的系统把 yum 的本地源逻辑阉割了报错信息乱七八糟。此时兜底方案是把 rpm 包按依赖顺序手动分步装一张表记住安装顺序顺序包名说明1container-selinux 等基础依赖提供 SELinux 策略缺它 docker 起不来2containerd.io容器运行时docker 依赖它3docker-ce-cli命令行工具可以比 docker-ce 先装4docker-ce主程序放最后装成功率最高每一步用一条命令失败就停下来看缺什么rpm -ivh container-selinux-*.rpm rpm -ivh containerd.io-*.rpm rpm -ivh docker-ce-cli-*.rpm rpm -ivh docker-ce-*.rpm参数要说明一个坑命令中的-ivh表示安装、显示详细信息、显示进度条。遇到报错千万别急着加--nodeps跳过依赖检查——那相当于吃后悔药docker 引擎缺了关键依赖即使装上也会在docker run时莫名崩溃而且报错位置在四层深的地方排错成本远比你现在解决依赖高。3.3 安装完成后注册 systemd 服务并让 docker 开机自启rpm 安装完毕后 docker 的二进制已经就位但服务还没被 systemd 接管。这一步经常有人漏掉导致重启后 docker 命令找不到或者服务不存在# 重新加载 systemd 配置识别新安装的 docker.service systemctl daemon-reload # 设置开机自启并立即启动 systemctl enable --now docker # 验证服务状态 systemctl status docker --no-pager如果systemctl enable --now docker报错说 unit 文件不存在先检查/etc/systemd/system/和/usr/lib/systemd/system/目录下有没有docker.service。没有就说明 rpm 包不完整或者这是二进制的离线包不是 rpm 方式装的那就需要用dockerd手动启动这属于另一种部署法。检查安装后的版本与运行环境docker version # Client 和 Server 两段都输出才算完 # Server 段报 Cannot connect 说明服务没起来 docker info | grep -E Cgroup|Storage参数释义docker version是部署后的第一道体检Client 是 CLIServer 是守护进程只有两段同时在线才说明离线安装真正成功。docker info里的 Cgroup 和 Storage 驱动需要记下来——默认是 cgroupfs 和 overlay2如果你机器上是老内核变成 vfs后面跑容器性能会很难看。3.4 离线环境里常见的两个附加组件处理离线包一般还带docker-compose-plugin或docker-compose的 rpm。安装它的原因在于后续你要在离线环境跑docker run还好但跑复杂的中间件如 redis 主从、mysql8.0 主从集群时没有 compose 文件辅助命令行会长到没法维护。安装它与 docker-ce 同样处理rpm -ivh docker-compose-plugin-*.rpm # 新版 docker 的 compose 是插件机制 # 验证插件生效 docker compose version另一种常见形态是老式独立二进制解压出来放/usr/local/bin下赋可执行权限即可。docker compose version能正常输出版本号说明配置链路是通的。4. 离线 Docker 装好没网络之后怎么办镜像源、本地仓库与导入4.1 内网不可能完全没用先给 daemon.json 写上 registry 指向离线机器装上 docker 只是第一步宕机的是拉镜像的链路。很多内网环境有局域网镜像仓库registry、harbor 之类但没有配置进 docker 里。改/etc/docker/daemon.json这个文件是全局配置的入口{ registry-mirrors: [https://registry.example.internal], insecure-registries: [10.0.0.8:5000], data-root: /data/docker, log-opts: { max-size: 20m, max-file: 3 } }参数各自的作用registry-mirrors是拉官方镜像时的镜像加速地址内网环境填自己的镜像站insecure-registries是针对那些不开 TLS 的局域网 registry 必须加的不加会报certificate signed by unknown authority>systemctl restart docker docker info | grep -A 5 Registry Mirrors4.2 没条件配 registry用种子机打镜像包导入内网如果连局域网 registry 都没有常见的做法是找一台“种子机”——它处于能拉镜像的环境在它上面拉好需要的镜像导出打包再拿到离线机器导入# 在种子机上执行把 redis 和 mysql 镜像打包 docker pull redis:7.0 docker pull mysql:8.0 docker save -o offline-images.tar redis:7.0 mysql:8.0 # 压缩后传到内网机器再在离线机器上导入 gzip -k offline-images.tar离线机器上再做反向操作# 如果传的是 .tar.gz先解压 gunzip -k offline-images.tar.gz # 导入镜像-i 指定输入文件 docker load -i offline-images.tar # 验证 docker images | grep -E redis|mysqldocker save和docker load是打包镜像的标准对子。注意两点一是docker load只能识别标准 tar如果你用tar -zxvf把镜像 tar 先解压成散层再 load大概率报错二是docker save时多个镜像可以打在一个 tar 里docker load会自动分批导入不用拆开。整个流程熟练了十分钟能跑完这是离线 docker 部署里最值的十分钟。4.3 网络不通时先查这些docker0、iptables 与内核转发装完 docker 最常见的问题之一是“容器网络不通”。离线环境尤其突出因为 iptables 规则可能是别人清理过的。遇到容器内ping不通外网或跨容器不通先按这个顺序排查# 1. 看 docker0 网桥是否存在IP 是否正常 ip addr show docker0 # 2. 看内核是否开启 IP 转发 sysctl net.ipv4.ip_forward # 返回 0 表示关闭必须改成 1 # 3. 看 iptables 的 FORWARD 链是否被拒绝 iptables -L FORWARD -n | head -20第三点是最常被忽略的坑云主机或某些安全加固系统默认 FORWARD 链策略是 DROP容器发出的包在 FORWARD 就被丢了。net.ipv4.ip_forward没开启时docker 跨主机通信直接熄火连宿主机与容器之间的访问都受影响# 临时开启转发重启后失效 sysctl -w net.ipv4.ip_forward1 # 永久写入配置 echo net.ipv4.ip_forward 1 /etc/sysctl.conf sysctl -p提示如果改完 sysctl 还是不通检查/etc/docker/daemon.json里是不是设置了iptables: false。关闭 iptables 管理后 docker 不会自动建 NAT 规则容器外网访问就全断了。这个参数一般不开开了就得手动维护规则。5. Docker 离线环境常见问题避坑五次踩坑记录与修复5.1 装了新版 docker 一运行就报 cgroup 相关错误现象systemctl start docker成功但docker run hello-world报failed to start container: cgroups: cgroup mountpoint does not exist。原因CentOS 7 之类老系统默认挂载的 cgroup 是 v1新版 docker 或新内核默认期望 cgroup v2。rpm 包版本与系统内核太新或太旧都会出现 cgroup 不匹配。解决先确认系统 cgroup 版本stat -fc %T /sys/fs/cgroup输出tmpfs是 v1输出cgroup2fs是 v2。如果机器是 v1 而 docker 版本很高换回与系统匹配的 docker 版本这个最干脆。另一个变通是改/etc/docker/daemon.json加exec-opts: [native.cgroupdriversystemd]配合 systemd 接管但老内核上这招不一定管用。我的建议是离线环境别追新内核和 docker 版本内核 3.10 配 docker 20.10 最稳。5.2 rpm 安装报file /usr/bin/docker already exists现象rpm -ivh docker-ce-*.rpm提示文件冲突安装退出。原因机器上已经装了老版本的 docker 二进制可能是podman-docker或docker-io这类兼容包占用了/usr/bin/docker路径。解决不要--replacefiles硬装卸载旧包再装# 找出是谁占用了 docker 命令 rpm -qf /usr/bin/docker # 卸载占用包 rpm -e --nodeps 包名 # 再装离线包rpm -Uvh 可直接覆盖同版本升级 rpm -Uvh docker-ce-*.rpm docker-ce-cli-*.rpm-U是升级安装对于已存在低版本或同版本的情况比-i更友好-e是卸载。--nodeps只在卸载时用且是针对旧包别加到安装命令上。5.3 离线加了insecure-registries后 docker 启动失败现象修改/etc/docker/daemon.json后systemctl restart docker失败systemctl status docker报Failed to start Docker Application Container Engine。原因daemon.json格式错误或者填写了无法解析的镜像站地址。这是小毛病但很隐蔽。解决用dockerd --debug前台启动看输出# 先停掉 systemd 管理的 docker再前台调试启动日志直接打到终端 systemctl stop docker dockerd --debug看到是 JSON 解析问题就检查逗号、引号是否成对看到 DNS 解析失败就检查 registry 地址是否能通。我遇到过把insecure-registries配成http://10.0.0.8:5000带了协议头的docker 不认去掉协议头只留 IP 和端口就好。修复后回到前台模式 CtrlC 停掉再systemctl start docker。5.4rpm -ivh *.rpm全部安装但docker version的 Server 段死活连不上现象所有 rpm 都装完docker version的 Client 段正常Server 段报Cannot connect to the Docker daemon at unix:///var/run/docker.sock。原因最常见的是安装完成后没有systemctl start docker其次是被防火墙或 SELinux 挡住了 socket 或进程权限。离线 rpm 里的container-selinux没装上也会导致 dockerd 启动失败。解决分三步查先看服务状态再看日志最后看 SELinuxsystemctl start docker journalctl -u docker --no-pager | tail -50 getenforce # 返回 Enforcing 时先改成 Permissive 试一次 # setenforce 0 就是临时关闭改回 Enforcing 前要确认是 selinux 策略问题日志里如果出现Permission denied而 getenforce 是Enforcing基本实锤 SELinux 拦截。临时setenforce 0能起服务就去查 docker 的 selinux 模块是否装了rpm -qa | grep selinux。像形态 A 缺了container-selinux要先补上再systemctl start docker。5.5 离线镜像导入后 docker images 看不到load 成功但 tag 对不上现象docker load -i offline-images.tar输出Loaded image但docker images列表里找不到对应镜像。原因不是丢镜像是docker save时镜像的 repository 与 tag 带的是种子机上的全名比如docker.old.internal/library/redis:7.0或者仓库名很长docker images默认宽度显示不全容易看漏。另一个坑是导入时报no space left on device镜像已经写入但元数据没更新成功。解决两种处理# 用 --digests 和 --no-trunc 看完整信息 docker images --no-trunc --digests | grep redis # 导入完成后主动打 tag改成当前环境用得到的名字 docker tag docker.old.internal/library/redis:7.0 redis:7.0 docker rmi docker.old.internal/library/redis:7.0 # 可删可不删看空间--no-trunc是肉眼看全 IMAGE ID 和 tag 的利器--digests能把摘要也打出来方便与种子机核对是否同一份镜像。磁盘不够那个情况docker system df看空间占用清理/var/lib/docker下没用的层数据。6. 离线 Docker 环境从装到跑的复查流程一个值得花五分钟养成的习惯离线部署最容易出的问题就是“装的时候很顺利跑的时候崩了”。我不建议装完直接交付而是固定跑一套复查流程成本五分钟但能省掉后续大半夜的排障时间。这套流程我自己习惯按下面的顺序走第一步查服务与开机自启状态。systemctl is-enabled docker如果输出enabled说明自启没问题systemctl is-active docker输出active说明服务是活着的。第二步查配置是否全部生效重点看docker info的输出里Cgroup Driver、Storage Driver、Docker Root Dir三个值是否和你预期一致。第三步验证网络连通性docker run --rm -it alpine ping 8.8.8.8这种命令在离线环境跑不通很正常——镜像没有所以这一步改成验证docker network ls能看到默认的 bridge、host 网络。第四步排网拿本地已有镜像启动一个容器再退出看容器生命周期是否正常。这些步骤都过了就可以认为离线 docker 可以安全交付了# 一条命令看全核心检查项 systemctl is-active docker systemctl is-enabled docker docker info | grep -E Cgroup Driver|Storage Driver|Docker Root Dir离线环境还有一个值得投入的方向是做内网自建镜像仓库。如果你们的离线机器不止一台靠docker save、docker load来回拷镜像包随着镜像增多会变成一场灾难。常见做法是在内网搭一个 registry在种子机上安装 registry 容器、docker push镜像进去、离线机器上改好daemon.json后直接docker pull。这个方向初始投入约半小时但后续每新增一台机器都省一次拷包的人工操作是离线 docker 部署中最划算的长期投资之一。我自己刚转运维那会也拿了个离线 docker 包在测试机上折腾过愣是因为 cgroup 和 selinux 两个问题搞到深夜后来才总结出先核对版本和 sysctl 的习惯。这套流程写出来希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。