简介本资源面向在 arm64 架构服务器上部署容器环境的运维与开发人员提供一套完整的 Docker 与 Docker Compose 离线安装方案已在 openEuler 操作系统下完成验证可有效解决内网或无外网环境下无法在线拉取安装包的痛点。压缩包共包含 4 个文件以 tgz 安装包、service 服务单元文件、sh 一键安装脚本及 docker-compose 二进制文件为主整体约 54.41MB覆盖从 Docker 主程序安装到 Compose 配置的完整链路。目前已有 645 人学习下载适合需要快速搭建容器运行环境的中初级运维人员参考。借助其中的一键安装脚本读者可省去手动编译与依赖排查的繁琐过程直接完成 Docker 18.09.9 的部署并同步配置好 docker-compose 命令便于后续编排多容器应用service 文件也有助于理解系统服务注册方式为离线环境下的容器化落地提供可复用的实践参考。1. arm64 离线装 Docker为什么 openEuler 上不能直接 yum如果你手上是一台 openEuler 的 arm64 服务器还偏偏没有外网那yum install docker这条最顺手的路基本是走不通的。openEuler 官方源里 docker 相关包要么版本偏旧要么依赖链在 arm64 上缺件docker-ce的官方仓库又需要联网拉元数据。我见过太多人卡在这一步机器是鲲鹏或者飞腾的 arm64系统是 openEuler 20.03/22.03任务要求把容器跑起来结果dnf转了半天报一堆No match for argument。这份资源就是冲着这个场景来的一套 arm64 架构下的 docker 与 docker-compose 离线安装包配一个一键安装脚本作者已经在 openEuler 上跑通验证。它解决的不是「docker 是什么」而是「在没有外网、没有 x86 二进制可用的 arm64 机器上怎么把 docker engine 和 compose 插件一次性落地」。适合两类人一是信创环境里做交付的运维二是手里有 arm64 开发板或服务器、想复现容器环境的工程师。下面我按「包长什么样 → 怎么装 → 参数怎么调 → 坑在哪」的顺序拆一遍你照着走能少熬两个通宵。2. 拆开安装包arm64 二进制、依赖与脚本各管什么2.1 离线包为什么必须区分架构docker 的静态二进制是编译产物x86_64 的dockerd拿到 arm64 上连执行都执行不了内核会直接抛Exec format error。这不是配置问题是 CPU 指令集不兼容。所以任何号称「通用」的 docker 离线包只要里面塞的是 amd64 的二进制在 openEuler arm64 上就是废的。这份资源明确标了 arm64意味着里面的dockerd、docker、containerd、runc、docker-proxy这些可执行文件都是 aarch64 版本file命令一看便知。常见做法是把 docker 官方提供的aarch64静态包解压再把 compose 的二进制单独放进去。docker-compose 从 v2 开始是 Go 写的单文件插件架构同样要对上docker-compose-linux-aarch64才是你要的那个。判断方法很简单装之前先跑一句file ./docker/dockerd # 期望输出包含ELF 64-bit LSB executable, ARM aarch64如果输出里是x86-64别犹豫换包。这一步花十秒能省掉后面半小时的玄学报错。2.2 目录结构与文件职责一个能用的离线包目录通常长这样不同打包者命名略有差异但职责一致路径作用关键点bin/dockerd、docker、containerd、runc 等必须是 aarch64 二进制compose/docker-compose 插件二进制对应 aarch64放对插件目录systemd/docker.service、docker.socket路径和二进制位置要匹配install.sh一键安装脚本负责拷贝、赋权、注册服务daemon.json可选守护进程配置镜像加速、data-root 等bin/里的东西最终会被拷到/usr/bin/或/usr/local/bin/systemd/里的 unit 文件进/usr/lib/systemd/system/。脚本干的就是这些搬运和注册的活。你要清楚每个文件去哪出问题时才知道回哪找。2.3 一键脚本到底做了哪几件事别把一键脚本当黑匣子它无非是顺序执行下面这些动作。看懂了你就能自己改#!/bin/bash set -e # 1. 拷贝二进制到系统路径 install -m 0755 bin/* /usr/bin/ # 2. 安装 compose 插件v2 走 cli-plugins 目录 mkdir -p /usr/libexec/docker/cli-plugins install -m 0755 compose/docker-compose /usr/libexec/docker/cli-plugins/ # 3. 注册 systemd 服务 cp systemd/docker.service /usr/lib/systemd/system/ cp systemd/docker.socket /usr/lib/systemd/system/ # 4. 可选写入 daemon.json [ -f daemon.json ] cp daemon.json /etc/docker/daemon.json # 5. 重载并启动 systemctl daemon-reload systemctl enable --now docker逻辑说明set -e保证任何一步失败就停不会带着半成品继续跑。install -m 0755比cp更稳它同时设好权限。compose 放/usr/libexec/docker/cli-plugins/是 docker v2 插件的标准位置放错了docker compose会提示找不到命令。参数上如果你想把数据目录挪到大盘就在daemon.json里加>getenforce # 输出 Enforcing 的话临时放宽容忍度 setenforce 0生产环境不建议长期关但离线交付阶段先让它跑起来后面再按需配策略。这一步不做后面容器起不来你会以为是 docker 的问题其实是安全模块在拦。3.2 执行一键安装脚本把离线包传到目标机解压后进目录tar -zxvf docker-arm64-offline.tar.gz cd docker-arm64-offline sudo ./install.sh脚本跑完验证服务状态systemctl status docker --no-pager # 期望看到 active (running) docker version # Client 和 Server 两段都要有Server 段显示 Engine 版本docker version如果只出 Client 不出 Server说明 dockerd 没起来去看journalctl -u docker -n 50的报错。常见的是二进制权限不对或者 unit 文件路径写错。参数上脚本默认把二进制放/usr/bin如果你系统里已经有旧版 docker先systemctl stop docker再装避免新旧混用。3.3 验证 compose 与跑一个 arm64 容器compose 装好后docker compose version应该能打印版本号。注意是docker compose空格不是老的docker-compose连字符v2 插件走前者。写个最小docker-compose.yml验证services: web: image: nginx:alpine ports: - 8080:80docker compose up -d docker compose ps curl -I http://localhost:8080逻辑说明nginx:alpine是多架构镜像arm64 上会拉 aarch64 的层正好验证整条链路。docker compose ps显示 running 就说明 compose 插件和 engine 配合正常。如果卡在拉镜像那是网络问题不是安装问题——离线环境需要你提前把镜像docker save成 tar 再docker load进来。这一步是很多人翻车的地方以为装完 docker 就能随便拉镜像结果离线机器根本没出口。注意离线环境下docker pull必然失败镜像要么预导入要么走内网 registry。安装包只解决 engine 和 compose不解决镜像来源。4. 避坑与排查离线装 docker 最容易栽的五个地方4.1 现象dockerd 启动报Exec format error原因二进制架构不对包里混进了 x86_64 的可执行文件或者你从别处拷了个 amd64 的 dockerd 覆盖进去。arm64 内核无法执行 x86 指令直接拒绝。解决file /usr/bin/dockerd确认是ARM aarch64。不是就换回正确的 arm64 二进制重新systemctl daemon-reload systemctl restart docker。别想着用 qemu 模拟去跑 x86 的 dockerd那是给容器内模拟用的宿主守护进程这么干性能崩且不稳。4.2 现象docker compose提示not a docker command原因compose 插件没放对目录或者文件名不对。docker v2 只认/usr/libexec/docker/cli-plugins/docker-compose或~/.docker/cli-plugins/docker-compose你放成docker-compose-linux-aarch64它不认。解决改名并放到标准插件目录赋可执行权限install -m 0755 docker-compose-linux-aarch64 /usr/libexec/docker/cli-plugins/docker-compose docker compose version4.3 现象compose 报error while loading shared libraries: libz.so.1原因你用的不是静态编译的 compose 二进制而是依赖系统动态库的版本而 openEuler 最小化安装里缺zlib。这个报错在 arm64 上尤其常见因为很多第三方打包的 compose 没做静态链接。解决换官方静态编译的 aarch64 版本或者补依赖dnf install zlib。但离线机器装不了包所以正解是换二进制。判断方法ldd docker-compose如果列出libz.so.1 not found就是动态链接版别用。4.4 现象容器网络不通curl外部地址超时原因docker 默认创建docker0网桥并改 iptables但离线机器上 firewalld 或已有 iptables 规则可能把转发链挡了。openEuler 默认开 firewalldFORWARD链策略可能是 DROP。解决确认内核转发开启sysctl net.ipv4.ip_forward为 1再检查 firewalld 是否放行 docker 网段。临时验证可以systemctl stop firewalld但生产要按需加规则别一关了之。4.5 现象重启机器后 docker 没自启原因脚本只systemctl start没enable或者 unit 文件没被 systemd 识别。离线包里的 service 文件如果路径和实际二进制位置不一致enable 也会失败。解决systemctl enable docker并确认systemctl is-enabled docker输出enabled。再看systemctl status docker有没有Loaded: ...; enabled。这一步在交付环境里必须验否则客户一重启机器容器全没了锅是你的。5. 进阶把离线包改造成可复用的内网交付模板装通一次不算本事能把这套东西变成团队里谁都能用的模板才算。我一般会在原始离线包基础上做三件事让它从「一次性脚本」升级成「可复用交付件」。第一件把daemon.json参数化。不同机器的数据盘挂载点不一样>DATA_ROOT${DOCKER_DATA_ROOT:-/var/lib/docker} mkdir -p $(dirname $DATA_ROOT) cat /etc/docker/daemon.json EOF { data-root: $DATA_ROOT, log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } } EOF逻辑说明DOCKER_DATA_ROOT不传就用默认路径传了就落到指定盘。日志限制这两行很关键离线环境磁盘往往不大不限制日志大小跑几个月容器日志能把盘写满到时候 dockerd 直接罢工。参数上max-size和max-file按你磁盘容量调100m×3 是保守值。第二件把镜像预导入做成脚本的一部分。离线交付真正麻烦的是镜像不是 engine。我会让脚本支持扫描一个images/目录自动docker loadif [ -d images ]; then for img in images/*.tar; do [ -f $img ] docker load -i $img done fi这样交付包 engine 二进制 compose 预存镜像 tar一台机器从裸系统到容器跑起来全程无外网。第三件加一个自检脚本装完自动跑docker run --rm hello-world镜像预导入的前提下把结果写进日志交付时直接看日志判断成败不用人工敲命令。验证方法上我习惯用docker info看几个关键字段Server Version、Storage DriveropenEuler 上常见 overlay2、Cgroup Version、Architecture: aarch64。这四个对了基本就稳了。再补一个docker compose config校验 compose 文件语法避免交付现场才发现 yaml 写错。从那以后我每次做离线交付都强制走一遍「架构确认 → 脚本安装 → 服务自启 → 镜像导入 → 容器验证」这五步少一步都不签字。这套流程帮我挡掉过好几次「装完看着正常、重启就崩」的返工。希望帮到你。本文还有配套的精品资源点击获取