简介:面向CentOS 7系统的Docker离线安装RPM包集合,专为无法访问外网的内网服务器或需要批量交付Docker环境的运维场景准备。资源完整收录Docker 1.12.6核心组件及其运行依赖,除docker主程序外,还包含docker-client、container-selinux、oci-systemd-hook等关键RPM包,并附带repodata仓库元数据以及sqlite/xml索引文件,可直接配置为本地Yum源实现自动安装和依赖解析。压缩包共16个文件,包括9个rpm、3个gz、3个bz2和1个xml,整体仅19.27MB,轻量便携,适合通过内网分发或随运维工具包携带。已有372人学习下载,适合掌握CentOS基础命令、需要快速为隔离环境搭建Docker运行时的部署人员,节省逐一下载依赖的繁琐过程。 先把结论放在前面:这篇文章就是写给那些在无外网、内网隔离环境里被“装Docker”这事折腾过的人看的。十次里有八次,你搜到的是“下载docker.rpm.tar软件包”——但等你真正动手才发现,rpm、tar、docker镜像tar包根本是三种不同的东西,混在一起用,每一步都能踩出花样。这篇我会把离线环境下用rpm包和tar包装Docker的完整链路拆开讲,包含依赖处理、systemd自启配置、镜像离线导入和几个高频翻车场景的排查思路,照着操作基本能一把过。
1. 先搞明白:docker.rpm.tar 这三种形态到底啥关系
1.1 三种包格式的定位
不是有一个叫“docker.rpm.tar软件包”的文件,而是Docker在Linux世界里常见的三种分发形态经常被人混为一谈。我见过不少同事第一次拿到离线安装包时,问的第一句话是“这三个我要装哪个”,其实它们解决的问题完全不一样。
- rpm包是红帽系Linux的标准安装包格式,里面除了二进制文件,还带着软件的元信息、依赖声明、安装/卸载脚本。用
rpm -ivh或者yum localinstall安装,包管理器会接管后续的升级和卸载。CentOS、Rocky Linux、银河麒麟这些基于Red Hat生态的系统,用的都是这套机制。 - tar.gz/tgz压缩包是Docker官方发布的静态编译二进制包,把
docker、dockerd、containerd等所有可执行文件打成一个压缩包,理论上任何Linux发行版解压后都能跑,不依赖系统的包管理器。如果你见过docker-27.3.1.tgz这种文件,就是它。 - 还有一个容易误导人的存在:docker镜像导出的tar包。比如
docker save -o mysql8.tar mysql:8.0生成的tar文件,这是镜像内容的打包,不是安装包。很多人把它和安装包混在一起,拷到内网后一顿操作,发现docker命令还是不存在——因为方向完全错了。
三者的关系用一句话概括:rpm和tar是“装Docker这个软件”的两种方式,而镜像tar是“把Docker镜像搬进内网”的传输格式。先把这个定位理清楚,后面所有步骤才有意义。
1.2 日常选型怎么判断
我自己在项目里的选择逻辑很简单:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 标准CentOS/RHEL 8+,有内网yum源 | rpm包(yum localinstall) | 依赖由包管理器自动解决,后续升级方便 |
| CentOS 7老系统或不想污染系统包管理 | tar静态包 + systemd | 不依赖仓库,拿最新版直接跑,卸载干净 |
| Debian/Ubuntu系 | deb包(dpkg/apt) | 热词里反复出现“没找到rpm命令”,多半就是装错系统类型了 |
| 内网批量交付 | tar包 + 一键脚本 | 一个目录拷进去,执行install.sh即可,几台机器一把梭 |
后面第3、4节会分别展开rpm和tar的完整操作,先按这个选型把路走对。
2. 离线安装前的准备:摸清系统底细与下载渠道
2.1 发行版与架构:装之前先确认两件事
离线环境最怕的就是装到一半才发现包和系统不匹配,所以动手之前要花1分钟把系统的底细摸清楚。需要确认的就两件事:发行版号和CPU架构。
# 查看发行版信息 cat /etc/os-release # 查看红帽系具体版本 cat /etc/redhat-release # 查看CPU架构 uname -m archuname -m的输出是x86_64或aarch64,这个直接决定你下载哪个包。为什么热词里那么多“arm64 rpm安装包”“arm架构升级包”?因为rpm和tar包里的二进制都是针对特定指令集编译的,x86_64的docker包放到aarch64的机器上,大概率直接报Exec format error,连安装这一步都过不去。
如果你手里的是银河麒麟这类国产化系统,先别急着下CentOS的包,cat /etc/os-release看它是兼容哪个发行版的——麒麟V10一般基于CentOS 7或8的生态,文档里会写明,按对应版本去选docker rpm包,兼容性才稳。
2.2 离线安装包的下载渠道
正规渠道就这几个,别乱搜第三方站点,安全和可用性都没保障:
- 官方静态二进制包:
https://download.docker.com/linux/static/stable/,进去之后按架构目录选版本,例如x86_64/docker-27.3.1.tgz。这个目录是官方长期维护的,适合tar包方案。 - docker-ce的rpm仓库:如果目标机器能访问内网镜像源,直接把
https://download.docker.com/linux/centos/$releasever/$basearch/stable配到yum源里安装;如果完全离线,就在公网机器上用yum --downloadonly把rpm包全部拉下来再拷走。 - 国内镜像站:阿里云
mirrors.aliyun.com/docker-ce、华为云mirrors.huaweicloud.com/docker-ce都有完整的docker-ce仓库,速度和访问稳定性比直接从国外拉好很多,尤其适合在有网络但速度慢的环境里预下载。
下载完务必做一次校验,用sha256sum对比官方页面上的checksum。离线环境里包拷错了代价很高,这一个动作能省掉后面所有排查时间。
3. rpm包安装Docker:依赖处理与麒麟ARM实战
3.1 检查环境与“没找到rpm命令”的真相
用rpm方案之前,先确认系统确实带rpm包管理器:
which rpm如果你在终端敲rpm,系统提示“没找到rpm命令”——这不是小事,先别急着怪环境。按顺序排查:
- 确认
/usr/bin/rpm或/bin/rpm存在但PATH没包含,这时which rpm可能无输出,但/usr/bin/rpm --version能运行。 - 确认系统不是Debian/Ubuntu系。很多人在Ubuntu上照着CentOS教程执行,当然找不到rpm。Ubuntu要用的是
dpkg -i和apt-get install -y ./xxx.deb,这就是热词里“ubuntu安装docker”和“没找到rpm命令”同时出现的原因。 - 确认系统没有精简到连rpm都缺。极少数定制版系统会砍掉包管理器,这种环境建议直接放弃rpm方案,改用第4节的tar静态包。
3.2 有离线源与完全离线两种安装路径
rpm安装有两种典型路径,操作差别不大,但依赖处理的逻辑完全不同:
路径一:有内网yum源(或能访问镜像站)
这种最简单,配置好仓库后直接一条命令:
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin这里特别注意:docker-compose-plugin很多人会漏装,导致后面想用docker compose(注意是中间有空格的v2插件)时发现命令不存在。如果项目里要用compose,顺手装上,免得事后补。
路径二:完全离线,只能本地rpm包安装
在联网机器上准备一个下载目录,把docker相关rpm包和所有依赖一起拉下来:
# 在联网的CentOS同版本机器上执行 yum install --downloadonly --downloaddir=./docker-rpm \ docker-ce docker-ce-cli containerd.io docker-compose-plugin然后把这个目录整个拷进内网机器,执行安装:
# 推荐用 localinstall,会自动解析目录内的本地依赖 yum localinstall -y ./docker-rpm/*.rpm # 或者传统一点的方式,同样可以解决部分依赖顺序问题 rpm -Uvh ./docker-rpm/*.rpm这里说下为什么我更推荐yum localinstall *.rpm而不是直接rpm -ivh:rpm命令本身不会去解析依赖,一遇到缺失就抛错,而yum localinstall会把本地路径下的rpm包当成软件源,自动判断依赖关系并处理安装顺序。热词里那些“依赖报错”的问题,一半是少下了依赖包,另一半就是顺手用了rpm -ivh没给yum参与的机会。
3.3 麒麟ARM架构的rpm安装实践
国产化环境我实际装过,情况比较特殊:银河麒麟系统基于Red Hat生态,包管理是rpm/yum,这一点和CentOS一致,但它默认的软件源里通常没有docker-ce。我的做法是:
- 先确认麒麟版本对应的CentOS兼容版本,
cat /etc/redhat-release通常会写明“兼容CentOS 7”或“兼容CentOS 8”。 - 到华为云镜像站(
mirrors.huaweicloud.com/docker-ce)找对应的aarch64目录,下载docker-ce、docker-ce-cli、containerd.io这几个核心rpm包,以及它们的全部依赖。 - 离线环境里用
yum localinstall安装。唯一要小心的是替换$releasever时别用机器上实际的麒麟版本号,而是用它的兼容CentOS版本号,否则yum可能在依赖解析时找不到对应路径。
装完用docker --version验证,能输出版本号就把服务拉起来:
systemctl enable docker --now systemctl status docker --no-pager4. tar包安装Docker:解压即用与systemd自启
4.1 为什么推荐tar静态包方案
越来越多人离线装Docker时首选tar包,原因很纯粹:不依赖包管理器,不会污染系统,升级就像换文件一样简单。
特别是CentOS 7这种老系统,yum源里的docker版本老掉牙,完全离线又补不了依赖,而官方静态包把docker、dockerd、containerd、runc、docker-init这些组件一股脑编译好了,拷贝出来就能跑。你可能已经发现了,热词里“linux服务器tar压缩一整个文件夹”“tar -zxvf”“tar -zcvf”这些搜索量高的词,恰恰说明很多人正在跟tar包打交道——不只是装Docker,打包分发也是同样的思路。
4.2 从解压到开机自启的完整操作
这里我按可复现的步骤写,照着执行就行。
第一步:解压静态包
tar -zxvf docker-27.3.1.tgz解压后得到一个docker目录,里面是全部可执行文件。建议先看一眼目录结构:
ls -l docker/如果你拿到的是docker-27.3.1.tgz,文件名里带版本号很正常。多数教程会直接用tar -zxvf解压,这个命令等价于tar -xzf,z表示用gzip解压。
第二步:拷贝二进制到系统路径
cp docker/* /usr/local/bin/放在/usr/local/bin而不是/usr/bin的好处是:系统自带的工具和Docker官方二进制隔离,升级/卸载时不会被其他软件误覆盖。如果你只有root权限、没有sudo,注意路径权限。
第三步:配置systemd服务
直接解压在终端运行dockerd也能启动,但那样Ctrl+C就没了,重启也不自启。正确做法是把Docker交给systemd托管。创建/etc/systemd/system/docker.service:
[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service containerd.service Wants=network-online.target Requires=docker.socket [Service] Type=notify ExecStart=/usr/local/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process OOMScoreAdjust=-500 [Install] WantedBy=multi-user.target再创建/etc/systemd/system/docker.socket:
[Unit] Description=Docker Socket for the API [Socket] ListenStream=/var/run/docker.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target第四步:加载服务并启动
systemctl daemon-reload systemctl enable docker.socket docker.service --now systemctl status docker --no-pager这里有个关键点:docker.service里写了Requires=docker.socket,所以socket文件必须一并创建,否则服务起不来或报找不到sock文件。-H fd://表示docukerd从systemd的socket fd接收客户端连接,这个参数和docker.socket是一对。
启动完成后,可以用docker info确认所有组件正常。如果一切正常,Docker已经能用了。
4.3 卸载与升级
tar包方案的卸载极其干净:
systemctl stop docker.socket docker.service rm /usr/local/bin/docker* /usr/local/bin/containerd* /usr/local/bin/ctr /usr/local/bin/runc rm /etc/systemd/system/docker.service /etc/systemd/system/docker.socket systemctl daemon-reload升级更简单:拉新的tgz包,解压覆盖/usr/local/bin下的二进制,重启docker服务即可。完全不用理会rpm/apt那套依赖关系,这也是我在多台离线服务器上批量部署时偏爱tar包的原因。
5. 装完之后的三座山:镜像离线导入、仓库加速与常见翻车
5.1 镜像离线的两种传送方式
软件装好了,但内网机器上docker pull是拉不动镜像的,这时候才进入真正的“搬砖”阶段。最常用的方式是save + load:
# 在能联网的机器上 docker pull mysql:8.0 docker save -o mysql8.tar mysql:8.0 # 更省体积的做法,压缩后传输 docker save mysql:8.0 | gzip > mysql8.tar.gz # 拷到内网机器后 docker load -i mysql8.tar # 或解压流式导入 gunzip -c mysql8.tar.gz | docker load这里必须区分docker save和docker export,两者生成的tar完全不同:
| 命令 | 作用 | 是否包含镜像历史分层 | 导入方式 | 适用场景 |
|---|---|---|---|---|
docker save | 保存镜像 | 包含 | docker load | 镜像离线迁移、备份 |
docker export | 导出容器文件系统 | 不包含,是扁平快照 | docker import | 归档容器当前状态 |
绝大多数离线场景要的是“把镜像从A机器完整搬到B机器”,所以用save,别用export。热词里“registry docker镜像 tar包下载”说的就是这个流程——到registry上把镜像save出来,拿到内网load进去。
5.2 内网registry:把镜像源搬到内网
如果内网机器不止一两台,每次都用docker load挨个传,效率太低。更专业的方案是搭一个内网私有仓库,用Docker自带的方式就能启动:
docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ -v /data/registry:/var/lib/registry \ registry:2然后在其他内网机器上配置/etc/docker/daemon.json,把insecure-registries加进去:
{ "insecure-registries": ["registry.internal:5000"], "registry-mirrors": ["https://your-mirror.example.com"] }之后的操作就变成了标准的推拉流程:联网机器docker tag mysql:8.0 registry.internal:5000/mysql:8.0、docker push;内网机器直接docker pull registry.internal:5000/mysql:8.0。所有机器共享一份镜像,再也不用U盘来回拷了。
5.3 高频翻车:docker daemon起不来的排查顺序
最后这部分是重点。我统计了下离线环境里问得最多的问题,基本集中在启动阶段:
问题一:Cannot connect to the Docker daemon at unix:///var/run/docker.sock
这个报错实际在说一件事:socket文件不存在,dockerd没起来。用systemctl status docker看服务状态,如果显示failed,再用journalctl -u docker -n 50看具体日志。十有八九是配置问题或权限问题。
问题二:服务起不来,日志里有permission denied
优先怀疑selinux。测试环境下先临时关掉验证:
setenforce 0 systemctl restart docker能起来了再去研究selinux规则,起不来看下一项。
问题三:日志里出现overlay2: not supported或文件系统不支持
老内核或特定文件系统对overlay2支持不佳,临时解法是在daemon.json里改存储驱动:
{ "storage-driver": "vfs" }vfs性能差,但能绕过大部分兼容性问题,适合先跑通业务再回头优化。
问题四:tar包解压后文件名乱码
热词里提到“tar文件解压后乱码”,在离线交付时真遇到过。常见原因是文件原先是GBK编码的包,在UTF-8环境下解压导致文件名乱码。处理办法:先file xxx.tar看包内编码,再用convmv -f GBK -t UTF-8转码,或者要求打包方统一UTF-8再发。
再说一个批量部署时的经验:我习惯把docker静态包、rpm包、daemon.json、一个install.sh脚本放在同一个目录,脚本里做三件事——解压、拷贝二进制、写systemd服务并启动。这样无论目标机器是CentOS还是麒麟,一条命令搞定,省去手工操作带来的各种不一致。刚开始离线装Docker时我也是一路踩坑过来的,把上面这些点理顺之后,后面再遇到类似环境基本就是复制粘贴的事。
本文还有配套的精品资源,点击获取