Featured image of post Nexus Repository 私服:Maven / Nuget / Docker 仓库与第三方包上传实战

Nexus Repository 私服:Maven / Nuget / Docker 仓库与第三方包上传实战

Sonatype Nexus 3 部署、maven 仓库(proxy/hosted/group)、maven 镜像配置、Docker 私有仓库(Bearer Token)、第三方 jar 包 mvn deploy 上传——企业级制品库的"完整玩法"

Sonatype Nexus Repository 3 是企业里最常见的制品库——既可以代理 Maven Central、npm、Docker Hub,也可以做内部 hosted 仓库托管私有 jar / docker 镜像,还可以把多个仓库组合成"仓库组"对外暴露。这篇文章把 Nexus 3 的部署、仓库创建、maven 镜像、Docker 仓库、第三方 jar 上传实战一次性收齐。

阅读对象:需要搭建企业 Maven 私服的 Java 团队;需要私有 Docker Registry;需要上传第三方包(公司内部 SDK)的开发。 覆盖范围:Sonatype Nexus 3 部署(启动慢要 12 分钟)、maven 仓库 4 种类型(proxy/hosted/group)、maven settings.xml 镜像配置、Docker 仓库(hosted + Bearer Token)、第三方 jar 上传(mvn deploy:deploy-file)、Blob 清理(Compact blob store)。

一、Nexus 在企业里的角色

角色价值
代理公共仓库Maven Central 镜像、npm 镜像、PyPI 镜像
托管内部 jar公司内部 SDK / 框架
托管第三方 jar没上传到 Maven Central 的商业 SDK
私有 Docker Registrydocker push/pull 内部镜像
仓库组(group)把多个仓库合并,settings.xml 配一个 URL
权限 / 审计RBAC、操作审计、清理策略

二、Nexus 3 部署

2.1 拉取与启动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
docker pull sonatype/nexus3
docker pull sonatype/nexus3:3.72.0-java17-ubi   # 生产推荐

mkdir -p /home/docker/nexus/data
chown -R 200 /home/docker/nexus/data     # Nexus 进程以 UID 200 跑

docker run -d --restart=always --name nexus \
  -p 8081:8081 \
  -p 8082:8082 \
  -v /home/docker/nexus/data:/nexus-data \
  sonatype/nexus3

关键

  • 端口 8081 = Web UI
  • 端口 8082 = Docker Registry(V2 API)
  • 目录 /nexus-data 持久化(必须可写,UID 200)
  • 首次启动要 12 分钟(拉取 + 初始化)

2.2 JVM 调优(生产必加)

1
2
3
4
5
6
docker run -d --restart=always --name nexus \
  -p 8081:8081 \
  -p 8082:8082 \
  -v /home/docker/nexus/data:/nexus-data \
  -e INSTALL4J_ADD_VM_PARAMS="-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=/nexus-data" \
  sonatype/nexus3

Why 2703m? Nexus 推荐 4GB JVM 堆(-Xms = -Xmx = 2.7GB,留 1.3GB 给 OS + MetaSpace)。

2.3 首次登录

1
2
3
# 等启动完成(看日志)
docker logs -f --tail=100 nexus
# 输出:Started Sonatype Nexus OSS 3.37.3-02
  1. 访问 http://<host>:8081
  2. 用户名 admin
  3. 密码在 /home/docker/nexus/data/admin.password
1
2
cat /home/docker/nexus/data/admin.password
# 形如:b52798ef-123d-4f46-9e84-416da2fa4bf8
  1. 登录后强制改密码
  2. 关闭匿名访问(“Settings → Security → Anonymous Access” 设为 disabled)

2.4 启动失败排错

症状org.apache.http.conn.ConnectTimeoutException: Connect to sonatype-download.global.ssl.fastly.net:443

解决:登录 → System → Capabilities → 禁用 Outreach:Management


三、仓库类型与创建

3.1 四种仓库类型

类型作用典型用例
proxy代理远程公共仓库maven-central(代理 Maven Central)
hosted托管本地仓库maven-releases(内部发布版)、maven-snapshots(快照版)
group把多个仓库组合maven-public(把 maven-central / releases / snapshots 合并)
docker (proxy/hosted/group)Docker 镜像仓库docker-hosted

3.2 默认仓库

名称类型格式备注
maven-centralproxymaven2Maven Central(https://repo1.maven.org/maven2/
maven-releaseshostedmaven2发行版
maven-snapshotshostedmaven2快照版
maven-publicgroupmaven2把上面三个合并,客户端配这个
nuget-*variousnuget.NET 用,不关心

3.3 创建阿里云 Maven 镜像

场景:Maven Central 在国内太慢,加阿里云代理并放在 group 第一位。

  1. Create repository → maven2 (proxy)
  2. 配置:
    • Name: aliyun-maven-central
    • URL: https://maven.aliyun.com/repository/public
  3. maven-public group 里把 aliyun-maven-central 加进去,顺序调到最上面

四、Maven 客户端配置

4.1 settings.xml 镜像

1
2
3
4
5
6
7
8
9
<settings>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://internal.example.com:8081/repository/maven-public/</url>
    </mirror>
  </mirrors>
</settings>

<mirrorOf>*</mirrorOf>:拦截所有 Maven 请求,全部走 Nexus。生产环境推荐

4.2 部署认证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<settings>
  <servers>
    <server>
      <id>nexus</id>
      <username>admin</username>
      <password>{{REDACTED}}</password>
    </server>
    <server>
      <id>releases</id>
      <username>admin</username>
      <password>{{REDACTED}}</password>
    </server>
    <server>
      <id>snapshots</id>
      <username>admin</username>
      <password>{{REDACTED}}</password>
    </server>
  </servers>
</settings>

服务器 ID 要和 pom.xml<distributionManagement> 一致(如 releasessnapshots)。


五、Docker 私有仓库

5.1 创建 docker-hosted 仓库

  1. Create repository → docker (hosted)
  2. 配置:
    • Name: docker-hosted(自定义)
    • HTTP 端口:8082必须勾选"启用 HTTP"
    • 启用 Allow anonymous docker pull(按需)
    • Blob store: 新建 docker

5.2 启用 Docker Bearer Token

  1. Security → Realms
  2. Docker Bearer Token 移到 Active 列表

5.3 防火墙 + 端口映射

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 内网 Docker 主机:8081(管理 UI)+ 8082(docker API)
# 公网:用 nginx 反代 8082 → 13004

# /etc/nginx/conf.d/nexus-docker.conf
server {
  listen 13004;
  server_name docker.internal.example.com;
  client_max_body_size 0;
  location / {
    proxy_pass http://<nexus_ip>:8082;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

5.4 客户端使用

不安全模式(HTTP):

1
2
3
4
5
6
7
8
9
# /etc/docker/daemon.json
{
  "insecure-registries": [
    "internal.example.com:13001",
    "internal.example.com:13004"
  ]
}

systemctl restart docker
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 登录
docker login http://internal.example.com:13004 -u admin -p {{REDACTED}}

# 打 tag + 推送
docker tag lwd/jdk:8u381-3 \
  internal.example.com:13004/docker-<your-org>/base/lwd/jdk:8u381-3
docker push internal.example.com:13004/docker-<your-org>/base/lwd/jdk:8u381-3

# 拉取
docker pull internal.example.com:13004/docker-<your-org>/base/lwd/jdk:8u381-3

安全模式(HTTPS):配域名 + 证书,daemon.json 不需要 insecure-registries


六、上传第三方 jar 包

6.1 创建 3rdParty 仓库

  1. Create repository → maven2 (hosted)
  2. Name: 3rdParty
  3. Deployment policy: Allow redeploy(允许重复部署)

6.2 加入 maven-public group

3rdParty 加进 maven-public,方便客户端引用。

6.3 mvn settings.xml 加 server

1
2
3
4
5
<server>
  <id>3rdParty</id>
  <username>admin</username>
  <password>{{REDACTED}}</password>
</server>

6.4 上传 jar

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 1. 本地安装(可选,本地仓库也保留一份)
mvn install:install-file \
  -Dfile='C:\Users\user\Downloads\monitorservice.jar' \
  -DgroupId='com.example' \
  -DartifactId='monitorservice' \
  -Dversion='1.0.0' \
  -Dpackaging=jar

# 2. 上传到 Nexus
mvn deploy:deploy-file \
  -Dfile='C:\Users\user\Downloads\monitorservice.jar' \
  -DgroupId='com.example' \
  -DartifactId='monitorservice' \
  -Dversion='1.0.0' \
  -Dpackaging=jar \
  -Durl=http://internal.example.com:8081/repository/3rdParty/ \
  -DrepositoryId=3rdParty

6.5 引用上传的 jar

1
2
3
4
5
6
<!-- pom.xml -->
<dependency>
  <groupId>com.example</groupId>
  <artifactId>monitorservice</artifactId>
  <version>1.0.0</version>
</dependency>

七、清理 Blob 节省空间

Docker 镜像 push/pull 多了,Blob store 会越来越大。Nexus 提供了"Compact blob store"任务清理。

  1. 登录 Nexus → Administration → System → Tasks
  2. Create task → Admin - Compact blob store
  3. 选 blob store(如 docker
  4. 设置定时(如每周日凌晨)
  5. 触发后立即会清理"软删除"的数据(只保留一个 tag 引用的 blob,删除未引用的)

八、Nexus 3 vs Harbor vs Artifactory

维度Nexus 3HarborArtifactory
类型通用制品库镜像仓库为主通用制品库
镜像支持一般(V2 API)最强(专门为镜像设计)
Maven 支持最强
npm / pypi 支持
免费版功能完整完整社区版受限
企业级OSS / PROOSSOSS / PRO
适合Java 团队Docker 镜像为主大企业、混合制品

经验法则

  • Java 团队为主 → Nexus 3(最稳)
  • 纯 Docker 镜像管理 → Harbor(更专业)
  • 多语言、多制品类型(npm / pypi / docker / maven / go)→ Artifactory(最全)

九、2024+ 视角补充

本文写于 2024-12,2025-2026 期间 Nexus 关键演进:

  • Sonatype Nexus Repository 3.78+ LTS(2025 起):JDK 17 / 21 强制要求,3.70 之前版本 EOL——升级必做
  • Nexus Repository Pro 商业化加强:聚焦 C++ / .NET / AI 模型 制品管理(Blob 存储 + 元数据 + 审计)
  • Container Registry 体验升级:3.75+ Docker Bearer Token 性能优化,K8s 频繁拉镜像场景比之前快 30%
  • AI 模型仓库(2025-Q3 引入):原生支持 HuggingFace / Ollama 格式模型制品——LLM 团队的私有模型管理
  • SBOM + 漏洞扫描(Pro):CycloneDX 1.5+ / SPDX 2.3 报告自动生成
  • REST API 2.x 稳定:老的 service/rest/v1 进入维护,新接口 service/rest/v2 推荐
  • Terraform Provider 全面支持:IaC 方式管理 Repository——企业合规场景刚需

实战建议(2025-2026 视角):Java 团队 Nexus 仍是首选;多语言 / AI 模型场景考虑迁移到 JFrog ArtifactoryHarbor + 自建 AI 模型仓库组合;纯 Docker 镜像管理 Harbor 2.13+ 更专业。

十、扩展阅读

使用 Hugo 构建
主题 StackJimmy 设计