十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

离线安装Docker全攻略:rpm包与tar镜像的内网部署实践

离线安装Docker全攻略:rpm包与tar镜像的内网部署实践 简介这是一份面向CentOS系统管理员的离线Docker安装资源核心解决内网或无外网环境下Docker依赖难以获取的问题。压缩包共包含16个文件其中9个rpm安装包覆盖docker主程序、客户端及container-selinux、oci-umount等关键依赖并包含docker-1.12.6版本及其常用组件另含3个gz、3个bz2和1个xml文件构成repodata仓库元数据总大小约19.27MB。这样的文件组合既可直接通过rpm -ivh批量安装也可放置到本地目录后用createrepo生成软件源满足不同管理习惯。目前已吸引372人浏览学习说明其在同类离线部署场景中具备一定参考价值。利用该资源读者可快速完成CentOS 7环境下的Docker基础环境搭建省去逐一下载依赖的繁琐操作对于离线机房、生产内网或实验教学环境也能有效降低Docker部署门槛提升交付效率同时可作为学习Docker离线部署的入门样例在项目交付中复用为标准环境准备包。 碰到内网环境要装 Docker最让人头疼的往往不是配置本身而是那一堆“怎么把软件包弄进去”的破事。你手机会先看到三个高频缩写docker、rpm、tar。rpm 是 RedHat 系发行版的标准安装包格式tar 是打包镜像、分发改件时最通用的容器而 Docker 本体恰好能以 rpm 包的形式安装它的镜像又天然以 tar 文件的方式导出。这篇内容就是把我在离线服务器、ARM 机器、银河麒麟这类企业 Linux 环境上折腾 Docker 的完整思路整理出来怎么拉 rpm 包、怎么解 tar、怎么把镜像做成 tar 带走给要在弱网或纯内网环境搞容器化部署的运维同行做个参考。1. 先理顺关系rpm、tar 和 Docker 镜像分别扮演什么角色1.1 rpm 是 RedHat 系发行版的“软件包装箱”如果你用的是 CentOS、RHEL、Rocky Linux、银河麒麟这类系统软件安装包基本都是.rpm文件。rpm 的全称是 Red Hat Package Manager它把程序二进制、配置文件、安装脚本、元数据打成一个包交给系统底层的 rpm 数据库统一管理。.rpm文件本身不是一个可以直接双击运行的软件它更像是“带安装说明的压缩包”。执行rpm -ivh xxx.rpm之后系统会把文件解压到对应路径同时把包名、版本号、文件清单登记到本地数据库。卸载时rpm -e就能按数据库记录清理干净这也是 rpm 包管理比直接解压二进制 tar 包更受生产环境欢迎的原因。很多初学者容易把 rpm 和 tar 搞混一个很直观的区分方式rpm 包解决“怎么让软件被系统管理起来”的问题tar 包解决“怎么把一堆文件原封不动搬运”的问题。你可以把 rpm 想成超市里的带包装商品有生产日期、保质期、配料表tar 则像快递箱里面能装商品也能装别的箱子但快递箱自己不会登记保质期。1.2 tar 是容器镜像的“长途运输箱”Docker 镜像在仓库里是分层的每一层可能是一个文件系统的变更记录。要把镜像从一台机器迁到另一台机器最干净的手段就是用docker save把它导出成一个 tar 文件再在目标机器上docker load进本地镜像库。这里常有个概念坑docker save和docker export导出的都是 tar但语义完全不同。save保留镜像层信息和历史提交记录适合完整迁移镜像export只把容器当前文件系统打平导出不保留层和历史。离线迁移部署应一律用saveload别用exportimport来倒腾镜像否则你会丢掉镜像自带的启动命令、环境变量和层缓存信息。1.3 离线部署为什么这三样缺一不可典型的离线场景长这样目标机器没有外网源机器或下载机有外网。你在下载机上收集 Docker 的 rpm 安装包传到目标机后rpm -ivh装上再从源机器把需要的镜像save成 tar 包拷到目标机器load进去。整个过程你手边翻来覆去就是 docker、rpm、tar 这三样东西。换句话说只要理清“rpm 装软件、tar 传镜像”这条主线再配合几个关键命令内网部署 Docker 和容器的难题就已经解决大半。2. 获取 Docker 的 rpm 包从下载到依赖补齐2.1 先分清发行版和 CPU 架构下载 rpm 包之前第一件事是确认目标机器的系统类型和 CPU 架构。装错架构的包rpm 会直接报wrong ELF class或is for a different architecture白折腾半天。系统/架构常见后缀备注x86_64x86_64.rpm最常见服务器架构ARM 64aarch64.rpm华为鲲鹏、飞腾等服务器ARM 32armv7hl.rpm树莓派早期版本等场景龙芯mips64el.rpm特殊国产硬件上才有银河麒麟这类企业 Linux 发行版本身支持 AMD64 和 ARM64。如果你在 ARM 机器上部署镜像和 rpm 包都必须找 aarch64 版本x86 的包硬装会失败镜像硬载也会在启动时报“exec format error”。判断当前架构最稳妥的命令是uname -m不要在arch和uname -i之间纠结。2.2 从官网或镜像源定位 rpm 包拿到了架构接下来就是找包。Docker 官方把 CentOS/RHEL 系的 rpm 包放在 yum 仓库里在能联网的机器上我们可以直接用包管理器下载# 先配置 docker 官方 yum 源这里以 CentOS 7 为例 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo配置好仓库后用yumdownloader把 rpm 拉到本地而不安装sudo yum install -y yum-utils sudo yumdownloader docker-ce docker-ce-cli containerd.io银河麒麟、统信 UOS 这类面向企业市场的 Linux 发行版建议优先去各自的软件仓库或对应官网下载 station。很多厂商会提供专用的 rpm 包下载入口搜一下“麒麟安装 rpm 包官方镜像网站”就能找到对应页面下载时同样注意带上架构信息。2.3 一条命令拉齐依赖包Docker 的 rpm 包互相之间有依赖关系只下载几个主包很可能不够比如老版本 CentOS 7 还需要container-selinux。如果只拷几个主 rpm 到内网安装时经常会看到“依赖被拒绝”的提示。收集依赖有两个常用办法。办法一是用yumdownloader --resolve让它连依赖一起下载sudo yumdownloader --resolve docker-ce docker-ce-cli containerd.io办法二是用repoquery查看完整依赖列表再手动下载sudo yum install -y yum-utils repoquery --requires --resolve docker-ce实际经验是遇到缺依赖时不要直接去网上乱搜单个 rpm 文件父子版本不一致会把 rpm 数据库搞乱。最稳的做法是让包管理器解析依赖一次性把所有 rpm 放进同一个目录拷到内网后统一安装。3. 离线安装 Docker 的三个常见姿势3.1 rpm 命令的基础用法拿到一堆 rpm 文件后安装顺序和组合方式是有讲究的。最基础的操作是# 安装i 表示 installv 显示过程h 显示进度 sudo rpm -ivh docker-ce.rpm # 升级U 表示 upgrade适合已安装旧版本的情况 sudo rpm -Uvh docker-ce.rpm # 查询是否安装成功 rpm -qa | grep docker注意-ivh和-Uvh的区别前者是“安装”如果包已存在会报错后者是“升级或安装”如果系统里已有版本会用新包覆盖。批量安装时我习惯先装依赖包再装主包否则容易出现“装到一半发现缺依赖”。如果你把要安装的 rpm 文件都放在同一个文件夹里还可以这样一次性处理sudo rpm -ivh /path/to/rpms/*.rpm不过*通配符展开后rpm 会按文件顺序逐个处理仍可能遇到依赖顺序问题。更省心的做法是直接用yum的本地安装模式sudo yum localinstall /path/to/rpms/*.rpm -yyum localinstall会从本地 rpm 文件中解析依赖只要目标机器本地已有对应依赖包它就能排序并自动装完。新版系统里对应的命令是sudo dnf install /path/to/rpms/*.rpm -ylmgtfy 到这里很多人的第一个“坑”已经踩完了内网机器没有配置 yum 源直接yum install docker-ce肯定失败但本地 rpm 文件是不会因为断网而失效的关键是让包管理器把本地文件当成软件源来用。3.2 特殊系统上的补充操作如果是银河麒麟这类基于 RedHat 系内核的发行版yum localinstall的思路依然适用。只是部分系统预装源里可能没有 docker 相关软件包需要先把下载好的 rpm 包全部传到/opt/docker-rpms/目录再执行sudo yum localinstall /opt/docker-rpms/*.rpm -y装完记得执行systemctl start docker并设置开机自启sudo systemctl enable --now docker如果系统里首次安装 Docker启动后docker info会提示你当前用户没有权限访问这时只需把部署用户加入 docker 组sudo usermod -aG docker $USER3.3 还有一类二进制 tar 包安装方式不是所有软件都提供 rpm 包。很多中间件或工具链只发一个.tar.gz压缩包解压后就是完整目录常见于 KKFileView、部分 JDK 版本、绿色版 Nginx 等。这类包的安装逻辑就四个步解压、挪到合适目录、配环境变量、写 systemd 启动文件。比如sudo mkdir -p /opt/kkfileview sudo tar -zxvf kkfileview-*.tar.gz -C /opt/kkfileviewtar -zxvf里的z表示自动识别 gzip 压缩x表示解压v显示过程f指定文件名。反过来打包用tar -zcvf backup.tar.gz /opt/kkfileviewc表示创建归档。这几个组合拳是 Linux 运维最常用的肌肉记忆。如果下载的是 Docker 官方提供的二进制 tar 包一般是docker-20.10.x.tgz里面包含 dockerd、docker、containerd 等二进制文件可以解压后把这些文件放到/usr/bin再手写一份 systemd 服务文件。这种做法的灵活度高但可维护性不如 rpm 包生产环境我优先推荐走 rpm 安装路线二进制方式适合快速实验或者制作用户自定义启动脚本的场景。4. 用 tar 管理 Docker 镜像导出、传输与导入4.1 save 和 load 的基本功离线环境下装好 Docker 还只是第一步更常见的问题是怎么把“要用的镜像”带上。命令组合非常固定# 在源机器上导出镜像为 tar 文件 docker save -o myapp.tar myapp:1.0.0 # 传到目标机器后导入 docker load -i myapp.tar比如你想在离线环境装 MySQL 8.0docker save -o mysql80.tar mysql:8.0目标机器导入后docker images就能看到 mysql:8.0再正常docker run挂数据卷跑起来即可。Redis 主从、GitLab 这类镜像同理先在能联网的机器上docker pull好再save成 tar拷贝到内网load。实际操作里我习惯加一层 gzip 压缩尤其在跨机房或走移动硬盘传输时能省不少时间docker save myapp:1.0.0 | gzip myapp.tar.gz然后目标机器解压后导入gunzip -c myapp.tar.gz | docker load4.2 批量导出全部镜像机器上镜像一多一个个写镜像名很痛苦。一条命令可以导出本机所有镜像docker save -o all-images.tar $(docker images -q)docker images -q只输出镜像 ID命令替换后交给docker save打包成一个整体 tar。这个 tar 包可能很大建议先df -h确认磁盘空间。也有人喜欢用docker images -q | xargs docker save -o all.tar这类管道写法但xargs会分段执行命令如果镜像数量多后一段保存结果会覆盖前一段输出的 tar 不完整建议直接用命令替换不要用xargs。真正的tar | xargs场景更常用于批量导入多个 tar 包ls *.tar | xargs -I{} docker load -i {}4.3 打包后的版本标记问题镜像导出再导入后默认会保留仓库名和标签。但如果源机器上的镜像是myapp:latest目标机器上也会是myapp:latest不会自动帮你改写。如果离线环境里要统一版本可以在导入后补打 tagdocker tag myapp:latest registry.internal/library/myapp:1.0.0大型内网环境最好的做法是直接架一台私有镜像仓库比如用 Harbor 自建 Registry部署机全部改成从内网仓库拉镜像。这样日常docker pull完全走内网根本不需要到处拷贝 tar 文件tar 包导出方式就退居为应急兜底方案。5. 实际部署中高频问题与排查5.1 “rpm: command not found” 不是系统坏了这个提示很容易让新人慌。本质原因只有一个你当前系统根本不在基于 rpm 包管理的体系里或者 shell 的 PATH 里找不到 rpm 命令。Debian/Ubuntu 的包管理是dpkg/apt它们没有rpm命令很正常。确认系统类型cat /etc/os-release如果输出里写的是 Ubuntu 或 Debian就别再下载 rpm 包了老老实实换成.deb包或二进制 tar 包。反过来CentOS/RHEL/Kylin 上才用 rpm 体系。这个故事告诉我们找安装包之前先认清“自己家是哪种快递柜”比盲目下载重要得多。5.2 tar 解压后文件乱码或权限问题有时tar -zxvf解压后看到的文件名是乱码大概率是打包时文件系统编码和当前终端编码不一致。先把LANG环境变量调整一下export LANGC.UTF-8然后重新解压。tar 本身不对文件内容做转码它只是原样保存文件名和字节流乱码通常只在文件名层不影响实际文件内容。解压后如果程序运行时报“Permission denied”先检查文件权限ls -l /opt/myapp/bin/start.sh chmod x /opt/myapp/bin/start.sh还有一个容易忽略的点解压到/opt或/usr/local时目录属主可能是 root普通用户运行会没写权限。使用chown -R appuser:appuser /opt/myapp修正。5.3 镜像拉取慢的应对思路能联网的环境docker pull慢是另一类高频反馈。先排查是不是网络连通性问题docker pull alpine:latest如果进度条一直卡住除了检查外网连通状态更实用的办法是把镜像源配置成可用的镜像加速器。在/etc/docker/daemon.json里写{ registry-mirrors: [https://your-mirror-address] }再重启 Dockersudo systemctl restart docker注意镜像加速器只对docker pull生效不改变docker push行为。如果公司内网已部署私有 Registry把部署机全部指向内部地址才是最优解既能提速又能避免每次从公共仓库拉取的不确定性。6. 经验沉淀与小技巧6.1 搞不定依赖关系时检查校验和离线环境最容易出现“rpm 装到一半报错”有时候可能是传输过程损坏。拿到 rpm/tar 包后先算一下哈希值和源文件比对sha256sum docker-ce-*.rpm docker-ce-cli-*.rpm下载页面一般会给出官方 SHA256。哈希对不上就直接丢别用损坏的包浪费时间排依赖问题。6.2 架构不匹配是硬伤在 ARM 机器上加载 x86 镜像docker load往往不报错但docker run时会直接提示exec format error。这种错误最让人费解因为看起来包也导入成功了实际上镜像里的程序根本不能在当前 CPU 架构上执行。部署前统一确认两边架构源机器和目标机器都执行uname -m。如果需要跨架构运行用docker buildx做多架构镜像再在目标机器上按架构加载对应版本。6.3 我的操作习惯个人多年的离线部署习惯是这样的先在联网机器上把 docker 的 rpm 包和所有目标镜像分别放到两个目录里一个叫rpms/一个叫images/拷到目标机器后先装 rpm 再导入镜像。最后做完整个流程后我会顺手做一次全量导出备用装完所有需要的镜像后把docker save的 tar 包再复制一份到移动硬盘。因为软件版本是会变的等环境真的出问题时你已经不好找当时那个一模一样的包了。提前留一份“当时能用”的 tar 包往往是生产环境里最省心的保险。本文还有配套的精品资源点击获取
返回列表