最近在龙芯 3B6000 上折腾 Docker发现一个挺有意思的现象很多人拿到新硬件、新系统第一反应就是“装最新版”。Docker 29.5.1 作为 29.x 系列的一个稳定版本功能新、修复多吸引力确实大。但真要在龙芯这样的 LoongArch 架构上把它跑起来你会发现从官方仓库直接yum install docker-ce或者apt install docker.io这条路大概率走不通。这不是因为龙芯“不行”而是整个开源软件生态里一个经典但容易被忽略的环节在起作用软件包的构建和分发流水线。主流的 Docker 官方仓库其 RPM 或 DEB 包通常是针对 x86_64、ARM64aarch64等主流架构预先编译好的。对于 LoongArch 这类相对较新的架构官方构建流水线可能还没来得及覆盖或者社区维护的版本尚未进入稳定仓库。所以“龙芯 3B6000 安装高版本 rpm Docker 29.5.1”这个需求表面看是个安装问题内核其实是一个“如何在非主流架构上获取并安装预编译软件包”的工程问题。它考验的不是你对 Docker 命令有多熟而是你能否理解软件分发的链条并找到那个适合当前架构的“入口点”。1. 先别急着yum install理解龙芯平台的软件生态现状在 x86 机器上安装 Docker 几乎总是成功的。你添加 Docker 的官方仓库更新缓存然后安装docker-ce、docker-ce-cli等包一切水到渠成。这个流程太顺了以至于我们很少去思考背后发生了什么这些*.rpm文件是从哪里来的对于龙芯 3B6000LoongArch 架构情况有些不同架构标识LoongArch 架构在 Linux 系统中的标识通常是loongarch64。这意味着当你执行uname -m看到的应该是loongarch64而不是x86_64或aarch64。官方仓库覆盖Docker 官方download.docker.com以及各大 Linux 发行版如 CentOS、Fedora、Ubuntu的官方仓库其软件包构建矩阵build matrix首要覆盖的是用户量最大的架构。LoongArch 作为较新的自主架构通常需要社区或发行版维护者额外投入资源进行适配和构建。依赖链Docker Engine 不是一个孤立的二进制文件。它依赖containerd、runc、libseccomp等一系列底层组件。这些组件同样需要针对 LoongArch 架构编译。如果只解决了docker-ce的包但它的依赖包没有对应架构的版本安装依然会失败。因此在龙芯上安装高版本 Docker 的第一步不是找命令而是确认你的软件源。常见的路径有以下几种发行版提供最理想的状况。例如某些针对龙芯优化的 Linux 发行版如 UOS、Loongnix的软件仓库中可能已经提供了较新版本的 Docker 包。你需要检查发行版的仓库配置。第三方社区仓库一些活跃的社区或组织会维护针对 LoongArch 的软件包仓库。例如Arch Linux 的 AUR 可能有维护者提交的 PKGBUILD但你需要确认其针对的是 LoongArch 还是旧的 MIPS 架构。对于 RPM 系如 Fedora、OpenEuler可能有专门的loongarch64仓库分支。手动编译这是最终的“万能”方案但也是复杂度最高的。你需要从 Docker 的 GitHub 仓库moby/moby获取源码在龙芯机器上搭建完整的 Go 语言等编译环境处理可能存在的架构相关代码补丁然后进行编译。这通常涉及docker-ce、containerd、runc等多个项目耗时且对环境要求高。寻找预编译的 RPM这也是标题中“rpm Docker 29.5.1”所暗示的路径。即有人已经为 LoongArch 编译好了 Docker 29.5.1 的 RPM 包你需要找到它并手动安装。我们的目标是优先寻找预编译的 RPM 包。如果找不到再考虑从源码编译。直接使用 x86/ARM 的仓库注定会失败。2. 寻找 LoongArch 架构的 Docker RPM策略与实战既然不能直接从主流仓库安装我们就得主动去“找”包。这个寻找过程本身就是一个标准的开源软件供应链追溯练习。2.1 第一步确定你的基础系统龙芯 3B6000 上可能运行多种 Linux 发行版。不同的发行版其包管理格式RPM vs DEB、库依赖、文件系统布局都不同。你必须先明确这一点。# 查看系统信息 cat /etc/os-release # 查看内核架构 uname -m假设你使用的是某个基于 Fedora/CentOS/RHEL 的发行版RPM 系那么我们的目标就是loongarch64架构的.rpm文件。2.2 第二步搜索可靠的软件源这是最关键的一步。你需要寻找为 LoongArch 提供软件包的仓库。检查系统现有仓库首先查看系统已配置的 YUM/DNF 仓库列表。yum repolist all # 或 dnf repolist all仔细查看输出中是否有包含loongarch64字样的仓库并且仓库中是否启用了enabled。有时发行版会提供测试testing或开发devel仓库里面可能有较新的软件包。探索社区仓库OpenEuler华为的 OpenEuler 发行版对 LoongArch 有较好的支持。可以访问 OpenEuler 的镜像站寻找对应版本的loongarch64仓库。例如在/etc/yum.repos.d/下添加 OpenEuler 的 repo 文件。Fedora EPEL for LoongArchFedora 的 Extra Packages for Enterprise Linux (EPEL) 有时会有社区维护的 LoongArch 分支。但这需要你确认其与你的基础系统是否兼容。发行版特定社区例如针对 Fedora 的rpmfusion等第三方仓库查看其是否支持 LoongArch。使用包搜索引擎访问诸如 pkgs.org 或 rpmfind.net 等网站。搜索docker-ce或docker然后在架构Architecture过滤条件中选择loongarch64。注意查看包对应的发行版Fedora, openEuler, CentOS等和版本号。找到 Docker 29.5.1 或相近版本。直接访问构建系统一些开源项目的构建结果会直接托管在公开的存储服务上。例如Docker 的 CI/CD 系统可能会为每次提交或标签生成多架构的构建产物。你可以尝试在 Docker 的 GitHub Actions 页面或类似 GitLab CI 的制品Artifacts中寻找。但这通常需要你对项目的构建流程比较熟悉。2.3 第三步手动下载与安装 RPM假设我们通过上述方法在某个镜像站找到了以下 RPM 包以 Docker 29.5.1 为例实际文件名可能不同docker-ce-29.5.1-1.el9.loongarch64.rpmdocker-ce-cli-29.5.1-1.el9.loongarch64.rpmcontainerd.io-2.2.5-1.el9.loongarch64.rpm注意版本需与 Docker 29.5.1 匹配从搜索材料看29.5.1 对应 containerd v2.2.429.5.3 对应 v2.2.5安装步骤下载 RPM 包使用wget或curl将找到的包下载到本地目录。wget https://example-mirror.com/path/to/docker-ce-29.5.1-1.el9.loongarch64.rpm wget https://example-mirror.com/path/to/docker-ce-cli-29.5.1-1.el9.loongarch64.rpm wget https://example-mirror.com/path/to/containerd.io-2.2.5-1.el9.loongarch64.rpm处理依赖手动安装 RPM 的最大挑战是依赖关系。你可以尝试使用yum localinstall或dnf local install它们会尝试从已配置的仓库中解决依赖。sudo yum localinstall ./*.rpm # 或 sudo dnf local install ./*.rpm如果提示缺少依赖如libcgroup,container-selinux等你需要同样去找到这些依赖包的loongarch64版本并逐一下载安装。这是一个可能比较繁琐的过程。强制安装不推荐如果依赖关系简单或者你确认系统已满足依赖可以使用rpm -ivh强制安装但可能破坏系统稳定性。sudo rpm -ivh --nodeps docker-ce-29.5.1-1.el9.loongarch64.rpm重要提醒从非官方、未经验证的源安装软件包存在安全风险。请尽量选择可信的社区或发行版官方镜像站。3. 如果找不到 RPM从源码编译的务实路径如果经过多方搜寻确实找不到 Docker 29.5.1 的 LoongArch RPM 包那么从源码编译就成了唯一的选择。这听起来很复杂但将其分解为步骤是可以实现的。核心思路Docker 引擎moby/moby及其相关组件containerd, runc都是用 Go 语言编写的。Go 语言具有优秀的跨平台编译能力。我们需要在龙芯机器上搭建 Go 环境获取源码并执行针对loongarch64的编译。3.1 环境准备安装 Go确保系统安装了足够新版本的 Go。Docker 29.x 可能需要 Go 1.24 或更高版本根据搜索材料中 v29.0.0 的更新说明。从 Go 官网下载linux-loong64的安装包并安装。wget https://go.dev/dl/go1.24.0.linux-loong64.tar.gz sudo tar -C /usr/local -xzf go1.24.0.linux-loong64.tar.gz echo export PATH$PATH:/usr/local/go/bin ~/.bashrc source ~/.bashrc go version安装基础开发工具sudo yum groupinstall Development Tools sudo yum install git make gcc libseccomp-devel3.2 编译 runc 和 containerdDocker 依赖这两个底层组件。通常需要先编译它们。编译 runcgit clone https://github.com/opencontainers/runc.git cd runc # 切换到与 Docker 29.5.1 兼容的版本例如 v1.3.6 (根据搜索材料29.6.0 使用了 runc v1.3.629.5.1 可能使用 v1.3.5) git checkout v1.3.5 make BUILDTAGSseccomp selinux sudo make install编译 containerdgit clone https://github.com/containerd/containerd.git cd containerd # 切换到与 Docker 29.5.1 兼容的版本例如 v2.2.4 (搜索材料显示 29.5.1 对应此版本) git checkout v2.2.4 make sudo make install3.3 编译 Docker 引擎 (moby)这是最核心的一步。git clone https://github.com/moby/moby.git cd moby # 切换到 v29.5.1 标签 git checkout v29.5.1 # 使用 Makefile 进行编译。DOCKER_BUILD_PKGS 指定要构建的包这里我们构建静态二进制文件。 # 这个过程会下载很多依赖耗时较长。 make binary编译成功后产物会在./bundles/binary-daemon/目录下。主要我们需要dockerd和docker这两个二进制文件。3.4 安装与配置复制二进制文件sudo cp -p ./bundles/binary-daemon/dockerd /usr/local/bin/ sudo cp -p ./bundles/binary-daemon/docker /usr/local/bin/创建 systemd 服务文件Docker 通常作为服务运行。你可以从官方 RPM 包中提取或参考其他架构的 systemd unit 文件编写。一个简单的docker.service示例如下需放置于/etc/systemd/system/[Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service containerd.service Wantsnetwork-online.target Requirescontainerd.service [Service] Typenotify ExecStart/usr/local/bin/dockerd ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways StartLimitBurst3 StartLimitInterval60s LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity TasksMaxinfinity Delegateyes KillModeprocess [Install] WantedBymulti-user.target启动 Docker 服务sudo systemctl daemon-reload sudo systemctl enable docker sudo systemctl start docker sudo docker version4. 安装后的关键验证与避坑指南无论通过 RPM 还是源码编译安装成功都不意味着万事大吉。在龙芯这样的非主流架构上需要做更细致的验证。4.1 基础功能验证版本与信息首先运行docker version和docker info确认客户端和服务端版本都是 29.5.1并且架构显示为linux/loong64Docker 使用的 GOARCH 名称可能是loong64。运行一个测试容器这是最关键的测试。不要一上来就跑复杂应用。sudo docker run --rm hello-world如果这个命令失败问题可能出在镜像架构不匹配hello-world镜像可能没有linux/loong64的版本。你需要寻找支持多架构的镜像或者显式指定平台如果 Docker 支持。对于 LoongArch可用的基础镜像较少你可能需要自己构建。内核功能缺失检查内核是否启用了必要的特性如cgroups、namespaces、overlayfs等。运行docker info会输出一些警告信息。SELinux/AppArmor如果系统启用了 SELinux 或 AppArmor可能需要调整策略。4.2 LoongArch 特定注意事项镜像可用性这是最大的生态瓶颈。Docker Hub 上绝大多数镜像只有linux/amd64和linux/arm64。你需要寻找明确支持linux/loong64的镜像如一些国产基础镜像。学习使用 Dockerfile 在龙芯机器上自己构建镜像。使用docker buildx尝试构建多架构镜像但这需要配置构建器。内核版本与配置确保你的内核版本足够新以支持 Docker 所需的所有功能。特别是对于高版本 Docker一些新特性如cgroup v2、time namespaces等需要内核支持。搜索材料中 Docker 29.5.0 提到了“默认启用私有时间命名空间”这需要较新的内核。存储驱动默认的overlay2存储驱动需要内核支持。使用docker info检查Storage Driver是否正常。如果不行可以尝试在/etc/docker/daemon.json中配置storage-driver: vfs但性能较差。网络问题在非主流架构上网络插件如bridge,macvlan的底层实现可能遇到问题。如果容器无法联网检查iptables/nftables规则以及ip forwarding是否开启。sudo sysctl net.ipv4.ip_forward # 如果为0则启用 sudo sysctl -w net.ipv4.ip_forward1 # 使其永久生效编辑 /etc/sysctl.conf4.3 长期维护思考升级路径手动安装 RPM 或源码编译都意味着你脱离了系统的包管理器yum/dnf的自动更新轨道。下次 Docker 发布安全更新如搜索材料中频繁出现的 CVE 修复你需要重复整个寻找或编译流程。这是一个重要的维护成本。依赖管理手动安装的依赖包不会自动更新。你需要自己关注containerd、runc等组件的安全更新。文档与社区记录下你本次成功安装的所有步骤、使用的软件源、遇到的错误及解决方法。这对于你个人复盘和帮助其他龙芯开发者非常有价值。考虑将你的经验分享到相关的开源社区或论坛。5. 总结在龙芯上安装高版本 Docker到底在解决什么问题回过头看“安装 Docker”这个动作在 x86 生态下是一个简单的“消费”行为而在龙芯生态下则更像一次“参与建设”的行为。它迫使你去关注软件供应链的完整链条从源码、到针对特定架构的编译、到打包成 RPM、再到仓库分发、最后到用户安装。在主流架构上这个链条由庞大的社区和商业公司维护对用户透明。在 LoongArch 这样的新架构上这个链条可能在某些环节是断裂的。因此在龙芯 3B6000 上成功安装 Docker 29.5.1其价值远不止于“能用 Docker 了”。它意味着你验证了该版本 Docker 在 LoongArch 架构上的基础兼容性。你为后续的开发者探索了一条可行的软件获取路径无论是通过你找到的 RPM 仓库还是你总结的编译指南。你意识到了生态建设的重要性。一个架构的繁荣离不开像你这样愿意去“填坑”、去把上游软件“搬”过来的人。所以下次当你再遇到类似“在某某架构上安装某某软件”的问题时思路可以更清晰先查官方和主流社区仓库再找针对该架构的第三方仓库最后考虑源码编译。每一步都是在为这个架构的软件生态添砖加瓦。而每一次成功的安装都是对“自主生态”这个宏大命题的一次具体而微的实践。