Podman与Docker双模式部署:Nexus3私有仓库搭建全攻略

一、为什么需要私有Nexus3仓库?

在团队开发中,直接依赖公共Maven仓库(如Maven Central)和Docker Hub存在三大痛点:

  1. 网络依赖风险:公共仓库可能因地域限制或服务中断导致构建失败
  2. 安全合规要求:企业级应用需避免使用未经验证的第三方构件
  3. 构建效率瓶颈:大型项目依赖大量构件,重复下载影响CI/CD流水线速度

Nexus3作为Sonatype推出的下一代仓库管理器,支持:

  • 同时托管Maven/Gradle/NuGet等包类型
  • 内置Docker镜像仓库功能
  • 提供权限控制、审计日志等企业级特性
  • 支持HA集群部署

二、环境准备与工具选择

2.1 系统要求

  • 操作系统:Linux(推荐CentOS 8/Ubuntu 20.04+)
  • 硬件配置:4核CPU/8GB内存/100GB存储(生产环境)
  • 网络要求:开放8081(HTTP)、8082(Docker)、8443(HTTPS)端口

2.2 容器工具对比

特性 Docker Podman
架构 客户端-服务端(dockerd) 无守护进程设计
安全性 需root权限运行 支持rootless模式
兼容性 生态成熟 与Docker CLI兼容
企业适用场景 传统Docker环境 安全要求高的生产环境

建议生产环境采用Podman(rootless模式),开发环境可使用Docker快速验证。

三、容器化部署实战

3.1 使用Docker部署

  1. # 拉取官方镜像(当前最新版3.50.0)
  2. docker pull sonatype/nexus3:3.50.0
  3. # 创建数据卷持久化存储
  4. docker volume create nexus-data
  5. # 启动容器(配置JVM参数)
  6. docker run -d --name nexus \
  7. -p 8081:8081 -p 8082:8082 -p 8443:8443 \
  8. -v nexus-data:/nexus-data \
  9. -e INSTALL4J_ADD_VM_PARAMS="-Xms2g -Xmx4g -XX:MaxDirectMemorySize=2g" \
  10. sonatype/nexus3:3.50.0

3.2 使用Podman部署(rootless模式)

  1. # 创建用户命名空间(需系统支持)
  2. podman system service --time=0 unix:///run/user/$(id -u)/podman/podman.sock
  3. # 启动容器(配置SELinux上下文)
  4. podman run -d --name nexus \
  5. --network host \
  6. -v ~/nexus-data:/nexus-data:Z \
  7. -e INSTALL4J_ADD_VM_PARAMS="-Xms2g -Xmx4g" \
  8. docker.io/sonatype/nexus3:3.50.0

3.3 关键配置说明

  1. 内存配置:生产环境建议设置-Xms-Xmx相同,避免动态扩容开销
  2. 存储映射
    • /nexus-data目录需777权限(Docker)或正确SELinux上下文(Podman)
    • 推荐使用独立磁盘挂载,避免系统盘空间不足
  3. 网络配置
    • Docker建议使用--network host简化端口映射
    • 生产环境应配置反向代理(Nginx/Apache)

四、仓库功能配置

4.1 Maven仓库配置

  1. 登录Nexus管理界面(http://<IP>:8081,默认账号admin/admin123)
  2. 创建Blob Store:
    • 名称:maven-blob
    • 路径:/nexus-data/blobs/maven
  3. 创建Repository:
    • 类型:maven2 (hosted)
    • 名称:maven-releases
    • 存储:maven-blob
    • 部署策略:Allow redeploy

4.2 Docker仓库配置

  1. 创建Docker Blob Store:
    • 名称:docker-blob
    • 路径:/nexus-data/blobs/docker
  2. 创建Docker Hosted仓库:
    • 名称:docker-local
    • HTTP端口:8082
    • 勾选”V1签名”(兼容旧版客户端)
  3. 配置镜像推送:
    ```bash

    登录私有仓库

    docker login http://:8082

标记并推送镜像

docker tag alpine:latest :8082/docker-local/alpine:1.0
docker push :8082/docker-local/alpine:1.0

  1. ## 4.3 代理仓库配置(可选)
  2. 1. 创建Maven Proxy指向Maven Central
  3. - 远程存储:`https://repo.maven.apache.org/maven2/`
  4. 2. 创建Docker Proxy指向Docker Hub
  5. - 远程存储:`https://registry-1.docker.io`
  6. - 使用镜像加速(如国内环境配置`https://<mirror>.aliyun.com`
  7. # 五、生产环境优化
  8. ## 5.1 安全加固
  9. 1. 启用HTTPS
  10. ```bash
  11. # 生成自签名证书(生产环境应使用CA证书)
  12. openssl req -x509 -newkey rsa:4096 -nodes -keyout nexus.key -out nexus.crt -days 365
  13. # 配置Nginx反向代理
  14. server {
  15. listen 443 ssl;
  16. server_name nexus.example.com;
  17. ssl_certificate /etc/nginx/ssl/nexus.crt;
  18. ssl_certificate_key /etc/nginx/ssl/nexus.key;
  19. location / {
  20. proxy_pass http://localhost:8081;
  21. }
  22. }
  1. 配置RBAC权限:
    • 创建maven-developers角色,仅允许nexus:maven-releases的read/write权限
    • 创建docker-ci角色,仅允许nexus:docker-local的push权限

5.2 性能调优

  1. JVM参数优化:

    1. -XX:+UseG1GC -XX:MaxGCPauseMillis=200
    2. -XX:InitiatingHeapOccupancyPercent=35
  2. 文件描述符限制:

    1. # 在/etc/security/limits.conf中添加
    2. nexus soft nofile 65536
    3. nexus hard nofile 65536

5.3 备份恢复策略

  1. 定期备份/nexus-data目录
  2. 使用Nexus的Export databases功能备份元数据
  3. 恢复测试流程:
    ```bash

    停止服务

    systemctl stop nexus

备份当前数据

cp -r /nexus-data /nexus-data.bak

恢复数据

rm -rf /nexus-data/
cp -r /backup/nexus-data/
/nexus-data/

启动服务

systemctl start nexus

  1. # 六、常见问题解决方案
  2. ## 6.1 端口冲突处理
  3. ```bash
  4. # 检查占用端口
  5. ss -tulnp | grep 8081
  6. # 修改Nexus端口(编辑nexus.vmoptions)
  7. -Dkaraf.etc=/opt/sonatype/nexus/etc
  8. -Djetty.http.port=8083

6.2 存储空间不足

  1. 清理无用构件:

    • 使用Repository -> Browse删除旧版本
    • 配置Compact Blob Store任务定期清理
  2. 扩展存储:
    ```bash

    添加新磁盘并挂载

    mount /dev/sdb1 /mnt/nexus-new

迁移数据

rsync -av /nexus-data/blobs/ /mnt/nexus-new/

修改容器卷映射

docker stop nexus
docker run … -v /mnt/nexus-new:/nexus-data/blobs …

  1. ## 6.3 性能监控指标
  2. 关键监控项:
  3. - JVM内存使用率(`jstat -gcutil <pid>`
  4. - 磁盘I/O延迟(`iostat -x 1`
  5. - 网络吞吐量(`iftop -nNP`
  6. - 仓库请求延迟(Nexus内置`/service/metrics/prometheus`端点)
  7. # 七、进阶使用技巧
  8. ## 7.1 CI/CD集成示例
  9. ### Jenkins Pipeline配置:
  10. ```groovy
  11. pipeline {
  12. agent any
  13. stages {
  14. stage('Build') {
  15. steps {
  16. sh 'mvn clean package'
  17. }
  18. }
  19. stage('Deploy') {
  20. steps {
  21. nexusPublisher(
  22. nexusInstanceId: 'local-nexus',
  23. nexusRepositoryId: 'maven-releases',
  24. packages: [[
  25. $class: 'MavenPackage',
  26. mavenAssetList: [[
  27. classifier: '',
  28. extension: 'jar',
  29. filePath: 'target/myapp-1.0.jar'
  30. ]],
  31. mavenCoordinate: [
  32. artifactId: 'myapp',
  33. groupId: 'com.example',
  34. packaging: 'jar',
  35. version: '1.0'
  36. ]
  37. ]]
  38. )
  39. }
  40. }
  41. }
  42. }

7.2 多节点集群部署

  1. 共享存储配置:

    • 使用NFS/GlusterFS挂载/nexus-data目录
    • 配置nexus.properties中的nexus-context-name区分节点
  2. 负载均衡配置:
    ```nginx
    upstream nexus-cluster {
    server node1:8081;
    server node2:8081;
    server node3:8081;
    }

server {
listen 80;
location / {
proxy_pass http://nexus-cluster;
}
}
```

八、总结与最佳实践

  1. 部署模式选择

    • 开发测试:Docker快速验证
    • 生产环境:Podman rootless模式
    • 高可用:3节点集群+共享存储
  2. 资源分配原则

    • 初始配置:4核/8GB/100GB
    • 每10万构件增加1核/2GB内存
    • 预留20%存储空间用于增长
  3. 运维建议

    • 每周执行Compact Blob Store任务
    • 每月进行备份恢复测试
    • 每季度审核用户权限

通过本文的部署方案,团队可快速构建安全的私有仓库环境,实现构建依赖的集中管理,提升CI/CD流水线的稳定性和效率。实际部署中应根据具体业务需求调整配置参数,并建立完善的监控告警机制。”