龙芯平台Docker部署Nexus 3:国产化DevOps制品仓库实践

龙芯平台Docker部署Nexus 3:国产化DevOps制品仓库实践
在国产化技术栈的实践中将成熟的 DevOps 工具链迁移到龙芯等自主 CPU 平台是常见的需求。Nexus Repository Manager 作为一款强大的制品仓库管理器能够统一管理 Maven、npm、Docker 等多种类型的依赖包对于构建企业内部的持续集成/持续交付CI/CD体系至关重要。本文将以龙芯 3B6000 平台为基础详细介绍如何从零开始使用 Docker 容器化技术部署 Nexus 3.x 版本并确保其稳定运行。整个过程将涵盖环境准备、Docker 安装、Nexus 容器化部署、基础配置、访问验证以及生产环境下的关键注意事项。无论你是负责国产化环境运维的工程师还是需要在龙芯平台上搭建开发环境的开发者都能按照本文的步骤完成部署。1. 理解龙芯平台与 Docker 部署的适配要点在龙芯 3B6000 这样的 LoongArch 架构平台上进行软件部署首要任务是理解其与常见的 x86_64 或 ARM 平台的差异。这些差异直接影响到软件包获取、依赖兼容性和运行时行为。1.1 龙芯 3B6000 平台特性龙芯 3B6000 采用 LoongArch 指令集架构。这意味着绝大多数为 x86_64 编译的二进制软件无法直接运行。部署软件通常有三种途径源码编译获取软件源代码在龙芯平台上使用 GCC 等工具链进行本地编译。这种方式兼容性最好但耗时较长且对复杂软件的依赖管理要求高。使用龙芯社区提供的二进制包龙芯社区或操作系统发行版如 Loongnix、UOS会维护一个针对 LoongArch 架构的软件仓库可以通过包管理器如apt、yum直接安装。这是最推荐的方式。使用 Docker 等容器技术容器技术将应用及其依赖打包在一起理论上只要容器镜像提供了 LoongArch 版本就可以跨平台运行。这极大地简化了在特定架构上的软件部署复杂度。对于 Nexus 这类复杂的 Java 应用通过 Docker 部署能有效屏蔽底层架构差异和复杂的 Java 环境配置问题是龙芯平台上的优选方案。1.2 Docker 在龙芯平台上的工作模式Docker 利用 Linux 内核的命名空间和控制组cgroups等功能实现容器隔离。在龙芯平台上运行 Docker核心是获取支持 LoongArch 架构的 Docker 引擎即dockerd以及相应的 LoongArch 架构容器镜像。幸运的是随着生态发展主流开源软件的 Docker 官方镜像或社区镜像逐渐开始提供多架构支持包括linux/loong64。我们的任务就是确保在龙芯 3B6000 上正确安装 Docker 引擎。拉取支持linux/loong64架构的 Nexus 镜像或确认其基础镜像如 Eclipse Temurin JRE支持该架构。进行正确的配置和数据持久化。2. 龙芯 3B6000 平台环境准备与 Docker 安装部署前需要确保操作系统基础环境就绪。本文以基于 Debian 的 Loongnix 或 UOS 系统为例其他发行版命令可能略有不同。2.1 系统更新与基础工具安装首先更新系统包列表并安装一些必要的工具。sudo apt update sudo apt upgrade -y sudo apt install -y curl wget vim net-tools ca-certificates software-properties-common apt-transport-https gnupg lsb-release2.2 安装 Docker 引擎龙芯平台上的 Docker 安装通常需要通过龙芯社区提供的软件源。以下是一种通用的安装方法。卸载旧版本如有sudo apt remove docker docker-engine docker.io containerd runc添加 Docker 官方 GPG 密钥可选用于验证包完整性和设置仓库。对于龙芯我们需要添加针对 LoongArch 的仓库。具体仓库地址请参考当前龙芯社区或你所使用的操作系统发行版的最新文档。以下是一个示例流程# 添加 Docker 的官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 针对 Debian 系系统设置稳定版仓库注意架构是 loong64 echo \ deb [archloong64 signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null注意download.docker.com可能尚未正式提供loong64架构的包。更可靠的方式是使用龙芯社区移植的 Docker 包。例如在 Loongnix 上可以直接从系统默认源安装sudo apt install docker.io安装 Docker 引擎sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io如果使用docker.io包则命令为sudo apt install -y docker.io。验证 Docker 安装sudo docker --version sudo docker run hello-world如果hello-world镜像不存在Docker 会尝试拉取。你需要确认是否存在linux/loong64架构的hello-world镜像。如果没有可以尝试拉取一个明确支持多架构的镜像进行测试例如busybox:latest。sudo docker run --rm busybox:latest echo Hello from LoongArch!可选将当前用户加入 docker 组避免每次使用docker命令都需要sudo。sudo usermod -aG docker $USER执行此命令后需要注销并重新登录或者新开一个终端用户组更改才会生效。2.3 配置 Docker 镜像加速器从 Docker Hub 拉取镜像可能速度较慢尤其是对于较大的镜像。建议配置国内镜像加速器。编辑 Docker 守护进程配置文件/etc/docker/daemon.json如果文件不存在则创建sudo vim /etc/docker/daemon.json输入以下内容以腾讯云镜像加速器为例你也可以替换为阿里云、中科大等加速地址{ registry-mirrors: [ https://mirror.ccs.tencentyun.com ] }保存并退出然后重新加载配置并重启 Docker 服务sudo systemctl daemon-reload sudo systemctl restart docker检查配置是否生效sudo docker info | grep -A 1 Registry Mirrors3. 部署 Nexus Repository Manager 3Nexus 3 官方提供了 Docker 镜像sonatype/nexus3。我们需要确认该镜像是否支持linux/loong64架构。可以通过访问 Docker Hub 页面或使用docker manifest inspect命令查看。如果官方镜像不支持则需要寻找社区维护的 LoongArch 版本或者基于支持 LoongArch 的 JRE 镜像自行构建。3.1 拉取 Nexus 镜像假设我们已经找到了一个支持linux/loong64的 Nexus 3 镜像例如一个社区维护的版本标签为3.61.0。sudo docker pull sonatype/nexus3:3.61.0重要在实际操作前请务必使用docker manifest inspect sonatype/nexus3:3.61.0命令检查该标签是否包含linux/loong64架构。如果不存在你需要搜索如nexus3-loong64这类由社区移植的镜像并替换下面的镜像名称。拉取完成后查看镜像sudo docker images | grep nexus3.2 创建持久化数据目录Nexus 的数据仓库内容、配置、日志等必须存储在容器外部以保证容器重建或升级时数据不丢失。# 创建一个目录用于存放 Nexus 的所有持久化数据 sudo mkdir -p /opt/nexus-data # 为了容器内进程能正常写入需要修改目录权限Nexus 容器默认以 UID 200 运行 sudo chown -R 200:200 /opt/nexus-datachown 200:200是因为官方 Nexus 镜像内部使用了一个 UID 为 200 的用户nexus来运行进程。确保数据目录属于该用户可以避免权限错误。3.3 运行 Nexus 容器使用docker run命令启动容器。以下是关键参数的解释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-Xms512m -Xmx1024m -XX:MaxDirectMemorySize2g \ sonatype/nexus3:3.61.0-d后台运行容器。--name nexus为容器指定一个名称便于管理。--restart unless-stopped设置容器重启策略除非手动停止否则退出后自动重启适用于服务。-p 8081:8081将宿主机的 8081 端口映射到容器的 8081 端口Nexus Web 管理界面。-p 8082:8082映射 8082 端口用于 Docker 私有仓库的推送和拉取如果需要。-v /opt/nexus-data:/nexus-data将宿主机目录/opt/nexus-data挂载到容器内的/nexus-data目录实现数据持久化。-e INSTALL4J_ADD_VM_PARAMS设置 Nexus 的 JVM 参数。-Xms和-Xmx分别设置堆内存初始大小和最大值。根据服务器内存调整对于小型团队-Xms512m -Xmx1024m是合理的起点。-XX:MaxDirectMemorySize设置直接内存大小对于处理大量文件的仓库很重要。sonatype/nexus3:3.61.0使用的镜像名称和标签。3.4 检查容器状态与日志启动后检查容器是否正常运行sudo docker ps | grep nexus如果状态是Up说明容器已启动。查看容器启动日志确认 Nexus 初始化过程是否正常sudo docker logs -f nexus初始化可能需要 1-3 分钟。当你看到日志中出现类似Started Sonatype Nexus的信息时说明服务已就绪。此时可以按CtrlC退出日志跟踪。4. 初始访问与基础配置4.1 访问 Nexus Web 界面在浏览器中访问http://你的龙芯服务器IP:8081。首次访问会经历一个较长的加载过程初始化数据库等。加载完成后点击右上角Sign in登录。默认管理员用户名admin初始密码需要从容器内的文件中获取。执行以下命令sudo docker exec nexus cat /nexus-data/admin.password将输出的密码复制到登录框完成登录。4.2 完成初始化向导登录后系统会强制要求你修改管理员密码设置一个强密码并妥善保存。配置匿名访问选择是否允许匿名用户未登录从仓库下载组件。根据安全策略决定测试环境可以启用。4.3 创建 Blob 存储和仓库Nexus 的核心功能是管理仓库。仓库需要关联一个 Blob 存储实际存储文件的地方。通常默认的defaultBlob 存储对应/nexus-data/blobs/default就够用了。我们以创建一个代理阿里云 Maven 中央仓库的代理仓库为例点击顶部齿轮图标进入Administration区域。在左侧菜单选择Repository Repositories。点击Create repository。选择仓库类型为maven2 (proxy)。填写配置信息Name:aliyun-maven-centralRemote storage:https://maven.aliyun.com/repository/central(阿里云 Maven 镜像地址)Blob store: 选择default其他选项保持默认点击Create repository。现在你的项目中就可以将aliyun-maven-central作为仓库地址来加速依赖下载了。4.4 可选配置 Docker 私有仓库如果需要托管 Docker 镜像需要创建一个docker (hosted)类型的仓库并配置相应的访问端口。创建仓库Repository Repositories Create repository。选择docker (hosted)。Name:docker-hostedHTTP: 填写一个端口例如8083。注意这个端口是容器内 Nexus 服务监听 Docker 请求的端口需要与后续的容器运行参数或反向代理配置对应。Blob store:default创建完成。配置 Docker 客户端 要让 Docker 客户端能向这个私有仓库推送和拉取镜像需要在 Docker 客户端配置中信任这个仓库因为默认使用 HTTP。 在龙芯服务器或其他客户端机器上编辑或创建/etc/docker/daemon.json添加insecure-registries{ insecure-registries: [your-nexus-ip:8083], registry-mirrors: [https://mirror.ccs.tencentyun.com] }然后重启 Dockersudo systemctl restart docker。登录与操作# 登录到私有仓库使用 Nexus 管理员或具有相应权限的用户 sudo docker login your-nexus-ip:8083 # 给本地镜像打标签 sudo docker tag your-image:tag your-nexus-ip:8083/your-image:tag # 推送镜像 sudo docker push your-nexus-ip:8083/your-image:tag # 拉取镜像 sudo docker pull your-nexus-ip:8083/your-image:tag5. 生产环境关键配置与优化将 Nexus 用于生产环境需要考虑性能、安全性和可维护性。5.1 JVM 参数调优JVM 参数对 Nexus 性能影响巨大。通过环境变量INSTALL4J_ADD_VM_PARAMS传递。以下是一个适用于 8GB 内存服务器的示例-e INSTALL4J_ADD_VM_PARAMS-Xms2g -Xmx4g -XX:MaxDirectMemorySize4g -XX:UnlockDiagnosticVMOptions -XX:LogVMOutput -XX:LogFile/nexus-data/log/jvm.log -Djava.net.preferIPv4Stacktrue-Xms2g -Xmx4g根据系统内存调整建议Xmx不超过系统物理内存的 50%-70%。-XX:MaxDirectMemorySize应至少与-Xmx设置相同或更大。-XX:LogVMOutput和-XX:LogFile将 JVM 日志输出到文件便于排查 GC 等问题。-Djava.net.preferIPv4Stacktrue强制使用 IPv4避免在某些网络环境下出现解析问题。5.2 数据备份策略Nexus 的数据目录 (/nexus-data) 包含了所有配置、组件和数据库。定期备份至关重要。简单文件备份停止 Nexus 容器然后打包备份/opt/nexus-data目录。sudo docker stop nexus tar -czf nexus-data-backup-$(date %Y%m%d).tar.gz -C /opt nexus-data sudo docker start nexus使用 Nexus 内置任务Nexus 提供了创建备份文件的任务Adminstration - System - Tasks - Create backup。备份文件会生成在/nexus-data/backup目录下你需要再将该目录下的文件备份到远程存储。5.3 使用 Docker Compose 管理使用docker-compose.yml文件可以更清晰地定义服务方便版本控制和一键启停。创建docker-compose.yml文件version: 3.8 services: nexus: image: sonatype/nexus3:3.61.0 # 确认镜像标签 container_name: nexus restart: unless-stopped ports: - 8081:8081 - 8082:8082 environment: - INSTALL4J_ADD_VM_PARAMS-Xms2g -Xmx4g -XX:MaxDirectMemorySize4g volumes: - /opt/nexus-data:/nexus-data然后使用sudo docker-compose up -d启动服务。5.4 配置反向代理与 HTTPS直接暴露 8081 端口不安全建议使用 Nginx 或 Apache 作为反向代理并配置 HTTPS。一个简单的 Nginx 配置示例 (/etc/nginx/conf.d/nexus.conf)server { listen 80; server_name nexus.your-domain.com; # 重定向到 HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name nexus.your-domain.com; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location / { proxy_pass http://localhost:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 0; # 禁用上传大小限制便于推送大镜像 } }配置后重启 Nginxsudo systemctl restart nginx。6. 常见问题排查在龙芯平台上部署除了通用问题还需关注架构兼容性。6.1 容器启动失败问题现象可能原因检查方式处理建议standard_init_linux.go:228: exec user process caused: exec format error镜像架构与宿主机不匹配。拉取的镜像不是linux/loong64。docker image inspect 镜像名grep -i architectureCannot create container: invalid mount pathDocker 数据目录挂载路径错误或权限不足。检查docker run命令中的-v参数路径是否存在。检查/opt/nexus-data目录的权限应为200:200。创建目录并正确设置权限sudo mkdir -p /opt/nexus-data sudo chown -R 200:200 /opt/nexus-data容器不断重启日志显示Unable to start JVM或内存错误JVM 内存参数设置不当超出了容器或系统可用内存。docker logs nexus查看错误日志。free -h检查系统可用内存。调低-Xmx和-XX:MaxDirectMemorySize参数值。确保 Docker 容器有足够的内存限制使用-m参数。6.2 Nexus 服务无法访问问题现象可能原因检查方式处理建议浏览器无法连接http://IP:8081防火墙未开放端口容器端口映射错误Nexus 进程未启动成功。sudo docker ps查看容器状态和端口映射。sudo netstat -tlnpgrep 8081查看端口监听。sudo iptables -L -n或sudo firewall-cmd --list-all 检查防火墙。可以访问 Web 界面但非常慢JVM 堆内存或直接内存不足服务器资源CPU/磁盘 IO瓶颈网络问题。登录 Nexus查看Support - System Information中的 JVM 内存使用情况。使用top,iostat监控服务器资源。增加 JVM 内存参数。检查磁盘是否为 SSD。优化网络或考虑将数据目录放在高性能存储上。登录后提示“Unable to create directory”等权限错误挂载的数据目录 (/nexus-data) 权限不正确Nexus 进程UID 200无法写入。ls -ld /opt/nexus-data查看目录属主和权限。进入容器检查docker exec -it nexus bash -c ls -ld /nexus-data在宿主机上执行sudo chown -R 200:200 /opt/nexus-data。确保 SELinux 或 AppArmor 未阻止访问可尝试临时禁用测试。6.3 仓库代理或组件下载失败问题现象可能原因检查方式处理建议配置了代理仓库但无法下载依赖网络不通远程仓库地址错误代理仓库配置问题如认证。在 Nexus 服务器上使用curl测试远程仓库地址。检查代理仓库的Remote storageURL。查看 Nexus 任务日志 (Support - Logging - Log viewer)。确保服务器能访问外网。检查远程仓库地址。如果远程仓库需要认证在代理仓库配置中填写用户名密码。检查防火墙是否放行相关出站流量。Docker 客户端无法推送/拉取镜像到私有仓库Docker 客户端未配置insecure-registriesNexus 的 Docker 仓库端口未正确映射或防火墙阻止。docker info查看Insecure Registries列表。docker login测试登录。检查 Nexus 容器是否映射了 Docker 仓库端口如-p 8083:8083。在客户端/etc/docker/daemon.json中添加insecure-registries并重启 Docker。确保docker run命令映射了正确的端口。在龙芯平台上成功部署 Nexus标志着你在国产化环境中搭建起了关键的 DevOps 基础设施。后续可以根据团队需要继续配置 npm、PyPI、NuGet 等其他类型的仓库代理并集成到 CI/CD 流程中。记住定期备份数据和监控服务状态是生产运维的基石。对于性能调优除了 JVM 参数还应关注存储 I/O 和网络带宽这些往往是制品仓库的性能瓶颈所在。