尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
离线环境部署Docker:从docker.rpm.tar到MySQL与Redis容器实战
简介这份资源是面向在 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 盘拷贝不完整导致的「软件包似乎无效」问题。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

迷你SQL完全指南:免安装SQL2000的启动、连接与数据导出

迷你SQL完全指南:免安装SQL2000的启动、连接与数据导出

简介:迷你SQL免安装工具(HaoSQL)专为需要快速搭建数据库环境的技术人群设计,将SQL2000等数据库的安装配置过程压缩为“解压—启动”两步,有效解决传统安装冗长、依赖繁杂的痛点。该绿色包仅31.08MB,免安装、…

📅 2026/10/12 16:44:32
AI API降价90%后,模型选型与Token成本核算实战指南

AI API降价90%后,模型选型与Token成本核算实战指南

前阵子,某头部AI平台的API价格调整刷了不少人的屏。旗下轻量模型Haiku 5.5直接降价90%,折算下来基本就是“打一折”。很多人第一反应是“哦,便宜了,好事”,但紧接着就该问自己一句:既然价格变成这样&#x…

📅 2026/10/12 16:44:32
社交网络影响力最大化:从贪心算法到CELF加速的工程实践

社交网络影响力最大化:从贪心算法到CELF加速的工程实践

1. 社交网络影响力最大化到底在解决什么问题第一次接触“影响力最大化”这个概念,是在一个做社群运营的朋友那里。他手里管着几十个微信群里的大几千号人,每次有新的活动或者内容要推,他都在纠结到底该找哪几个人帮忙转发,才能让传…

📅 2026/10/12 16:44:32
MORE NEWS

更多资讯

📰

Token登录状态协同:前后端无状态认证契约设计

1. 这不是“又一个登录demo”,而是前后端协作的契约现场你点开这个标题,大概率不是想看“SpringBoot怎么写Controller”或者“Vue怎么发axios请求”这种零散知识点。你真正卡住的地方,往往是——为什么我前端明明传了token,后端却…

📰

最长01交替子串:从算法题到嵌入式信号解析的工程实践

1. 项目概述:一道看似简单却暗藏玄机的字符串经典题“最长01子串”这个标题,乍一看像是算法入门课上随手布置的练习题——不就是找一段连续的、只含0和1的字符串里最长的那一段吗?但如果你真这么想,大概率会在实际编码时栽个跟头。…

📰

AnyPS5跨平台串流工具设计:架构、编码与延迟优化实践

1. 从“AnyPS5”这个标题说起:一个跨平台串流工具的设计思路第一次看到“AnyPS5”这个标题,我脑子里蹦出来的第一个念头是:这大概率是一个围绕主机游戏串流展开的项目。为什么这么说?因为“Any”这个前缀在技术圈里几乎已经成了一…

📰

Python 3.7 + PyInstaller 3.6 打包实战:错误处理与避坑指南

1. 为什么打包这件事值得单独写一篇记录把 Python 脚本交给别人用,最省事的办法当然是让对方装个 Python 再pip install一堆依赖,但现实里这条路基本走不通。对方可能连命令行都不太熟,更别说处理依赖冲突了。所以把脚本封装成单个可执行文件…

📰

全国旅游景点数据清洗与可视化:从7z到SQLite与热力图

简介:这是一份全国旅游景点结构化SQL数据包,面向需要批量景点数据做网站开发、移动应用或旅游数据分析的开发者与分析人员,可直接解决景点信息采集难、清洗成本高的问题。压缩包采用7z格式,仅包含1个SQL文件,大小约11.…

📰

STM32F103移植FreeRTOS全流程:从裸机到RTOS的实战指南

1. 为什么要在 STM32F103 上跑 FreeRTOSSTM32F103 这颗芯片在嵌入式圈子里算是"国民级"的存在——Cortex-M3 内核、72MHz 主频、64KB~128KB Flash、20KB SRAM,价格便宜、资料铺天盖地,很多人入门嵌入式就是从它开始的。但真正做过稍微复杂一点…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬