在国产化技术栈的落地实践中,龙芯平台因其自主可控的特性,正逐步进入企业级应用场景。对于开发团队而言,无论使用何种硬件架构,构建一个稳定、高效的私有制品仓库都是保障研发流程顺畅、提升交付效率的关键环节。Nexus Repository Manager 作为业界广泛使用的仓库管理工具,能够统一管理 Maven、Docker、npm、PyPI 等多种类型的制品。本文将详细介绍如何在龙芯 3B6000 平台上,利用 Docker 容器化技术,从零开始部署并配置一个生产可用的 Nexus 3 服务。整个过程将涵盖环境准备、Docker 安装、Nexus 容器化部署、基础配置、以及针对龙芯架构的注意事项和常见问题排查,目标是交付一个可直接用于开发和生产环境的私有仓库解决方案。

1. 理解在龙芯平台上使用 Docker 部署 Nexus 的价值与挑战

在 x86/AMD64 架构上部署 Docker 和 Nexus 几乎是标准操作,但在龙芯这样的 LoongArch 架构上,我们需要先厘清其独特价值与可能遇到的挑战。

1.1 为什么要在龙芯上部署 Nexus?

首要原因是构建自主可控的软件供应链。在龙芯服务器上部署 Nexus,意味着你的所有软件制品(如 Java Jar 包、Docker 镜像、前端 npm 包)的存储、分发和管理都运行在国产化硬件和操作系统之上,减少了对外部基础设施的依赖。其次,对于开发和测试基于龙芯平台的应用,拥有一个本地的、架构匹配的制品仓库可以极大加速构建过程,避免从互联网拉取可能不兼容的 x86 架构制品。最后,统一的私有仓库有助于团队规范依赖管理,提升构建的稳定性和可复现性。

1.2 龙芯 3B6000 与 Docker 的兼容性现状

龙芯 3B6000 处理器采用 LoongArch 指令集。Docker 的核心是容器化技术,其跨平台能力依赖于镜像的多架构支持。幸运的是,Docker 官方和社区对非 x86 架构的支持日益完善。对于 LoongArch,关键在于两点:一是宿主机操作系统(如 Loongnix、UOS、麒麟)的内核是否支持容器所需的特性(如 cgroups、namespaces);二是所需的基础镜像(如运行 Nexus 所需的 Java 环境)是否有 LoongArch 版本。目前,OpenJDK 官方已提供 LoongArch 64 位构建,这为运行 Nexus(基于 Java)扫清了主要障碍。然而,并非所有软件都有现成的 LoongArch 镜像,部署前需要确认。

1.3 Nexus 3 的架构与资源考量

Nexus 3 是一个 Java 应用程序,其运行时依赖 Java 环境(推荐 JDK 8 或 11)。它由多个组件构成,包括嵌入式数据库(OrientDB)、Web 界面和仓库存储后端。在资源消耗上,Nexus 对内存较为敏感,尤其是当仓库中制品数量巨大时。对于生产环境,建议为 Nexus 容器分配至少 4GB 的堆内存(通过 JVM 参数调整)。在龙芯平台上,除了关注通用资源,还需留意 Java 虚拟机在 LoongArch 上的性能表现和垃圾回收行为,这可能会影响初始配置。

2. 龙芯 3B6000 服务器环境准备与 Docker 安装

部署的第一步是准备一个干净的龙芯服务器环境并安装 Docker 引擎。这里假设你使用的是基于 LoongArch 的 Linux 发行版,如 Loongnix Server 或统信 UOS 服务器版。

2.1 系统基础检查与更新

首先,通过 SSH 连接到你的龙芯 3B6000 服务器。执行以下命令检查系统架构和内核版本,确认环境。

# 查看 CPU 和架构信息
lscpu | grep -E "Architecture|Model name|CPU\(s\)"
# 预期输出应包含 `LoongArch` 和 `3B6000` 相关信息

# 查看内核版本,确保支持容器特性(一般 4.19 以上内核均可)
uname -r

# 更新系统包管理器索引并升级现有软件包(以 Loongnix 的 dnf 为例)
sudo dnf update -y

注意:不同的龙芯操作系统可能使用不同的包管理器(如 apt yum dnf )。请根据实际情况调整命令。

2.2 安装 Docker 引擎

Docker 并未为 LoongArch 提供官方的预编译仓库,因此安装方式可能与 x86 不同。通常需要通过操作系统厂商提供的仓库或社区维护的版本进行安装。

以 Loongnix 系统为例,安装步骤如下:

  1. 安装必要的依赖包。

    sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
    
  2. 添加 Docker 仓库。Loongnix 可能已将 Docker 包含在默认仓库中。如果没有,需要添加社区维护的仓库。请务必从可信源获取仓库配置。

    # 示例:添加一个社区仓库(实际操作前请确认该仓库的可用性和安全性)
    # sudo dnf config-manager --add-repo https://mirrors.example.com/docker-ce/loongarch64/
    # 更常见的做法是直接安装系统已适配的版本
    sudo dnf search docker-ce
    
  3. 安装 Docker 引擎和命令行工具。

    sudo dnf install -y docker-ce docker-ce-cli containerd.io
    
  4. 启动 Docker 服务并设置开机自启。

    sudo systemctl start docker
    sudo systemctl enable docker
    
  5. 验证 Docker 安装是否成功,并检查版本。

    sudo docker --version
    # 运行一个测试容器,验证基础功能
    sudo docker run --rm hello-world
    

    如果 hello-world 镜像不存在,Docker 会尝试拉取。但由于 hello-world 可能没有 LoongArch 版本,此命令可能会失败。这没关系,我们的重点是 Docker 守护进程本身能正常运行。

2.3 配置 Docker 镜像加速与存储路径

为了提升拉取镜像的速度(尤其是从 Docker Hub 拉取兼容层镜像时),建议配置国内镜像加速器。同时,规划好 Docker 数据和 Nexus 数据的存储位置。

  1. 创建或修改 Docker 守护进程配置文件 /etc/docker/daemon.json

    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": [
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com"
      ],
      "data-root": "/data/docker", # 建议将数据目录放在空间充足的挂载点
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m",
        "max-file": "3"
      }
    }
    EOF
    

    请将 /data/docker 替换为你服务器上实际的、容量较大的数据盘路径。

  2. 创建数据目录并重新加载 Docker 配置。

    sudo mkdir -p /data/docker
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  3. 验证配置是否生效。

    sudo docker info | grep -A5 "Registry Mirrors"
    

3. 拉取与运行 Nexus 3 容器

由于 Sonatype 官方并未为 Nexus 3 提供 LoongArch 架构的 Docker 镜像,我们不能直接使用 sonatype/nexus3 。我们需要一个能在 LoongArch 上运行的 Java 环境,然后采用“安装包部署”或寻找社区移植的镜像。

3.1 方案选择:使用通用 Java 镜像安装 Nexus

最可靠的方案是使用一个支持 LoongArch 的 OpenJDK 基础镜像,然后在容器内安装 Nexus 的发行版 war 包或解压其独立发行版。

  1. 准备 Nexus 应用目录和数据目录。

    # 创建 Nexus 的持久化数据目录和部署目录
    NEXUS_DATA="/data/nexus-data"
    NEXUS_DEPLOY="/opt/nexus"
    sudo mkdir -p $NEXUS_DATA $NEXUS_DEPLOY
    sudo chown -R 1000:1000 $NEXUS_DATA # Nexus 默认以 UID 1000 运行
    sudo chown -R 1000:1000 $NEXUS_DEPLOY
    
  2. 下载 Nexus 3 的 Unix 发行版。访问 Sonatype Nexus Repository Manager 3 下载页面 ,获取最新版的 .tar.gz .zip 文件链接。使用 wget curl 下载到服务器。

    cd /tmp
    # 示例链接,请替换为实际的最新版链接
    wget https://download.sonatype.com/nexus/3/nexus-3.xx.x-xx-unix.tar.gz
    tar -zxvf nexus-3.xx.x-xx-unix.tar.gz
    sudo mv nexus-3.xx.x-xx $NEXUS_DEPLOY/nexus
    sudo mv sonatype-work $NEXUS_DATA
    # 注意:解压后通常包含 `nexus-3.x.x-xx` 和 `sonatype-work` 两个目录
    

3.2 编写 Dockerfile 构建自定义镜像

我们需要一个包含正确 Java 环境和 Nexus 应用的 Docker 镜像。

  1. /opt/nexus 目录下创建 Dockerfile

    # 使用支持 LoongArch 的 OpenJDK 11 镜像作为基础
    # 你需要确认这个基础镜像的存在和来源,例如来自某个可信的社区构建
    # 示例:假设 `loongarch64/openjdk:11-jre-slim` 是一个可用的镜像
    FROM loongarch64/openjdk:11-jre-slim
    
    # 设置环境变量
    ENV NEXUS_HOME=/opt/nexus \
        NEXUS_DATA=/nexus-data \
        SONATYPE_WORK=/nexus-data \
        JAVA_MIN_MEM=1024M \
        JAVA_MAX_MEM=4096M \
        JAVA_OPTS="-server -XX:MaxDirectMemorySize=2G -Djava.net.preferIPv4Stack=true"
    
    # 创建 nexus 用户和组 (UID/GID 1000)
    RUN groupadd -r -g 1000 nexus && \
        useradd -r -u 1000 -g nexus -m -s /bin/bash nexus
    
    # 将我们之前解压的 Nexus 文件复制到镜像中
    COPY nexus /opt/nexus/
    COPY sonatype-work /nexus-data/
    
    # 调整目录权限
    RUN chown -R nexus:nexus /opt/nexus /nexus-data
    
    # 暴露 Nexus 默认端口
    EXPOSE 8081
    
    # 设置工作目录和用户
    WORKDIR /opt/nexus
    USER nexus
    
    # 启动 Nexus
    CMD ["bin/nexus", "run"]
    

    关键解释

    • FROM : 这是最关键的一步。你必须找到一个能在龙芯上运行的 OpenJDK 11 JRE 基础镜像。可能需要从龙芯社区或操作系统厂商处获取。
    • JAVA_MAX_MEM : 设置了 JVM 最大堆内存为 4GB,可根据服务器内存调整。
    • COPY : 将宿主机上准备好的 Nexus 文件复制到镜像内。
    • USER nexus : 以非 root 用户运行容器,符合安全最佳实践。
  2. 构建自定义的 Nexus 镜像。

    cd /opt/nexus
    sudo docker build -t nexus-loongarch:3.xx.x .
    

    构建时间取决于网络和服务器性能。完成后,使用 sudo docker images 查看镜像。

3.3 使用 Docker Compose 编排运行(推荐)

为了便于管理容器配置(如端口、卷、环境变量),建议使用 Docker Compose。

  1. 安装 Docker Compose。

    # 从 GitHub 发布页下载适用于 Linux 的二进制文件(确认有 loongarch64 版本)
    # 示例(版本号需替换):
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.xx.x/docker-compose-linux-loongarch64" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    docker-compose --version
    
  2. 创建 docker-compose.yml 文件。

    version: '3.8'
    
    services:
      nexus:
        image: nexus-loongarch:3.xx.x # 使用刚才构建的镜像
        container_name: nexus-loongarch
        restart: unless-stopped
        ports:
          - "8081:8081" # 宿主端口:容器端口
        volumes:
          - /data/nexus-data:/nexus-data:Z # 持久化数据卷
          # - /opt/nexus/nexus/etc:/opt/nexus/etc:Z # 可选:挂载配置目录,方便修改
        environment:
          - INSTALL4J_ADD_VM_PARAMS=-Xms1024M -Xmx4096M -XX:MaxDirectMemorySize=2G
        ulimits:
          nofile:
            soft: 65536
            hard: 65536
    

    配置详解

    • volumes : 将宿主机的 /data/nexus-data 目录挂载到容器的 /nexus-data ,这样 Nexus 的所有仓库数据、配置、日志都会持久化,即使容器删除也不会丢失数据。
    • environment : INSTALL4J_ADD_VM_PARAMS 是 Nexus 识别的环境变量,用于传递 JVM 参数,这里覆盖了 Dockerfile 中的部分设置。
    • ulimits : 提高容器的文件描述符限制,防止 Nexus 在处理大量连接时出错。
  3. 启动 Nexus 服务。

    # 在 docker-compose.yml 所在目录执行
    sudo docker-compose up -d
    
  4. 查看容器状态和日志,确认启动成功。

    sudo docker-compose ps
    sudo docker-compose logs -f nexus # 持续查看日志,直到看到“Started Sonatype Nexus”字样
    

    初始启动可能需要 1-3 分钟,因为 Nexus 需要初始化内部数据库。

4. Nexus 初始配置与基础仓库管理

当容器日志显示 Nexus 已启动后,即可通过浏览器进行访问和配置。

4.1 首次登录与初始化

  1. 打开浏览器,访问 http://<你的龙芯服务器IP>:8081
  2. 点击右上角“Sign in”登录。默认管理员用户名是 admin
  3. 初始密码存储在数据目录下的 admin.password 文件中。在宿主机上查看:
    sudo cat /data/nexus-data/admin.password
    
    复制密码,登录系统。
  4. 登录后,系统会强制要求修改密码、设置是否允许匿名访问(建议根据安全策略选择,学习环境可允许)并完成初始化。

4.2 创建代理仓库与仓库组

Nexus 的核心功能是管理仓库。我们以最常用的 Maven 仓库为例。

  1. 创建代理仓库(Proxy Repository) :用于代理远程中央仓库(如 Maven Central)。

    • 导航到 Settings (齿轮图标) -> Repository -> Repositories
    • 点击 Create repository
    • 选择 maven2 (proxy)
    • 填写基本信息:
      • Name: maven-central
      • Remote storage: https://repo1.maven.org/maven2/
    • 其他保持默认,点击 Create repository
  2. 创建宿主仓库(Hosted Repository) :用于存储团队内部发布的私有构件。

    • Create repository -> maven2 (hosted)
    • Name: maven-releases (用于发布正式版本)
    • Version policy: Release
    • 同理,创建 maven-snapshots ,Version policy 选择 Snapshot
  3. 创建仓库组(Repository Group) :将多个仓库聚合,对外提供一个统一的访问地址。

    • Create repository -> maven2 (group)
    • Name: maven-public
    • Member repositories 列表中,将左侧的 maven-central (代理仓库)、 maven-releases maven-snapshots 添加到右侧。
    • 顺序决定了构件查找的优先级,通常将速度快的或私有的放前面。

4.3 配置 Maven 客户端使用 Nexus

开发者的 Maven 需要指向这个私服。

  1. 找到仓库组的地址。在 Repositories 列表中找到 maven-public ,点击其 URL(通常是 http://<服务器IP>:8081/repository/maven-public/ )。

  2. 在开发机的 Maven settings.xml ( ~/.m2/settings.xml $MAVEN_HOME/conf/settings.xml ) 中配置镜像和服务器认证。

    <settings>
      <mirrors>
        <mirror>
          <id>nexus-loongarch</id>
          <name>Nexus LoongArch Mirror</name>
          <url>http://<你的龙芯服务器IP>:8081/repository/maven-public/</url>
          <mirrorOf>*</mirrorOf> <!-- 匹配所有仓库,所有请求都走私服 -->
        </mirror>
      </mirrors>
      <servers>
        <server>
          <id>nexus-releases</id> <!-- 此id需与pom.xml中distributionManagement的id对应 -->
          <username>admin</username>
          <password>你的管理员密码</password>
        </server>
        <server>
          <id>nexus-snapshots</id>
          <username>admin</username>
          <password>你的管理员密码</password>
        </server>
      </servers>
    </settings>
    
  3. 在项目的 pom.xml 中配置发布地址(如果需要发布构件)。

    <distributionManagement>
        <repository>
            <id>nexus-releases</id>
            <url>http://<你的龙芯服务器IP>:8081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <url>http://<你的龙芯服务器IP>:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
    

5. 生产环境配置、维护与故障排查

将 Nexus 用于生产环境,仅完成基础部署是不够的,还需要考虑性能、安全、备份和监控。

5.1 性能调优与 JVM 参数

Nexus 性能瓶颈通常在 I/O 和内存。通过环境变量调整 JVM 参数。

修改 docker-compose.yml 中的 INSTALL4J_ADD_VM_PARAMS

environment:
  - INSTALL4J_ADD_VM_PARAMS=-Xms4g -Xmx4g -XX:MaxDirectMemorySize=4g -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Djava.net.preferIPv4Stack=true
  • -Xms4g -Xmx4g :将初始堆和最大堆设为相同值,避免运行时调整。
  • -XX:+UseZGC :使用 Z Garbage Collector,适用于大内存、低延迟场景(JDK 11+)。在龙芯平台上,需测试其稳定性。
  • -Djava.net.preferIPv4Stack=true :强制使用 IPv4,避免一些网络解析问题。

注意:修改 JVM 参数后需要重启容器: sudo docker-compose restart nexus

5.2 安全加固建议

  1. 修改默认端口 :在 docker-compose.yml 中修改端口映射,如 - "18081:8081"
  2. 使用强密码 :务必修改默认 admin 密码,并创建具有最小权限的角色和用户供日常使用。
  3. 启用 HTTPS :准备 SSL 证书,并通过反向代理(如 Nginx)为 Nexus 提供 HTTPS 终端。在 Docker Compose 中,可以让 Nexus 容器只暴露给内部网络,由 Nginx 容器对外服务。
  4. 定期备份 :备份 Nexus 数据目录 ( /data/nexus-data )。最安全的方式是停止 Nexus 容器后进行文件系统备份。
    sudo docker-compose stop nexus
    tar -czf /backup/nexus-data-$(date +%Y%m%d).tar.gz -C /data nexus-data
    sudo docker-compose start nexus
    
  5. 日志轮转与监控 :Nexus 日志在数据目录的 log 子目录下。确保宿主机有足够的磁盘空间,或配置日志轮转。可以配置日志收集系统(如 ELK)进行集中监控。

5.3 常见问题与排查路径

在龙芯平台上部署,除了通用问题,还需关注架构兼容性。

问题现象 可能原因 检查与解决步骤
容器启动后立即退出 1. 基础镜像不兼容 LoongArch。
2. JVM 参数错误导致崩溃。
3. 数据目录权限问题。
1. 查看容器日志: sudo docker-compose logs nexus
2. 确认 FROM 的基础镜像标签正确且支持 LoongArch。
3. 检查 /data/nexus-data 目录的所有者是否为 UID 1000。
能访问 Web 页面但极慢或卡顿 1. JVM 堆内存设置过小。
2. 宿主机内存不足。
3. 数据库初始化或损坏。
1. 检查容器内存使用: sudo docker stats
2. 增大 -Xmx 参数,并确保宿主机有足够物理内存。
3. 查看 nexus-data/log 下的日志,是否有 OrientDB 相关错误。
Maven 客户端无法从私服下载构件 1. 网络不通或防火墙阻止。
2. Nexus 仓库组配置错误。
3. 客户端 settings.xml 配置错误。
1. 在服务器上 curl http://localhost:8081/service/rest/v1/status 测试 Nexus 本身。
2. 在客户端 curl http://<服务器IP>:8081/repository/maven-public/ 测试网络。
3. 检查 Nexus 中 maven-public 组是否包含了目标仓库。
上传(Deploy)构件失败,返回 401/403 1. settings.xml <server> 的 id 与 pom.xml 中不匹配。
2. 用户名密码错误。
3. 对应用户没有对应仓库的部署权限。
1. 核对 pom.xml 中的 distributionManagement id settings.xml <server> id
2. 在 Nexus 界面检查用户密码和权限。
磁盘空间快速耗尽 1. 快照(Snapshot)构件未设置清理策略。
2. Docker 镜像层或日志堆积。
1. 在 Nexus 中为快照仓库设置“清理策略”,定期删除旧快照。
2. 清理 Docker: sudo docker system prune -a (谨慎操作)。
3. 监控 /data 目录大小。

5.4 后续扩展方向

  1. 配置 Docker 私有仓库 :在 Nexus 中创建 docker (hosted) 仓库,并配置 Docker 客户端使用它。这需要在 Nexus 中启用 Docker 仓库功能,并在 Docker 客户端配置 insecure-registries (对于 HTTP)或配置证书(对于 HTTPS)。
  2. 配置 npm 私有仓库 :为前端项目创建 npm (proxy) npm (hosted) 仓库,统一管理 npm 包。
  3. 高可用部署 :对于关键生产环境,可以考虑 Nexus 集群部署,但这需要企业版许可证。社区版可通过备份恢复方案保证数据安全。
  4. 与 CI/CD 集成 :将 Jenkins、GitLab CI 等工具与 Nexus 对接,实现构建产物的自动上传和依赖的自动拉取。

在龙芯架构上部署整套软件生态是一个循序渐进的过程。成功部署 Nexus 私有仓库,不仅是获得了一个工具,更是为整个团队的国产化开发流程奠定了坚实的基石。后续的重点应放在仓库内容的持续丰富、权限的精细化管理以及与上下游工具的流畅集成上。

更多推荐