简介这份资源是面向在 CentOS 系统上部署 Docker 的运维与开发人员准备的离线 RPM 安装包集合主要解决内网或无外网环境下无法直接通过 yum 源安装 Docker 的问题。压缩包共包含 16 个文件以 9 个 rpm 安装包为主涵盖 docker、docker-client、docker-common、container-selinux、skopeo-containers、oci-systemd-hook、oci-umount 等核心组件另附 3 个 gz、3 个 bz2 及 1 个 xml 文件用于构建本地 yum 仓库的元数据索引整体约 19.27MB。资源版本为 1.12.6适配 el7.centos 环境适合需要离线批量部署或学习 Docker 底层依赖关系的技术人员。目前已有 381 人学习下载可作为搭建本地 Docker 安装源、排查依赖缺失问题的实用参考帮助读者快速完成环境准备与组件核对。1. docker.rpm.tar 软件包离线环境里把镜像搬进内网的那条路机房没有外网跳板机只开放 SSH业务方催着上线一套 MySQL 8.0 加 Redis 主从。这时候你手里能用的往往就是一个从能上网的机器上导出来的docker.rpm.tar软件包——它可能是 Docker 引擎本身的 rpm 安装包也可能是docker save出来的镜像 tar 包还可能是两者打在一起的一个自解压归档。名字里三个词各管一段docker 是运行时rpm 是安装格式tar 是打包容器。搞不清这三者关系就会出现「解压出来一堆文件却不知道先装哪个」「rpm 装完了 docker 起不来」「镜像 load 进去但容器跑不起来」这类翻车现场。这篇笔记面向的是要在内网、离线、信创或工控环境里落地容器的人运维、交付工程师、做智能网联汽车仿真平台这类需要把整套软件包搬进隔离网络的开发者。我会把 docker.rpm.tar 这类软件包从拆包、装引擎、导镜像到跑通 MySQL/Redis 的完整链路讲清楚参数怎么设、报错怎么看、哪些坑我踩过。读完你应该能拿着一个 tar 包在一台干净的 Linux 上把容器服务跑起来而不是对着「没找到 rpm 命令」发呆。2. 拆开 docker.rpm.tar先分清引擎包和镜像包2.1 一个 tar 里可能装了三样东西拿到docker.rpm.tar第一件事不是急着解压而是先看它到底是什么。常见的打包方式有三种第一种是纯 rpm 集合里面是docker-ce、containerd.io、docker-ce-cli、docker-compose-plugin这些 rpm 文件用于在没网的机器上装 Docker 引擎第二种是纯镜像包内容是docker save导出的镜像层load回去就能用第三种是混合包既有 rpm 又有镜像 tar交付时一次性给全。判断方法很简单先看大小和内容清单# 不解压先列出 tar 包里的文件清单 tar -tvf docker.rpm.tar | head -50 # 看包有多大判断是引擎包还是镜像包 ls -lh docker.rpm.tartar -tvf会打印每个成员的文件名、大小、权限。如果看到一堆.rpm结尾的文件那核心是引擎安装如果看到manifest.json、repositories、一堆没有扩展名的长哈希目录那就是docker save出来的镜像包两者都有就是混合包。这一步别省我见过有人把镜像包当引擎包去rpm -ivh报「不是 rpm 包」还以为是文件损坏。提示tar -tvf只读不写对大包也安全先看清楚再决定解压到哪个目录别直接在当前目录tar -xf炸出一地文件。2.2 rpm 引擎包和镜像包的处理顺序如果确认是混合包处理顺序必须是先装引擎、再导镜像。原因很直接docker load这个命令本身依赖 docker 客户端引擎没装好镜像包就是一堆死文件。而 rpm 安装又依赖系统架构和发行版匹配CentOS/RHEL 系用 rpmUbuntu/Debian 系得用 deb架构上 x86_64 和 aarch64 的包不能混用这就是热搜里「软件包架构不匹配」的典型来源。先建一个干净的工作目录把包解开# 建工作目录避免污染当前路径 mkdir -p /opt/docker-offline cd /opt/docker-offline # 解压 tar 包到当前目录 tar -xf /path/to/docker.rpm.tar # 看看解出来什么 ls -lh解压后如果看到*.rpm用file确认架构# 确认 rpm 包的架构x86_64 还是 aarch64 file *.rpm # 或者用 rpm 查询需要系统已装 rpm 工具 rpm -qpi docker-ce-*.rpm | grep -i archfile输出里带x86-64就是 x86_64 平台带ARM aarch64就是 ARM 平台。这一步决定了你能不能在这台机器上装——如果内网是鲲鹏、飞腾这类 ARM 服务器却拿了 x86_64 的 rpm装的时候会直接报架构不匹配别硬来换对应架构的包。2.3 依赖顺序containerd 要先于 docker-cerpm 安装最容易翻车的地方是依赖顺序。docker-ce依赖containerd.iodocker-ce-cli又和docker-ce版本要对齐。如果一个个rpm -ivh手动装顺序错了就报依赖缺失。正确做法是一次性把所有 rpm 交给 rpm 一起解析# 进入 rpm 所在目录一次性安装所有包让 rpm 自己解析依赖 cd /opt/docker-offline sudo rpm -ivh *.rpm # 如果提示依赖缺失用 --nodeps 是下策优先补齐依赖包 # 确认安装结果 rpm -qa | grep -E docker|containerdrpm -ivh *.rpm让 rpm 在一次事务里处理所有包的依赖关系比一个个装稳得多。-i是安装-v显示过程-h显示进度条。装完用rpm -qa确认docker-ce、docker-ce-cli、containerd.io都在列表里。如果报某个依赖找不到说明这个 tar 包不完整缺的依赖包得单独补进来别用--nodeps强装强装出来的引擎大概率起不来。注意Ubuntu/Debian 系没有 rpm 命令热搜里「没找到 rpm 命令」多半就是这个原因。这类系统要用dpkg -i *.deb包格式不对就别硬套先确认发行版再选安装方式。3. 装完引擎先别急着 load把 docker 服务拉起来3.1 systemd 启动与开机自启rpm 装完不代表 docker 在跑。CentOS/RHEL 系装完通常需要手动启动服务而且 containerd 和 docker 两个服务都要管# 启动 containerd 和 docker sudo systemctl start containerd sudo systemctl start docker # 设置开机自启内网机器重启后不用再手动拉 sudo systemctl enable containerd sudo systemctl enable docker # 确认服务状态active (running) 才算成功 sudo systemctl status docker --no-pagersystemctl status输出里看到Active: active (running)才算真正起来。如果显示failed先看日志# 看 docker 启动失败的具体原因 sudo journalctl -u docker --no-pager -n 50常见失败原因有两类一是 cgroup 驱动不匹配二是内核模块没加载。前者在日志里会看到cgroup相关报错后者常见于overlay2存储驱动不可用。先看日志再动手别盲目重装。3.2 验证引擎可用与权限配置服务起来后用最轻量的命令验证引擎是否真的能干活# 看 docker 版本和客户端/服务端信息 docker version # 跑一个 hello-world 验证引擎完整可用 docker run --rm hello-worlddocker version会分别打印 Client 和 Server 两段如果只有 Client 没有 Server说明客户端连不上守护进程多半是服务没起或 socket 权限问题。docker run --rm hello-world是最小验证能打印出欢迎信息就说明引擎、存储驱动、网络都基本正常。普通用户直接敲 docker 会报permission denied这是热搜里「docker 权限错误」的高频问题。原因是/var/run/docker.sock默认只有 root 和 docker 组能访问# 把当前用户加入 docker 组 sudo usermod -aG docker $USER # 重新登录或刷新组信息后生效 newgrp docker # 验证不用 sudo 也能跑 docker psusermod -aG把用户追加到 docker 组-a是关键不加会把用户从其他组里踢出去。改完组信息要重新登录才生效newgrp docker可以在当前会话临时生效。这一步做完后面 load 镜像、起容器就不用每条命令都加 sudo 了。3.3 离线环境下的 daemon 配置内网机器往往还要调 daemon 配置比如指定数据目录、配私有仓库、限制日志大小。配置文件在/etc/docker/daemon.json没有就新建# 编辑 daemon 配置 sudo tee /etc/docker/daemon.json /dev/null EOF { data-root: /data/docker, log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } } EOF # 改完必须 reload 再 restart sudo systemctl daemon-reload sudo systemctl restart docker># 导入镜像-i 指定输入文件 docker load -i mysql-8.0.tar # 查看导入后的镜像 docker images # 如果导入的镜像没有 tag 或 tag 是 none手动打 tag docker tag IMAGE_ID mysql:8.0docker load -i把镜像层和元数据一起恢复导入后docker images能看到。有时候导入的镜像 REPOSITORY 和 TAG 都是none这是因为 save 的时候没带 tag需要手动docker tag补上否则后面docker run没法用名字引用。多个镜像 tar 可以循环导入# 批量导入当前目录下所有镜像 tar 包 for img in *.tar; do echo loading $img docker load -i $img done这个循环对交付场景很实用一次把 MySQL、Redis、业务镜像全导进去。注意别把引擎 rpm 包也匹配进*.tar如果 rpm 也是 tar 打包的循环会报错所以导入前先确认目录里只有镜像 tar。4.2 起一个能用的 MySQL 8.0 容器镜像有了起 MySQL 8.0。内网环境要注意端口映射、数据持久化、初始密码三件事# 建数据目录持久化到宿主机 mkdir -p /data/mysql/data /data/mysql/conf # 启动 MySQL 8.0 容器 docker run -d \ --name mysql8 \ --restart always \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDYourStrongPass123 \ -v /data/mysql/data:/var/lib/mysql \ -v /data/mysql/conf:/etc/mysql/conf.d \ mysql:8.0 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci-d后台运行--restart always让容器随 docker 自启内网机器重启后数据库自动回来。-p 3306:3306把端口映射到宿主机业务才能连。-e MYSQL_ROOT_PASSWORD设初始密码不设的话 MySQL 8.0 会拒绝启动。两个-v把数据和配置挂到宿主机容器删了数据还在。最后两行是启动参数把字符集设成 utf8mb4避免中文乱码。启动后确认# 看容器是否在跑 docker ps | grep mysql8 # 看启动日志确认没有报错 docker logs mysql8 --tail 30 # 进容器连一下 docker exec -it mysql8 mysql -uroot -pdocker logs里看到ready for connections才算真正可用。如果容器起来又退出多半是数据目录权限问题或密码没设看日志定位。4.3 Redis 主从的最小配置Redis 主从在内网也常用。先起主节点# 起 Redis 主节点 docker run -d \ --name redis-master \ --restart always \ -p 6379:6379 \ -v /data/redis/master:/data \ redis:7 \ redis-server --appendonly yes --requirepass YourRedisPass--appendonly yes开 AOF 持久化--requirepass设密码。再起从节点指向主节点# 起 Redis 从节点replicaof 指向主节点 docker run -d \ --name redis-slave \ --restart always \ -p 6380:6379 \ -v /data/redis/slave:/data \ redis:7 \ redis-server --appendonly yes --requirepass YourRedisPass \ --replicaof 主节点IP 6379 \ --masterauth YourRedisPass--replicaof指定主节点地址和端口--masterauth是从节点连主节点用的密码两个密码要一致。从节点映射到宿主机 6380避免和主节点端口冲突。验证主从# 在主节点看从节点是否连上 docker exec -it redis-master redis-cli -a YourRedisPass info replication输出里connected_slaves:1说明从节点连上了。如果一直是master_link_status:down检查主从之间网络是否通、密码是否一致、主节点有没有开protected-mode挡住。提示内网跨主机做主从时--replicaof里的 IP 要写主节点宿主机能被从节点访问到的地址别写127.0.0.1那是容器自己。5. 避坑与排查离线装 docker 最容易翻的五个地方5.1 现象rpm 装完 docker 起不来日志报 cgroup 错误原因系统 cgroup 版本和 docker 默认驱动不匹配CentOS 7 用 cgroup v1新系统可能默认 v2或者 systemd 和 cgroupfs 驱动冲突。解决在/etc/docker/daemon.json里显式指定exec-opts: [native.cgroupdriversystemd]然后daemon-reload加restart。改完用docker info | grep Cgroup确认驱动是 systemd。5.2 现象docker load 报 no space left on device原因镜像层解压到/var/lib/docker系统盘空间不够或者 inode 用尽。解决先df -h和df -i看是空间还是 inode 满。空间不够就把># 组织一个可复用的离线交付目录 offline-docker/ ├── engine/ # docker-ce、containerd.io 等 rpm ├── images/ # mysql-8.0.tar、redis-7.tar 等镜像包 ├── conf/ # daemon.json、docker-compose.yml └── install.sh # 一键安装脚本install.sh把前面所有步骤串起来关键是加错误检查和幂等判断#!/bin/bash set -euo pipefail # 1. 装引擎已装则跳过 if ! command -v docker /dev/null 21; then rpm -ivh engine/*.rpm systemctl enable --now containerd docker fi # 2. 导镜像已存在则跳过 for img in images/*.tar; do name$(basename $img .tar) if ! docker images --format {{.Repository}} | grep -q ^${name}$; then docker load -i $img fi done # 3. 应用 daemon 配置 cp conf/daemon.json /etc/docker/daemon.json systemctl daemon-reload systemctl restart docker echo offline docker readyset -euo pipefail让脚本遇错即停避免装一半继续跑。command -v docker判断引擎是否已装docker images判断镜像是否已导这两处幂等判断让脚本可以重复执行不出错。systemctl enable --now一步完成自启和启动。验证交付包是否完整我一般用一台干净虚拟机跑一遍install.sh然后docker run --rm hello-world加起一个 MySQL 容器连一下。这一步别偷懒我吃过亏有次交付包在开发机上测没问题到客户现场发现少了个container-selinux依赖rpm 装不上现场又没网只能连夜找包。从那以后我的习惯是交付前一定在断网的干净环境里完整走一遍把依赖、架构、权限全验过。镜像 tar 包体积大传输时容易损坏交付前算个校验和# 生成校验和交付时一起给 sha256sum docker.rpm.tar docker.rpm.tar.sha256 # 目标机器上校验 sha256sum -c docker.rpm.tar.sha256sha256sum -c会逐字节比对校验不过说明传输损坏重新传别硬解压。这个习惯帮我拦下过好几次因为 U 盘拷贝不完整导致的「软件包似乎无效」问题。希望帮到你。本文还有配套的精品资源点击获取