如果你正在龙芯 3B6000 平台上部署容器化应用,却发现官方仓库的 Docker 版本停留在 20.10.x,而你的项目依赖 Docker 29.5.1 的新特性,比如 containerd 作为默认镜像存储后端、增强的网络安全特性,或者需要修复特定安全漏洞,那么这篇文章就是为你准备的。

在 x86/ARM 生态中,通过包管理器安装最新版 Docker 几乎是“一键操作”。但在龙芯这样的自主架构平台上,情况截然不同。官方二进制包往往滞后,直接编译源码又可能遇到复杂的依赖和兼容性问题。这导致很多开发者要么被迫使用旧版本,要么花费大量时间在环境适配和编译调试上。

本文将提供一个清晰、可复现的路径,帮助你在龙芯 3B6000 上成功安装 Docker Engine 29.5.1。我们不会止步于“能装上”,还会深入分析为什么需要高版本、安装过程中的关键决策点、如何验证安装结果,以及后续使用中可能遇到的“坑”和最佳实践。无论你是为国产化项目迁移技术栈,还是单纯想在龙芯平台上体验最新的容器技术,这篇文章都将提供从理论到实践的完整指南。

1. 为什么要在龙芯 3B6000 上安装 Docker 29.5.1?

在开始动手之前,我们需要先明确目标:为什么是 Docker 29.5.1,而不是系统仓库里更旧的版本?

Docker Engine 29.x 是一个重要的主版本更新,带来了多项架构无关的改进和修复,这些改进对于生产环境的稳定性和安全性至关重要。根据 Docker 官方发布说明,29.5.1 版本修复了多个关键安全漏洞,例如 CVE-2026-41567 和 CVE-2026-41568,它们涉及 docker cp 命令的权限提升风险。在安全要求严格的国产化部署场景中,及时修补这类漏洞是基本要求。

除了安全修复,29.x 版本还包含许多核心功能更新:

  • 默认使用 containerd 镜像存储 :从 29.0.0 开始,新安装默认使用 containerd 作为镜像存储后端,替代了传统的 graphdriver 。这带来了更好的性能、更低的资源开销以及与 Kubernetes 生态更一致的底层架构。对于长期维护的系统,这是一个值得关注的架构演进。
  • 网络栈增强 :包括对 nftables 防火墙后端的实验性支持、改进的 Overlay 网络可靠性以及 Swarm 路由网格的稳定性提升。在网络复杂的微服务部署中,这些改进能减少难以排查的偶发性网络问题。
  • Rootless 模式改进 :29.5.0 将 gvisor-tap-vsock 设为新的默认 rootless 网络驱动,提供了比 slirp4netns 更好的性能和兼容性。这对于在无 root 权限环境下运行容器(提升安全性)非常有价值。
  • 大量错误修复和性能优化 :从网络连接处理到镜像拉取性能,再到 CLI 工具的完善,29.5.1 累积了自 29.0.0 以来数百项改进。

对于龙芯平台用户而言,使用高版本还有一层特殊意义:它意味着你的软件栈与主流社区保持同步。当你在龙芯上成功运行了与 x86/ARM 服务器相同版本的 Docker,你在镜像构建、CI/CD 流程、运维工具链上的选择会宽广得多,避免了被旧版本“锁死”在某个生态孤岛的风险。

2. 环境准备与系统要求

在龙芯 3B6000 上安装高版本 Docker,本质上是一个“从源码构建”或“获取适配的二进制包”的过程。因此,对基础环境有明确要求。

2.1 硬件与操作系统确认

首先,确认你的系统环境:

  • CPU架构 :龙芯 3B6000,基于 LoongArch 架构。使用 uname -m 命令确认,输出应为 loongarch64
  • 操作系统 :通常为 Loongnix(基于 Fedora)、UOS、麒麟等基于 Linux 的发行版。本文以 Loongnix 或 Debian/Ubuntu 衍生版为例,其包管理工具为 apt yum / dnf
  • 内核版本 :Docker 对内核有最低要求。建议使用内核版本 4.14 或更高。运行 uname -r 查看。龙芯 3B6000 的官方系统通常已满足。

2.2 安装基础依赖

无论采用哪种安装方式,都需要先安装必要的编译工具和运行时库。打开终端,执行以下命令:

对于基于 Debian/Ubuntu (apt) 的系统:

sudo apt update
sudo apt install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release \
    build-essential \
    git \
    libseccomp-dev \
    libdevmapper-dev \
    pkg-config \
    btrfs-progs \
    libbtrfs-dev \
    libapparmor-dev

对于基于 Fedora/RHEL (yum/dnf) 的系统:

sudo yum install -y yum-utils
sudo yum groupinstall -y "Development Tools"
sudo yum install -y \
    ca-certificates \
    curl \
    gnupg \
    libseccomp-devel \
    device-mapper-devel \
    git \
    btrfs-progs-devel \
    libapparmor-devel

2.3 卸载旧版本 Docker(如已安装)

如果你的系统已经安装了旧版本的 Docker(如 docker.io 或 docker-ce),为了避免冲突,建议先卸载它们:

# 停止 Docker 服务
sudo systemctl stop docker
sudo systemctl stop docker.socket

# 卸载旧版本 Docker 引擎及相关组件
sudo apt remove -y docker docker-engine docker.io containerd runc
# 或使用 yum
# sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 清理残留数据和配置(谨慎操作,会删除所有镜像、容器、卷!)
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

注意 rm -rf /var/lib/docker 会删除所有现有的 Docker 镜像、容器、卷和网络。如果这是生产环境或有重要数据,请务必先备份。

3. 安装方案选择:RPM 包 vs 源码编译

在龙芯平台上获取 Docker 29.5.1,主要有两种路径,各有优劣:

方案 优点 缺点 适用场景
寻找预编译的 RPM 包 安装最快,最接近官方体验;依赖自动解决。 龙芯架构的官方仓库极少提供高版本;第三方仓库存在安全与兼容性风险。 有可靠、官方的龙芯架构软件源提供该版本时首选。
从源码编译 最可控,能确保与你的系统环境 100% 兼容;可自定义编译选项。 耗时最长(可能超过1小时);对技术能力要求高;需解决复杂的依赖链。 没有现成包,或需要对 Docker 进行深度定制(如修改代码、调整依赖版本)。
使用静态二进制包 相对简单,无需处理复杂的编译依赖;独立于系统包管理器。 版本可能不全;服务管理、自动升级等需要手动配置。 快速测试、临时环境,或作为编译安装前的验证步骤。

由于 Docker 官方并未为 loongarch64 提供预编译的 29.5.1 二进制包,而第三方仓库的可靠性和时效性难以保证, 从源码编译是目前在龙芯 3B6000 上获取高版本 Docker 最可靠、最推荐的方式 。接下来的章节将详细讲解编译安装的完整流程。

4. 从源码编译安装 Docker 29.5.1

4.1 获取 Docker 源码

Docker 引擎( dockerd )和 CLI( docker )的源码分别托管在 moby/moby docker/cli 仓库。我们需要编译这两个部分。

  1. 创建工作目录并进入

    mkdir -p ~/docker-build && cd ~/docker-build
    
  2. 克隆 moby 仓库(Docker 引擎) : 我们需要特定版本(29.5.1)的代码。通过标签检出:

    git clone https://github.com/moby/moby.git
    cd moby
    git checkout tags/v29.5.1
    cd ..
    
  3. 克隆 cli 仓库(Docker 命令行工具)

    git clone https://github.com/docker/cli.git
    cd cli
    git checkout tags/v29.5.1
    cd ..
    

    现在你的 ~/docker-build 目录下应该有 moby/ cli/ 两个文件夹。

4.2 安装 Go 语言环境

Docker 从 29.x 版本开始,要求 Go 1.24 或更高版本。我们需要手动安装合适版本的 Go。

  1. 下载并安装 Go : 访问 Go 官方下载页 ,查找适用于 linux-loong64 的版本。例如,安装 Go 1.26.4(这是 29.5.1 编译时使用的版本,兼容性最好):

    # 下载
    wget https://go.dev/dl/go1.26.4.linux-loong64.tar.gz
    # 解压到 /usr/local
    sudo tar -C /usr/local -xzf go1.26.4.linux-loong64.tar.gz
    # 清理下载包
    rm go1.26.4.linux-loong64.tar.gz
    
  2. 配置 Go 环境变量 : 将以下内容添加到你的 shell 配置文件(如 ~/.bashrc ~/.zshrc )中:

    export PATH=$PATH:/usr/local/go/bin
    export GOPATH=$HOME/go
    export PATH=$PATH:$GOPATH/bin
    

    然后使配置生效:

    source ~/.bashrc
    
  3. 验证安装

    go version
    

    输出应类似: go version go1.26.4 linux/loong64

4.3 编译 Docker CLI

  1. 进入 cli 目录并编译

    cd ~/docker-build/cli
    
  2. 执行编译脚本 : Docker CLI 项目使用 Makefile 进行构建。运行以下命令:

    make -f docker.Makefile binary
    

    这个命令会编译生成 docker 二进制文件。编译过程可能需要几分钟。

  3. 验证编译产物 : 编译完成后,在 ./build/ 目录下会生成二进制文件。可以检查一下:

    file ./build/docker
    

    输出应显示为 ELF 64-bit LSB executable, LoongArch, ... ,确认是为龙芯架构编译的。

4.4 编译 Docker 引擎 (dockerd)

  1. 进入 moby 目录

    cd ~/docker-build/moby
    
  2. 设置编译环境变量(可选但推荐) : 为了优化编译过程,可以设置一些变量:

    export DOCKER_BUILDTAGS='exclude_graphdriver_btrfs exclude_graphdriver_zfs seccomp apparmor'
    

    这个标签排除了不常用的存储驱动(如 btrfs, zfs),并启用了 seccomp 和 apparmor 安全模块支持。

  3. 执行编译 : 使用项目自带的 Makefile 进行编译:

    make binary
    

    这是最耗时的步骤 ,在龙芯 3B6000 上可能需要 30 分钟到 1 小时以上,具体取决于 CPU 核心数和内存大小。请耐心等待。

  4. 编译产物 : 编译成功后,产物位于 ./bundles/binary-daemon/ 目录下。我们需要的核心二进制文件是 dockerd

4.5 安装编译产物到系统

编译完成后,我们需要将 docker (CLI) 和 dockerd (引擎) 安装到系统目录,并配置 systemd 服务。

  1. 安装二进制文件

    # 安装 Docker CLI
    sudo cp ~/docker-build/cli/build/docker /usr/local/bin/
    sudo chmod +x /usr/local/bin/docker
    
    # 安装 Docker 引擎 (dockerd)
    sudo cp ~/docker-build/moby/bundles/binary-daemon/dockerd /usr/local/bin/
    sudo chmod +x /usr/local/bin/dockerd
    
    # 安装 containerd 和 runc(它们通常与 dockerd 一起编译出来)
    # 首先检查文件是否存在
    if [ -f ~/docker-build/moby/bundles/binary-daemon/containerd ]; then
        sudo cp ~/docker-build/moby/bundles/binary-daemon/containerd /usr/local/bin/
        sudo chmod +x /usr/local/bin/containerd
    fi
    if [ -f ~/docker-build/moby/bundles/binary-daemon/runc ]; then
        sudo cp ~/docker-build/moby/bundles/binary-daemon/runc /usr/local/bin/
        sudo chmod +x /usr/local/bin/runc
    fi
    
  2. 创建 systemd 服务单元文件 : Docker 通常通过 systemd 管理。创建服务文件:

    sudo tee /etc/systemd/system/docker.service << 'EOF'
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service containerd.service
    Wants=network-online.target
    Requires=docker.socket containerd.service
    
    [Service]
    Type=notify
    ExecStart=/usr/local/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    ExecReload=/bin/kill -s HUP $MAINPID
    TimeoutSec=0
    RestartSec=2
    Restart=always
    StartLimitBurst=3
    StartLimitInterval=60s
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    TasksMax=infinity
    Delegate=yes
    KillMode=process
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
  3. 创建 Docker Socket 文件

    sudo tee /etc/systemd/system/docker.socket << 'EOF'
    [Unit]
    Description=Docker Socket for the API
    PartOf=docker.service
    
    [Socket]
    ListenStream=/var/run/docker.sock
    SocketMode=0660
    SocketUser=root
    SocketGroup=docker
    
    [Install]
    WantedBy=sockets.target
    EOF
    
  4. 创建 containerd 服务文件(如果已安装)

    sudo tee /etc/systemd/system/containerd.service << 'EOF'
    [Unit]
    Description=containerd container runtime
    Documentation=https://containerd.io
    After=network.target local-fs.target
    
    [Service]
    ExecStartPre=-/sbin/modprobe overlay
    ExecStart=/usr/local/bin/containerd
    Restart=always
    RestartSec=5
    Delegate=yes
    KillMode=process
    OOMScoreAdjust=-999
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
  5. 创建 docker 用户组并配置权限

    sudo groupadd docker
    sudo usermod -aG docker $USER
    
  6. 重新加载 systemd 并启动服务

    sudo systemctl daemon-reload
    sudo systemctl enable --now containerd.service
    sudo systemctl enable --now docker.socket
    sudo systemctl enable --now docker.service
    

5. 验证安装与基本测试

安装完成后,必须进行验证,确保 Docker 正常工作。

  1. 检查 Docker 版本

    docker --version
    dockerd --version
    

    输出应显示 Docker version 29.5.1, build ... 。注意,从源码编译的版本号可能显示为 29.5.1 ,但构建标识符会与官方包不同。

  2. 运行 Hello World 容器 : 这是最经典的测试,但需要注意架构。龙芯是 loongarch64 ,而 hello-world 镜像默认可能只有 amd64 / arm64 。我们可以运行一个架构无关的简单命令来测试:

    docker run --rm alpine:latest /bin/echo "Hello from LoongArch!"
    

    如果本地没有 alpine:latest 镜像,Docker 会尝试拉取。你需要确保你的镜像仓库(如 Docker Hub)支持 linux/loong64 架构的 Alpine 镜像,或者拉取一个多架构镜像中包含了 loong64 的版本。 更可靠的测试是运行一个纯 Shell 命令

    docker run --rm -it busybox uname -a
    

    同样,需要 busybox:latest 支持 loong64

  3. 检查 Docker 系统信息

    docker info
    

    查看输出,确认 OSType: linux Architecture: loong64 。同时检查 Server Version: 29.5.1

  4. 测试 Docker Compose(可选) : 如果你需要 Docker Compose,也需要安装对应版本。由于 Docker Compose V2 已经集成在 Docker CLI 中作为插件,理论上我们编译的 docker CLI 已包含。可以通过以下命令测试:

    docker compose version
    

6. 常见问题与排查思路

在龙芯平台编译和运行高版本 Docker,你可能会遇到一些特有或常见的问题。

问题现象 可能原因 排查方式 解决方案
编译 moby 时失败,提示 go: cannot find main module 未在 moby 源码根目录执行 make ,或者 go.mod 文件有问题。 确认当前目录为 ~/docker-build/moby ,并检查 go.mod 文件是否存在。 确保在正确的目录执行。可尝试 go mod tidy 整理依赖。
编译过程中内存不足,被 kill 编译 Docker 引擎非常消耗内存,尤其是在链接阶段。 观察 dmesg 或系统日志,查看是否有 OOM (Out Of Memory) 记录。 增加交换空间(swap),或使用 make -j2 binary 限制并行编译任务数,减少内存峰值。
docker info 显示 WARNING: No swap limit support 内核未启用 cgroup swap 支持。 检查 /proc/cmdline 中是否有 cgroup_enable=memory swapaccount=1 参数。 对于龙芯内核,可能需要重新编译内核并启用 CONFIG_MEMCG CONFIG_MEMCG_SWAP 。对于测试环境,此警告可暂时忽略。
docker run 失败,错误 exec format error 尝试运行的容器镜像架构与主机不匹配(如运行了 amd64 镜像)。 使用 docker image inspect <image_name> 查看镜像的 Architecture 字段。 寻找或构建支持 linux/loong64 平台的镜像。可以使用 docker buildx 创建多架构镜像。
dockerd 启动失败,提示 failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed iptables nftables 相关的问题,可能是防火墙工具冲突或内核模块未加载。 运行 sudo iptables -L sudo nft list ruleset 检查现有规则。运行 `lsmod grep iptable` 检查模块。
无法从 Docker Hub 拉取镜像 网络问题,或 Docker Hub 对 loong64 架构的镜像支持不全。 使用 docker pull --platform linux/loong64 alpine 指定架构拉取。使用 curl -v https://registry-1.docker.io/v2/ 测试网络连通性。 配置国内镜像加速器。在 /etc/docker/daemon.json 中添加 "registry-mirrors": ["https://your-mirror.m.daocloud.io"] 。对于缺乏官方 loong64 镜像的软件,需要自己通过 Dockerfile 构建。
编译时 go get 超时或失败 网络问题导致无法下载 Go 模块依赖。 设置 Go 代理。 执行 go env -w GOPROXY=https://goproxy.cn,direct 使用国内代理。

7. 生产环境最佳实践与配置建议

成功安装只是第一步。要在龙芯 3B6000 上稳定运行 Docker 29.5.1,还需要进行一些优化配置。

7.1 配置 Docker 守护进程 ( daemon.json )

创建或编辑 /etc/docker/daemon.json 文件,进行关键配置:

{
  "data-root": "/var/lib/docker",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ],
  "live-restore": true,
  "iptables": true,
  "ip-forward": true,
  "ip-masq": true,
  "userland-proxy": false,
  "experimental": false,
  "debug": false
}

配置项解释

  • native.cgroupdriver=systemd :与系统使用 systemd 管理进程保持一致,推荐。
  • storage-driver : overlay2 是当前最稳定、性能最好的存储驱动,也是 29.x 的推荐驱动。
  • registry-mirrors :配置国内镜像加速源,极大提升镜像拉取速度。
  • live-restore : 允许守护进程重启时保持容器运行,提高可用性。
  • userland-proxy: false :在龙芯架构上,关闭用户态代理有时可以解决端口映射的兼容性问题,让内核直接处理。

修改配置后,重启 Docker 生效:

sudo systemctl restart docker

7.2 内核参数优化

为了 Docker 性能最佳,建议调整一些内核参数。编辑 /etc/sysctl.conf 或创建 /etc/sysctl.d/99-docker.conf 文件:

# 允许流量转发(容器网络必需)
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

# 提高网络性能
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 调整文件系统监控数量(inotify),用于文件变化监听
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 524288

# 调整虚拟内存分配策略,避免容器内应用因内存压力被过早杀死
vm.overcommit_memory = 1
vm.swappiness = 10

应用配置:

sudo sysctl -p /etc/sysctl.d/99-docker.conf

7.3 镜像构建与多架构支持

在龙芯平台上,最大的挑战之一是获取 loong64 架构的镜像。你有两个主要策略:

  1. 使用 docker buildx 构建多架构镜像 buildx 是 Docker 的下一代构建工具,支持轻松构建多平台镜像。

    # 创建一个新的构建器实例(如果尚未创建)
    docker buildx create --name loongarch-builder --use
    docker buildx inspect --bootstrap
    
    # 构建并推送一个同时支持 loong64 和 amd64 的镜像
    docker buildx build --platform linux/loong64,linux/amd64 \
                       -t your-username/your-app:latest \
                       --push .
    

    这要求你的 Dockerfile 是跨平台的,并且基础镜像支持多架构。

  2. 在 Dockerfile 中显式指定平台 : 对于需要在龙芯上构建并运行的镜像,可以在 Dockerfile 中指定基础镜像的平台:

    # 使用支持 loong64 的 Alpine 基础镜像
    FROM --platform=$BUILDPLATFORM alpine:latest AS builder
    # ... 构建步骤 ...
    
    FROM --platform=$TARGETPLATFORM alpine:latest
    COPY --from=builder /app /app
    CMD ["/app"]
    

    在构建时,通过 --platform 参数指定目标平台: docker build --platform linux/loong64 -t myapp:loong64 .

7.4 监控与日志

高版本 Docker 提供了更丰富的监控指标。除了经典的 docker stats ,可以结合 cAdvisor Prometheus 进行监控。

  1. 启用 Docker 实验性指标 (在 daemon.json 中):

    {
      "metrics-addr": "0.0.0.0:9323",
      "experimental": true
    }
    

    重启后,可以通过 http://<your-host>:9323/metrics 获取 Prometheus 格式的指标。

  2. 日志轮转与管理 : 前面 daemon.json 中配置的 log-opts 已经设置了日志文件大小和数量上限。定期检查 /var/lib/docker/containers/*/*.log 文件的大小。对于生产环境,考虑使用 journald syslog 驱动将日志集中到系统日志服务中。

8. 总结与后续方向

在龙芯 3B6000 上成功安装 Docker Engine 29.5.1,标志着你在这个自主平台上拥有了与主流生态同步的现代化容器运行时。这个过程的核心价值不在于“安装”本身,而在于打通了从源码到产物的完整工具链,让你对 Docker 的依赖和构建过程有了更深的理解。

回顾一下关键路径: 确认环境 -> 安装依赖 -> 获取源码 -> 配置 Go 环境 -> 分别编译 CLI 和引擎 -> 手动安装并配置 systemd 服务 。这套流程具有普适性,未来当 Docker 30.x 发布时,你依然可以沿用这个方法进行升级。

接下来,你可以探索几个方向:

  1. 持续集成 :将上述编译步骤脚本化,放入你的 CI/CD 流程(如 GitLab CI、Jenkins),实现龙芯平台 Docker 环境的自动构建与部署。
  2. 镜像仓库 :搭建一个私有的 Docker 镜像仓库(如 Harbor),并开始系统地构建和存储你的 linux/loong64 架构业务镜像,形成自主可控的镜像供应链。
  3. 编排实践 :在单机 Docker 稳定运行的基础上,可以尝试轻量级的容器编排工具,例如 docker-compose 来管理多容器应用,或者探索 Kubernetes 在龙芯上的部署(这是一个更复杂的课题,但社区已有相关实践)。
  4. 性能调优 :结合龙芯 3B6000 的硬件特性(如多核、内存带宽),对 Docker 的存储驱动( overlay2 )、网络模式( bridge vs macvlan )进行针对性测试和调优。

最后,一个重要的提醒:从源码编译意味着你需要自行跟踪上游的安全更新。关注 Docker 官方 GitHub 仓库的 Release 和 Security Advisory,定期评估是否需要重新编译以修复漏洞。虽然过程比 apt upgrade 复杂,但这正是深入技术栈、构建自主能力必须付出的代价,也是国产化软硬件生态走向成熟的关键一步。

更多推荐