arm64离线安装Docker与docker-compose:openEuler信创环境一键部署指南

📅 发布时间:2026/10/12 15:08:14
arm64离线安装Docker与docker-compose:openEuler信创环境一键部署指南
简介本资源面向在 arm64 架构服务器上部署容器环境的运维与开发人员提供 Docker 与 Docker Compose 的离线安装包解决内网或无外网环境下无法在线拉取安装的问题已在 openEuler 操作系统下完成验证。压缩包共 4 个文件包含 tgz 安装包、service 服务单元、sh 一键安装脚本以及 docker-compose 可执行文件整体约 54.41MB覆盖从 Docker 主程序到 Compose 编排工具的完整组件。目前已有 645 人学习下载。使用者可获得一套可直接上传服务器运行的离线部署方案通过脚本快速完成 Docker 安装并将 Compose 二进制文件放入系统路径后即可使用省去逐条排查依赖与网络问题的过程适合需要快速搭建 arm64 容器运行环境、追求部署效率的技术人员参考使用。1. arm64 离线装 Docker为什么 openEuler 上不能直接 yum机房里有台鲲鹏服务器操作系统是 openEuler网口只通了内网堡垒机公网出口一律封死。领导丢过来一句话把容器环境搭起来下周业务要上。你打开终端敲下yum install -y docker回车之后转了两圈报的是「Cannot find a valid baseurl」或者干脆卡在 metadata 下载上——这就是 arm64 平台离线安装 Docker 和 docker-compose 的真实起点。这个标题讲的事情很具体在 arm64 架构、无外网的 openEuler 机器上用一套离线安装包加一键脚本把 docker engine 和 docker-compose 都装好。它解决的不是「Docker 怎么用」而是「装都装不上」这一步。适合两类人一是信创环境里做交付的运维二是手里只有 arm 服务器、又不想一台台手动拷 rpm 的工程师。x86 上那套apt、yum在线装的经验到 arm64 加离线这两个条件叠加时基本要重来一遍因为依赖链、包名、二进制架构全都变了。2. 离线包到底装了什么docker engine 与 compose 的依赖拆解2.1 arm64 与 x86 的包差异在哪很多人以为离线安装就是把 x86 的 rpm 拷到 arm 机器上这是第一个翻车点。rpm 包名里带架构标识比如docker-ce-24.0.7-1.el8.aarch64.rpmx86 的是x86_64两者不能混用。openEuler 底层和 CentOS 8 / RHEL 8 的包体系接近所以选包时通常对齐 el8 系列的 aarch64 版本而不是随便找个 arm 的 deb 包。docker engine 在 arm64 上的依赖比想象中多。核心几个是containerd.io、docker-ce-cli、docker-ce-rootless-extras再往下还有libcgroup、container-selinux、fuse-overlayfs、slirp4netns这些。在线装的时候 yum 会自动解析离线就得自己把这条链凑齐少一个就报依赖错误。docker-compose 更特殊v2 之后它其实是一个 Go 编译的独立二进制不再依赖 Python 的 pip所以离线包里通常直接放一个docker-compose-linux-aarch64可执行文件扔到/usr/local/bin或/usr/libexec/docker/cli-plugins就行。2.2 一个可靠的离线包目录结构我一般会把离线包组织成下面这样脚本按目录去找文件不写死路径docker-offline-arm64/ ├── install.sh # 一键安装脚本 ├── uninstall.sh # 卸载脚本方便回滚 ├── rpms/ # 所有 arm64 rpm 依赖 │ ├── containerd.io-*.aarch64.rpm │ ├── docker-ce-*.aarch64.rpm │ ├── docker-ce-cli-*.aarch64.rpm │ ├── docker-ce-rootless-extras-*.aarch64.rpm │ ├── container-selinux-*.noarch.rpm │ ├── libcgroup-*.aarch64.rpm │ └── ... ├── binaries/ │ └── docker-compose-linux-aarch64 └── config/ └── daemon.json # 可选预置镜像加速或># 在联网的 arm64 机器上执行把 docker 及其全部依赖下载到本地 mkdir -p /tmp/docker-rpms cd /tmp/docker-rpms # 先配置 docker 官方或镜像源的 repo再执行下载 dnf download --resolve --alldeps \ docker-ce docker-ce-cli containerd.io docker-ce-rootless-extras # 下载完成后检查文件数量和架构 ls -1 *.rpm | wc -l file containerd.io-*.rpm | grep -i aarch64--resolve --alldeps是关键参数它会把递归依赖全部拉下来而不是只下顶层包。file命令用来确认下到的确实是 aarch64 架构避免源里混进 noarch 之外的错误包。下完之后把整个目录打包拷到目标离线机器。这一步做完离线机器上rpm -ivh才不会因为缺依赖中断。提示如果联网机器和目标机器 openEuler 小版本不一致依赖版本可能有细微差别尽量让两边版本对齐或者用--nogpgcheck配合本地源安装。3. 一键安装脚本怎么写从 rpm 安装到 compose 落地3.1 脚本的整体执行顺序一键脚本不是把所有命令堆一起顺序错了照样失败。合理的顺序是先检查架构和系统版本再装 rpm 依赖然后启动服务最后放 compose 二进制并验证。下面是我常用的骨架#!/bin/bash set -euo pipefail SCRIPT_DIR$(cd $(dirname $0) pwd) RPM_DIR${SCRIPT_DIR}/rpms BIN_DIR${SCRIPT_DIR}/binaries COMPOSE_BIN/usr/local/bin/docker-compose # 1. 架构与系统校验 ARCH$(uname -m) if [ ${ARCH} ! aarch64 ]; then echo 当前架构 ${ARCH}本离线包仅支持 aarch64 exit 1 fi # 2. 安装全部 rpm忽略已安装的重复包 if ! rpm -Uvh --replacepkgs --nodeps ${RPM_DIR}/*.rpm; then echo rpm 安装失败请检查依赖是否齐全 exit 1 fi # 3. 启动并设置开机自启 systemctl daemon-reload systemctl enable --now docker # 4. 部署 docker-compose 二进制 install -m 0755 ${BIN_DIR}/docker-compose-linux-aarch64 ${COMPOSE_BIN} # 5. 验证 docker version docker-compose versionset -euo pipefail让脚本遇到错误立即退出避免装了一半还在往下跑。rpm -Uvh用--replacepkgs是为了重复执行时不报「already installed」而中断--nodeps这里要谨慎——它跳过依赖检查前提是你确认rpms/里依赖已经齐全否则装完服务起不来。3.2 rpm 安装参数怎么选rpm -ivh和rpm -Uvh的区别值得说清楚。-i是安装包已存在会报错-U是升级包不存在时等同于安装重复执行更友好。离线交付场景我倾向用-Uvh因为客户可能已经装过半个环境脚本要能幂等重跑。--nodeps是把双刃剑。如果rpms/目录里依赖完整加上它能避免 rpm 因为系统里某些版本号对不上而拒绝安装但如果依赖真的缺了它会让你误以为装成功直到systemctl start docker才暴露。我的习惯是第一次不加--nodeps让它报出缺哪个依赖补齐后再加。--replacepkgs解决的是「包已安装」的报错配合-U使用让脚本可以反复执行。这几个参数组合起来脚本的容错性会好很多。3.3 compose 二进制的放置位置docker-compose v2 有两种放法。放/usr/local/bin/docker-compose是最省事的任何用户docker-compose都能调到。放/usr/libexec/docker/cli-plugins/docker-compose则是作为 docker 的 CLI 插件可以用docker compose注意中间是空格调用。两种方式不冲突我一般两个都放或者至少放前者因为很多老脚本还在用带横杠的docker-compose。放好之后要确认执行权限和动态库依赖# 确认二进制架构正确 file /usr/local/bin/docker-compose # 期望输出包含ELF 64-bit LSB executable, ARM aarch64 # 检查动态库依赖是否满足 ldd /usr/local/bin/docker-composeldd这一步很关键。热词里那个docker-compose: error while loading shared libraries: libz.so.1就是典型的动态库缺失compose 二进制依赖libz、libc等基础库openEuler 最小化安装时可能没带全。看到not found就去补对应的 rpm别硬扛。4. 避坑与排查离线安装最常翻车的 5 个点4.1 现象rpm 安装报一堆 failed dependencies原因通常是rpms/目录里依赖没收全尤其是container-selinux和libcgroup这类容易被忽略的包。在线装时 yum 自动补离线就漏了。解决在联网机器上用dnf download --resolve --alldeps重新拉一遍或者把报错里列出的缺失包名逐个补下。补完后先rpm -qpR xxx.rpm看依赖列表确认闭环再拷过去。4.2 现象docker 服务起不来journalctl 里报 cgroup 相关错误原因是 openEuler 默认可能用 cgroup v2而某些 docker 版本对 cgroup v2 支持不完整或者libcgroup没装好。解决先确认libcgroup已安装再检查/etc/docker/daemon.json里是否配置了不兼容的选项。必要时在内核启动参数里加systemd.unified_cgroup_hierarchy0回退到 v1或者升级到支持 cgroup v2 的 docker 版本。这个坑在 arm64 信创环境里出现频率不低。4.3 现象docker-compose 执行报 libz.so.1 not found原因就是前面说的动态库缺失compose 二进制是动态链接的依赖系统里的 zlib。解决ldd找出所有not found的库用dnf provides或直接找对应的 aarch64 rpm 补装。zlib 对应的包一般是zlib或zlib-devel装运行时库即可不用装 devel。4.4 现象脚本在别的目录执行就找不到 rpm原因是脚本里写了相对路径或者硬编码了绝对路径换个目录就失效。解决用SCRIPT_DIR$(cd $(dirname $0) pwd)动态定位脚本所在目录所有资源路径都基于它拼接。这样整个离线包拷到/opt、/root还是 U 盘挂载点都能正常跑。4.5 现象装完 docker 能跑但拉镜像失败原因是离线环境没有外网docker 默认去 Docker Hub 拉镜像当然失败。这不是安装问题是使用问题。解决提前在有网机器上docker save导出镜像 tar 包拷到离线机器docker load导入。或者在daemon.json里配置内网私有 registry 地址。安装脚本本身不解决镜像来源这点要在交付时跟使用方说清楚避免误判成装坏了。5. 验证与进阶让离线包在信创环境里真正可交付装完不等于交付完。我习惯在脚本最后加一段自检把关键信息一次性打出来省得客户来回问echo 安装自检 echo 架构: $(uname -m) echo 系统: $(cat /etc/os-release | grep PRETTY_NAME) echo Docker: $(docker version --format {{.Server.Version}} 2/dev/null || echo 未启动) echo Compose: $(docker-compose version --short 2/dev/null || echo 未安装) echo 数据目录: $(docker info --format {{.DockerRootDir}} 2/dev/null)这段自检的价值在于交付现场你不用一条条敲命令客户自己也能看到装了什么版本、数据目录在哪。docker info里的DockerRootDir默认是/var/lib/docker如果磁盘分区小提前在daemon.json里改style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />