一、引言:为何需要私有仓库?
在软件开发与运维过程中,依赖管理是核心环节之一。对于Java项目,Maven仓库存储着项目所需的依赖库;对于容器化应用,Docker镜像仓库则是分发和部署的基础。公有仓库(如Maven Central、Docker Hub)虽方便,但在企业环境中存在安全隐患(如依赖篡改)、网络依赖(如访问速度慢)及合规性问题。因此,搭建私有仓库成为保障软件供应链安全、提升构建效率的重要手段。
Nexus Repository Manager 3(Nexus3)是Sonatype推出的开源仓库管理工具,支持多种仓库类型(Maven、Docker、npm、PyPI等),并提供权限控制、代理缓存、元数据管理等功能。通过容器化部署(Podman或Docker),可快速实现高可用、可扩展的私有仓库服务。
二、环境准备与工具选择
1. 容器化工具对比:Podman vs Docker
- Docker:市场占有率最高,生态完善,支持Swarm集群与Kubernetes集成。适合已有Docker环境或需要复杂编排的场景。
- Podman:无守护进程设计,安全性更高,支持rootless模式,兼容Docker CLI。适合对安全性要求高的环境或无Docker依赖的场景。
2. 系统要求
- 操作系统:Linux(推荐CentOS/Ubuntu)、macOS(需Docker Desktop)或Windows(WSL2)。
- 资源:至少2核CPU、4GB内存(生产环境建议8GB+)、20GB以上磁盘空间。
- 网络:开放8081(Nexus3默认HTTP端口)、8443(HTTPS)、5000(Docker仓库,可选)。
3. 安装容器化工具
- Docker安装(以Ubuntu为例):
sudo apt updatesudo apt install docker.iosudo systemctl enable --now dockersudo usermod -aG docker $USER # 添加当前用户到docker组
- Podman安装(以CentOS为例):
sudo dnf install -y podman
三、部署Nexus3容器
1. 拉取Nexus3镜像
# Docker方式docker pull sonatype/nexus3:latest# Podman方式(镜像名相同,命令兼容)podman pull sonatype/nexus3:latest
2. 启动容器
基础启动(仅HTTP)
# Dockerdocker run -d --name nexus3 \-p 8081:8081 \-v nexus-data:/nexus-data \sonatype/nexus3# Podmanpodman run -d --name nexus3 \-p 8081:8081 \-v nexus-data:/nexus-data \sonatype/nexus3
-v nexus-data:/nexus-data:持久化存储配置与仓库数据。- 生产环境建议添加
--restart unless-stopped实现自动重启。
高级配置(HTTPS与Docker仓库)
# 生成自签名证书(示例)mkdir -p /etc/nexus/sslopenssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout /etc/nexus/ssl/nexus.key -out /etc/nexus/ssl/nexus.crt \-subj "/CN=nexus.example.com"# 启动容器(Docker示例)docker run -d --name nexus3 \-p 8081:8081 -p 8443:8443 -p 5000:5000 \-v /etc/nexus/ssl:/nexus-ssl \-v nexus-data:/nexus-data \-e NEXUS_CONTEXT=/ \-e INSTALL4J_ADD_VM_PARAMS="-Djavax.net.ssl.keyStore=/nexus-ssl/nexus.keystore -Djavax.net.ssl.keyStorePassword=changeit" \sonatype/nexus3
- 需将证书转换为PKCS12格式(
.keystore)并配置JVM参数。
四、配置Nexus3仓库
1. 初始设置
- 访问
http://<服务器IP>:8081,默认管理员账号为admin,密码通过以下命令获取:
```bash
Docker方式
docker exec -it nexus3 cat /nexus-data/admin.password
Podman方式
podman exec -it nexus3 cat /nexus-data/admin.password
2. 登录后修改密码,并完成向导(可跳过代理设置)。## 2. 创建Maven仓库1. **托管仓库**:存储私有依赖。- 路径:`Administration > Repository > Repositories > Create repository`。- 选择`maven2 (hosted)`,设置名称为`maven-private`,存储类型为`File`。2. **代理仓库**:缓存远程依赖(如Maven Central)。- 选择`maven2 (proxy)`,设置名称为`maven-central`,远程存储URL为`https://repo.maven.apache.org/maven2/`。3. **仓库组**:聚合多个仓库。- 选择`maven2 (group)`,设置名称为`maven-public`,成员包含`maven-private`和`maven-central`。## 3. 创建Docker仓库1. **托管仓库**:- 路径:`Create repository > docker (hosted)`。- 设置名称为`docker-private`,HTTP端口为`5000`(需与容器端口映射一致),选择`Docker (HTTP)`或`Docker (HTTPS)`。2. **代理仓库**:- 选择`docker (proxy)`,设置名称为`docker-hub`,远程URL为`https://registry-1.docker.io`。3. **仓库组**:- 选择`docker (group)`,设置名称为`docker-public`,成员包含`docker-private`和`docker-hub`。# 五、使用私有仓库## 1. Maven项目配置在`pom.xml`中添加私有仓库:```xml<repositories><repository><id>nexus-private</id><url>http://nexus.example.com:8081/repository/maven-public/</url></repository></repositories>
在settings.xml中配置认证:
<servers><server><id>nexus-private</id><username>deploy-user</username><password>your-password</password></server></servers>
2. Docker客户端配置
- 登录私有仓库:
docker login nexus.example.com:5000# 或podman login nexus.example.com:5000
- 推送镜像:
docker tag my-image nexus.example.com:5000/my-imagedocker push nexus.example.com:5000/my-image
- 拉取镜像:
docker pull nexus.example.com:5000/my-image
六、运维与优化
- 备份与恢复:
- 备份
/nexus-data目录。 - 恢复时需确保Nexus3版本一致。
- 备份
- 性能调优:
- 调整JVM堆内存(修改
NEXUS_JVM_OPTS环境变量)。 - 启用Blob存储压缩(
Administration > System > Capabilities)。
- 调整JVM堆内存(修改
- 高可用部署:
- 使用共享存储(如NFS)挂载
/nexus-data。 - 结合Kubernetes部署多实例。
- 使用共享存储(如NFS)挂载
七、总结
通过Podman或Docker部署Nexus3,可快速构建安全、高效的私有Maven与Docker仓库。本文详细介绍了从环境准备到仓库使用的全流程,并提供了HTTPS配置、权限管理等高级场景的解决方案。实际部署中,建议结合CI/CD流水线(如Jenkins、GitLab CI)实现自动化依赖管理与镜像构建,进一步提升开发效率。