龙芯3B6000平台Docker私有镜像仓库Nexus3部署实战指南 在国产化替代浪潮中龙芯平台的应用部署成为许多开发者和运维团队必须面对的课题。最近在龙芯 3B6000 服务器上搭建私有镜像仓库 Nexus 时发现针对该平台的完整、可落地的 Docker 化部署教程相对零散。本文将系统梳理在龙芯 3B6000 架构LoongArch上从 Docker 环境准备到 Nexus 3 私有仓库完整部署、配置及日常维护的全流程实战。无论你是初次接触龙芯平台的开发者还是需要在国产化环境中构建 CI/CD 流水线的运维工程师都能按照本文步骤成功搭建一个稳定、高效的私有制品仓库。1. 背景与核心概念在深入部署之前我们有必要厘清几个核心概念及其在本次实践中的角色。1.1 龙芯 3B6000 与 LoongArch 架构龙芯 3B6000 是龙芯中科推出的新一代高性能通用处理器采用完全自主的 LoongArch 指令集架构。与常见的 x86_64 或 ARM 架构不同LoongArch 是独立的指令集这意味着许多为 x86/ARM 预编译的软件无法直接运行。在软件生态上我们需要寻找或编译适用于 LoongArch 的版本。Docker 镜像也是如此一个标准的基于x86_64的nginx:alpine镜像无法在龙芯机器上直接运行必须使用基于loong64架构的镜像。1.2 Docker 与多架构支持Docker 是一个开源的应用容器引擎它允许开发者将应用及其依赖打包到一个可移植的容器中。Docker 本身是跨平台的但其运行的容器镜像有严格的架构要求。幸运的是Docker 从较新版本开始支持buildx工具可以构建和运行多架构镜像。对于龙芯平台我们需要关注的是linux/loong64这个平台标识。在部署时我们必须确保拉取的镜像支持此架构或有能力从源码构建。1.3 Nexus Repository Manager 3Nexus Repository Manager 3简称 Nexus 3是 Sonatype 公司开发的一款强大的仓库管理器。它支持管理多种格式的制品Artifact例如Maven(Java)npm(JavaScript)Docker(容器镜像)PyPI(Python)Raw(任意文件)等等在团队开发中使用 Nexus 可以带来诸多好处加速构建缓存公共仓库、提升稳定性隔离外网波动、保障安全扫描组件漏洞以及实现制品统一管理。在龙芯环境下由于网络和架构的特殊性一个本地的 Nexus 仓库显得尤为重要它可以缓存常用的 LoongArch 架构的基础镜像和依赖包极大提升开发部署效率。2. 环境准备与版本说明本次实战的环境基于一台物理的龙芯 3B6000 服务器。以下版本信息基于实际测试但软件迭代迅速请读者在操作时以官方最新文档为准核心思路和步骤是相通的。操作系统: Kylin V10 (SP1) 或 openEuler 22.03内核版本 4.19 以上。处理器: 龙芯 3B6000 (LoongArch 架构)。Docker: 社区版 Docker Engine。由于龙芯架构无法使用 Docker Desktop我们通过命令行安装。Nexus: 我们选择使用 Sonatype 官方提供的 Nexus 3 镜像。关键点在于我们需要一个能在linux/loong64上运行的镜像。目前官方未直接提供但社区有维护的版本或我们可以通过其他方式获取。重要提示以下所有操作如无特别说明均在root用户或拥有sudo权限的用户下执行。生产环境请严格遵守最小权限原则。3. Docker 环境安装与配置这是所有后续步骤的基础。在龙芯架构上安装 Docker通常需要通过操作系统自带的包管理器或从源码编译。这里我们采用相对简单的包管理器安装方式。3.1 安装 Docker Engine以 openEuler 22.03 (LoongArch) 为例安装步骤如下卸载旧版本如有sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine安装必要的依赖包sudo yum install -y yum-utils device-mapper-persistent-data lvm2配置稳定的 Docker 仓库 对于龙芯架构我们需要添加针对 LoongArch 的 Docker CE 仓库。openEuler 的源中通常已包含。sudo yum-config-manager --add-repo https://download.docker.com/linux/euler/docker-ce.repo注意如果该源速度慢或不适用可能需要替换为国内镜像源例如华为云或清华大学的 openEuler 镜像源中的docker-ce包。安装 Docker Engine 及相关组件sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin这个命令会安装 Docker 引擎、CLI 工具、容器运行时containerd以及 Docker Compose 插件。启动并设置开机自启sudo systemctl start docker sudo systemctl enable docker验证安装sudo docker run hello-world如果安装成功你会看到来自 Docker 的欢迎信息。但请注意hello-world镜像可能没有loong64版本这个命令主要是测试 Docker 守护进程是否正常运行。你可以尝试运行一个已知支持 LoongArch 的镜像例如sudo docker run --rm -it cr.loongnix.cn/library/alpine:3.19 uname -m预期输出应为loongarch64这证明 Docker 可以正确拉取和运行 LoongArch 架构的容器。3.2 配置 Docker 镜像加速器在国内网络环境下从 Docker Hub 拉取镜像速度很慢甚至可能失败。我们需要配置镜像加速器特别是对于龙芯架构一些加速器可能提供了loong64的镜像缓存。创建或修改 Docker 守护进程配置文件/etc/docker/daemon.jsonsudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://cr.loongnix.cn ], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m }, storage-driver: overlay2 } EOF这里我们添加了三个镜像源其中https://cr.loongnix.cn是龙芯生态社区提供的容器镜像仓库对于 LoongArch 架构的镜像支持最好必须添加。重新加载配置并重启 Dockersudo systemctl daemon-reload sudo systemctl restart docker验证加速器是否生效sudo docker info | grep -A 5 Mirrors在输出中你应该能看到刚才配置的镜像地址。4. 获取与运行 Nexus 3 镜像这是最关键的一步。Sonatype 官方 Docker Hub 仓库 (sonatype/nexus3) 目前不提供linux/loong64架构的镜像。因此我们有几种选择使用社区移植的镜像龙芯社区或国内其他组织可能已经移植并提供了可用的镜像。自行构建镜像从 Nexus 的发行版.tar.gz文件开始编写Dockerfile进行构建。经过调研龙芯开源社区cr.loongnix.cn提供了移植好的 Nexus 3 镜像这无疑是最便捷的方式。4.1 拉取龙芯社区版 Nexus 镜像sudo docker pull cr.loongnix.cn/sonatype/nexus3:latest使用docker images命令查看拉取的镜像确认其架构。sudo docker images cr.loongnix.cn/sonatype/nexus3:latest输出应包含该镜像的 ID、大小等信息。4.2 创建持久化数据目录Nexus 的数据仓库内容、配置、日志等需要存储在宿主机上以便容器重建或升级时数据不丢失。# 创建一个目录用于存放所有数据这里以 /opt/nexus-data 为例 sudo mkdir -p /opt/nexus-data # 为了容器内进程能正常读写需要修改目录权限Nexus 默认以 UID 200 运行 sudo chown -R 200:200 /opt/nexus-data权限说明Nexus 容器内的进程默认以用户 ID (UID) 200 运行。将宿主机目录的所有者改为200:200可以避免容器因权限问题启动失败。4.3 首次运行 Nexus 容器现在我们使用docker run命令启动一个 Nexus 容器。sudo docker run -d \ --name nexus \ --restart unless-stopped \ -p 8081:8081 \ -p 8082:8082 \ -v /opt/nexus-data:/nexus-data \ -e INSTALL4J_ADD_VM_PARAMS-Xms2g -Xmx2g -XX:MaxDirectMemorySize2g \ cr.loongnix.cn/sonatype/nexus3:latest参数详解-d: 后台运行容器。--name nexus: 为容器指定一个名称便于管理。--restart unless-stopped: 设置容器自动重启策略除非手动停止否则总是重启。-p 8081:8081: 将容器内的 8081 端口映射到宿主机的 8081 端口。这是 Nexus 的 Web 管理界面端口。-p 8082:8082: 映射 8082 端口。这是 Nexus 用于 Docker 私有仓库服务的端口如果需要的话我们后续会配置。-v /opt/nexus-data:/nexus-data: 将宿主机目录挂载到容器内的数据目录实现数据持久化。-e INSTALL4J_ADD_VM_PARAMS: 设置 Nexus 的 JVM 参数。-Xms和-Xmx设置了堆内存的初始和最大值-XX:MaxDirectMemorySize设置了直接内存大小。根据你的服务器内存情况调整例如4G内存的机器可以设为-Xms1g -Xmx1g。cr.loongnix.cn/sonatype/nexus3:latest: 指定使用的镜像。4.4 检查容器状态与初始化查看容器是否正常运行sudo docker ps | grep nexus如果看到nexus容器状态为Up则表示启动成功。查看容器日志等待初始化完成 Nexus 第一次启动时会解压文件、初始化数据库等需要一些时间1-3分钟。sudo docker logs -f nexus在日志中搜索关键字Started Sonatype Nexus当看到类似下面的输出时表示 Nexus 已启动就绪2024-05-10 10:00:00,0000000 INFO [jetty-main-1] *SYSTEM org.sonatype.nexus.bootstrap.jetty.JettyServer - Started Sonatype Nexus OSS 3.xx.x-xx此时按CtrlC退出日志跟踪。访问 Web 管理界面 打开浏览器访问http://你的服务器IP地址:8081。默认管理员用户名admin初始密码在容器日志中查找。通常日志里会有一行显示admin password: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx你也可以在挂载的数据目录中找到密码文件sudo cat /opt/nexus-data/admin.password使用获取的密码登录系统会强制你修改密码并完成一些初始设置。5. Nexus 基础配置与使用成功登录后我们进行一些必要的配置使其能更好地为我们服务。5.1 配置 Docker 私有仓库HostedNexus 支持多种仓库类型我们首先创建一个 Docker 私有仓库用于存放我们自己构建的镜像。点击顶部导航栏的齿轮图标⚙ (设置)。在左侧菜单栏进入Repository Repositories。点击Create repository。在仓库类型列表中选择docker (hosted)。Name:docker-hosted(可自定义)HTTP: 保持8082端口这是我们之前映射的端口。注意如果你希望使用 HTTPS需要配置 SSL 证书本文暂不涉及。Allow anonymous docker pull: 根据安全需求勾选。如果勾选则拉取此仓库镜像无需认证。Deployment Policy: 选择Allow redeploy允许覆盖推送同一标签的镜像。Storage: 使用默认的defaultBlob Store 即可。点击Create repository完成创建。5.2 配置 Docker 代理仓库Proxy代理仓库用于缓存 Docker Hub 等公共仓库的镜像。当客户端请求一个镜像时Nexus 会先去代理仓库查找如果没有则从远程仓库拉取并缓存到本地下次请求时直接使用缓存极大加速拉取速度并减少对外网依赖。同样在Repository Repositories页面点击Create repository。选择docker (proxy)。Name:docker-proxy(可自定义)HTTP: 端口留空或填8083需要确保此端口在容器启动时已映射我们之前只映射了8081和8082这里可以先不填或使用8082后面通过路由规则区分。Remote storage: 填写远程仓库地址例如 Docker Hub 官方地址https://registry-1.docker.io。对于 LoongArch 镜像更推荐使用龙芯社区镜像源https://cr.loongnix.cn。Docker Index: 选择Use Docker Hub如果远程仓库是 Docker Hub或Registry。点击Create repository。5.3 配置 Docker 仓库组Group仓库组可以将多个仓库如 hosted, proxy聚合起来对外提供一个统一的访问地址。客户端只需要配置这个组的地址就可以从组内所有仓库拉取镜像。在Repository Repositories页面点击Create repository。选择docker (group)。Name:docker-group(可自定义)HTTP: 端口填8082。这意味着我们将使用 8082 端口作为所有 Docker 仓库服务的统一入口。Member repositories: 在左侧列表中选择刚才创建的docker-hosted和docker-proxy点击箭头添加到右侧。顺序很重要Nexus 会按从上到下的顺序在成员仓库中查找镜像。通常把docker-hosted私有镜像放在上面docker-proxy公共缓存放在下面。点击Create repository。至此我们创建了三个仓库一个用于存放私有镜像hosted一个用于代理公共仓库proxy一个将两者组合起来对外提供服务group。我们的客户端Docker 命令将主要与docker-group交互。5.4 配置 Nexus 的 Docker 仓库认证可选但推荐为了安全我们通常禁止匿名访问 hosted 仓库。需要配置认证。在Security Realms中将Docker Bearer Token Realm从Available移动到Active。这允许 Docker 客户端通过令牌认证。在Security Users中可以创建一个专门用于 Docker 操作的用户例如docker-user并为其分配相应的角色权限。最简单的方式是直接使用admin账户但不推荐在生产环境这样做。6. 配置 Docker 客户端使用 Nexus 私有仓库现在我们需要在需要使用这个私有仓库的机器上可以是同一台龙芯服务器也可以是其他机器配置 Docker 客户端。6.1 配置 Docker Daemon 的 Insecure Registry因为我们的 Nexus 默认使用 HTTP非 HTTPS需要告知 Docker 守护进程信任这个仓库地址。在需要拉取/推送镜像的机器上假设是同一台龙芯服务器编辑/etc/docker/daemon.json文件在之前配置的基础上添加insecure-registries字段{ registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://cr.loongnix.cn ], insecure-registries: [ 你的服务器IP:8082 ], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m }, storage-driver: overlay2 }将你的服务器IP替换为 Nexus 服务器的实际 IP 地址例如192.168.1.100:8082。如果 Nexus 就在本机也可以用localhost:8082或127.0.0.1:8082。重要警告insecure-registries仅用于测试或内部受信网络。在生产环境中强烈建议为 Nexus 配置 SSL/TLS 证书使用 HTTPS 通信从而避免此不安全配置。保存文件后重启 Docker 守护进程使配置生效sudo systemctl daemon-reload sudo systemctl restart docker6.2 登录到 Nexus Docker 仓库在推送或拉取私有镜像前需要先登录。sudo docker login 你的服务器IP:8082根据提示输入用户名和密码即 Nexus 的管理员账号或你创建的具有相应权限的账号。6.3 测试镜像推送与拉取拉取一个测试镜像并重新打标签 我们先从公共仓库拉取一个小的、支持 LoongArch 的镜像例如alpine。sudo docker pull cr.loongnix.cn/library/alpine:3.19为它打上指向我们私有仓库的标签。sudo docker tag cr.loongnix.cn/library/alpine:3.19 你的服务器IP:8082/my-alpine:3.19这里my-alpine是你在私有仓库中的项目名可以自定义。推送镜像到私有仓库sudo docker push 你的服务器IP:8082/my-alpine:3.19如果推送成功你会在命令行看到上传进度最终显示pushed和镜像摘要。从私有仓库拉取镜像 为了验证我们先删除本地的这两个镜像然后从私有仓库拉取。sudo docker rmi 你的服务器IP:8082/my-alpine:3.19 sudo docker rmi cr.loongnix.cn/library/alpine:3.19 sudo docker pull 你的服务器IP:8082/my-alpine:3.19拉取成功后使用docker images查看应该能看到来自你私有仓库的镜像。通过代理仓库拉取公共镜像 现在测试代理仓库。尝试拉取一个 Docker Hub 上的镜像比如nginx。由于我们配置了docker-proxy代理到cr.loongnix.cnNexus 会尝试从那里拉取并缓存。sudo docker pull 你的服务器IP:8082/nginx:alpine注意这里拉取的地址是你的服务器IP:8082后面直接跟镜像名nginx:alpine。Nexus 的仓库组docker-group会处理这个请求先在docker-hosted找找不到就去docker-proxy找docker-proxy会从远程仓库拉取。 拉取成功后你可以去 Nexus 的 Web 界面在Browse中查看docker-proxy仓库应该能看到缓存的nginx镜像层。7. 使用 Docker Compose 管理 Nexus推荐使用docker run命令管理容器虽然直接但参数多不易维护和重现。更推荐使用docker-compose或 Docker 自带的compose插件通过一个 YAML 文件来定义和运行服务。创建docker-compose.yml文件 在服务器上选择一个目录例如/opt/nexus-docker创建该文件。sudo mkdir -p /opt/nexus-docker cd /opt/nexus-docker sudo vim docker-compose.yml编写 Compose 文件内容version: 3.8 services: nexus: image: cr.loongnix.cn/sonatype/nexus3:latest container_name: nexus restart: unless-stopped ports: - 8081:8081 # Web UI - 8082:8082 # Docker 仓库端口 environment: - INSTALL4J_ADD_VM_PARAMS-Xms2g -Xmx2g -XX:MaxDirectMemorySize2g volumes: - nexus-data:/nexus-data volumes: nexus-data: driver: local driver_opts: type: none device: /opt/nexus-data o: bind说明我们定义了一个名为nexus的服务。使用volumes定义了名为nexus-data的卷并通过driver_opts将其绑定到宿主机的/opt/nexus-data目录。这是一种更清晰的持久化数据管理方式。环境变量、端口映射与之前的docker run命令一致。使用 Compose 启动服务 确保在docker-compose.yml文件所在目录执行。# 使用 Docker 自带的 compose 插件 sudo docker compose up -d # 或者如果你安装的是独立的 docker-compose 命令 # sudo docker-compose up -d-d参数表示后台运行。管理服务查看日志sudo docker compose logs -f nexus停止服务sudo docker compose stop启动服务sudo docker compose start停止并删除容器数据卷会保留sudo docker compose down停止并删除容器及数据卷危险会删除所有数据sudo docker compose down -v使用 Docker Compose 使得服务的部署、更新和迁移变得极其简单只需维护一个 YAML 文件即可。8. 常见问题与排查思路在龙芯平台部署 Nexus 过程中你可能会遇到一些特有的问题。问题现象可能原因排查思路与解决方案docker pull时报错no matching manifest for linux/loong64 in the manifest list entries1. 拉取的镜像不支持loong64架构。2. Docker 客户端未正确识别主机架构。1. 确认镜像是否存在loong64版本。可去cr.loongnix.cn查找。2. 在龙芯机器上执行uname -m确认输出为loongarch64。3. 尝试使用--platform linux/loong64参数强制指定架构。Nexus 容器启动后Web 界面无法访问 (Connection refused)1. 容器启动失败或正在初始化。2. 防火墙未开放 8081/8082 端口。3. 端口被其他进程占用。1.docker logs nexus查看容器日志等待Started Sonatype Nexus出现。2. 检查防火墙sudo firewall-cmd --list-ports添加端口sudo firewall-cmd --add-port8081/tcp --permanent并重载。3. sudo netstat -tlnpDocker 客户端推送镜像到 Nexus 时报错http: server gave HTTP response to HTTPS clientDocker 守护进程未配置insecure-registries拒绝向非 HTTPS 仓库推送。按6.1章节正确配置/etc/docker/daemon.json中的insecure-registries并重启 Docker。推送镜像时提示denied: requested access to the resource is denied1. 未执行docker login或登录信息已过期。2. 用户没有对应仓库的推送权限。1. 执行docker login 你的服务器IP:8082重新登录。2. 在 Nexus 的Security Users和Security Roles中为用户分配nx-repository-view-*-*-edit等相应权限。Nexus 管理界面登录后修改密码失败或界面卡顿JVM 内存分配不足。Nexus 对内存有一定要求。停止容器修改docker-compose.yml或docker run命令中的INSTALL4J_ADD_VM_PARAMS环境变量适当增加-Xms和-Xmx值如-Xms4g -Xmx4g确保不超过物理机可用内存。通过 Nexus 拉取公共镜像速度依然很慢1. 代理仓库 (docker-proxy) 配置的远程地址网络不佳。2. 未正确使用镜像加速器。1. 将docker-proxy的远程地址改为更快的国内镜像源如https://docker.mirrors.ustc.edu.cn注意确认该源是否支持多架构。对于龙芯首选https://cr.loongnix.cn。2. 确保 Docker 客户端本身的registry-mirrors也配置了加速器。磁盘空间不足Nexus 数据目录快速增长1. 缓存了大量镜像和组件。2. 未配置清理策略。1. 在 Nexus 的Administration Repository Cleanup policies中创建清理策略定期删除旧的、不使用的快照等。2. 定期手动在Browse中浏览并删除无用组件。3. 考虑为/opt/nexus-data挂载更大容量的磁盘。9. 最佳实践与工程建议将 Nexus 投入生产环境使用时以下建议能帮助你构建更健壮、易维护的服务。使用 HTTPS 替代 HTTPinsecure-registries是安全漏洞。为 Nexus 域名申请 SSL 证书可以是内部 CA 颁发的并在 Nexus 和所有 Docker 客户端配置 HTTPS。这涉及修改 Nexus 的jetty.xml配置和 Docker 客户端的daemon.json使用registry配置而非insecure-registries。规划存储与备份Nexus 的数据目录 (/nexus-data) 会持续增长务必将其挂载到有足够空间和 IOPS 的磁盘上如 SSD。建立定期的备份流程。最简单的方法是停止 Nexus 容器然后打包备份整个/opt/nexus-data目录。也可以使用 Nexus 的Administration System Backup功能创建在线备份。权限与角色精细化 不要所有人都用admin账户。根据团队职责创建不同的用户和角色。例如ci-user: 拥有向docker-hosted仓库推送构建产物的权限。dev-user: 拥有从所有仓库拉取的权限但无推送权限。deploy-user: 拥有从特定仓库拉取生产镜像的权限。监控与日志监控 Nexus 服务器的系统资源CPU、内存、磁盘。定期查看 Nexus 的访问日志和系统日志了解使用情况并排查问题。日志文件位于数据目录的log子文件夹下。可以配置 Nexus 的日志级别在Administration Logging中调整。高可用考虑进阶 对于关键生产环境单点 Nexus 存在风险。可以考虑 Nexus Repository Manager OSS 的高可用方案但这通常需要企业版许可。社区版可以尝试通过定期备份和快速恢复来降低风险或者使用负载均衡器后面部署多个 Nexus 实例并共享后端存储此配置复杂需谨慎评估。龙芯平台特定优化镜像来源优先将cr.loongnix.cn作为代理仓库的远程源确保能获取到 LoongArch 架构的镜像。构建镜像对于无法直接获取的 LoongArch 镜像需要在龙芯机器上编写Dockerfile使用docker buildx build --platform linux/loong64进行构建然后推送到自己的docker-hosted仓库形成团队内部的基础镜像库。通过本文的步骤你已经在龙芯 3B6000 服务器上成功搭建了一个功能完整的 Nexus 3 私有制品仓库并配置了 Docker 仓库服务。这套系统不仅解决了龙芯架构下镜像获取难、速度慢的问题还为团队提供了统一的制品管理能力是构建国产化平台 CI/CD 流水线的重要基石。后续你可以进一步探索 Nexus 对 Maven、npm、PyPI 等其他类型仓库的支持将其打造成团队全方位的开发基础设施。如果在实践中遇到新的问题多查看官方文档和社区讨论结合日志进行排查问题大多都能迎刃而解。

本月热点