Docker - 使用Sonatype Nexus3 搭建Apache Maven私有仓库

环境

  • CPU:X86
  • Docker:29.1.3
  • sonatype/nexus3:3.49.0

准备工作

  1. 确认Docker版本:docker --version
  2. 检查Docker是否启动中:systemctl is-active docker
  3. 创建持久化目录,并配置权限
    sudo mkdir -p /opt/nexus-data
    # Nexus 容器内运行用户 UID=200
    sudo chown -R 200:200 /opt/nexus-data
    

部署

有关nexus3的版本选择,要么选择最新版本,但是有遥测;要么选择3.49.0版本,纯净,无遥测。

  1. 拉取镜像
    docker pull sonatype/nexus3:3.49.0
    
  2. 创建容器
    docker run -d \
      --name nexus \
      -p 8081:8081 \
      -v /opt/nexus-data:/nexus-data \
      --restart=always \
      sonatype/nexus3:3.49.0
    
  3. 检查运行状况
    docker ps | grep nexus
    
  4. 配置防火墙白名单
    firewall-cmd --permanent --add-port=8081/tcp
    firewall-cmd --reload
    

初始化

  1. 获取初始密钥,一定要记好这一串密文
    # 修改完密码后这个文件会被删除
    sudo cat /opt/nexus-data/admin.password
    
  2. 使用浏览器访问IP:8081,IP地址得看宿主机的,端口看创建容器时映射的。
  3. 用户名admin,密码是上面查到的一串字符。登陆进去后会提示修改admin用户的密码。

权限管理

  1. 权限类型
    • Privileges:这个是整个系统所有的权限,也分好多类
      • Application:控制对整个 Nexus 应用的全局操作权限,如配置、监控、插件管理等
      • Repository Admin:授予对特定仓库(Repository)的管理权限,例如修改仓库配置、删除组件、设置策略等
      • Repository Content Selector:允许基于路径、GAV(groupId:artifactId:version)等条件筛选仓库内容。常用于细粒度访问控制。
      • Repository View:控制是否可以查看某个仓库的内容(读取)。这是最基础的“只读”权限。
      • Script:授予执行 Nexus 脚本(Groovy)的权限。可用于自动化任务、自定义逻辑等。
      • Wildcard:支持通配符匹配的权限类型,通常用于批量授权多个资源。
    • Roles:角色,角色就是部分Privileges的集合,是用户和权限的连接点。
    • Users:用户,用来使用nexus的账户。
    • Anonymous Access:匿名用户,如果启用匿名用户,即可不登陆系统的就能看到仓库内容。私有仓库不建议启用。

仓库管理

  1. 仓库类型:
    • hosted:本地仓库
    • proxy:代理仓库
    • group:仓库集合
  2. 存放类型:
    • snapshots:快照仓库,可以重复覆盖,版本后缀是-SNAPSHOT时会推送进来
    • releases:稳定仓库,相同版本禁止覆盖

使用

  1. 使用私仓作为镜像加速

    <!-- maven settings.xml 注意URL路径要改成自己的 -->
    <mirror>
      <id>maven-public</id>
      <mirrorOf>*</mirrorOf>
      <url>http://192.168.0.100:8081/repository/maven-public/</url>
    </mirror>
    
  2. 使用私仓推送私有包

    <!-- maven settings.xml 注意用户名密码要改成自己的,id和pom.xml要保持一致 -->
    <server>
      <id>maven-releases</id>
      <username>dev</username>
      <password>dev</password>
    </server>
    <server>
      <id>maven-snapshots</id>
      <username>dev</username>
      <password>dev</password>
    </server>
    
    <!-- 项目 pom.xml 注意推送的仓库和URL,id和settings.xml要保持一致 -->
    <distributionManagement>
      <repository>
    	<id>maven-releases</id>
    	<url>http://192.168.0.100:8081/repository/maven-releases/</url>
      </repository>
      <snapshotRepository>
    	<id>maven-snapshots</id>
    	<url>http://192.168.0.100:8081/repository/maven-snapshots/</url>
      </snapshotRepository>
    </distributionManagement>
    

示例

我既需要用maven官方仓库,也需要用阿里的maven仓库,同时我还需要往自己的私有仓库中提交供别人使用,应该怎么配置nexus呢?
这里只是用作示例用,非正式使用,正式使用需要更合理的权限和存放位置划分,这里就用默认提供的仓库结构。

  1. 打开“Repositories”,选择“Create Repository”,选择“maven2(proxy)”,开始创建阿里仓库的代理,除了以下需要关注和编辑,其他的默认即可。
  2. 将这个仓库配到Setting.xml的mirror列表中,尝试构建一下使用这个maven仓库服务,就能在浏览器页面中看到这个仓库存放的文件了。
  3. 现在开始配置私有仓库。打开“Repositories”,选择“Create Repository”,选择“maven2(hosted)”,编辑以下内容。
    • name:mine-maven
    • Version policy:Release
  4. 将仓库的Setting.xml配上server服务器用户名和密码,id需要记好。然后在项目的pom.xml文件中配上distributionManagement,注意id需要和Setting.xml的server id相同。
  5. 使用mvn deploy将项目打包推送到私有maven仓库中。从浏览器页面中就能看到这个仓库的包文件。
  6. 现在将这几个仓库聚合起来。打开“Repositories”,选择“maven-public”,滑动到页面最底端,在“Member repositories”中,将“aliyun-maven”和“mine-maven”从左边列表中添加到右边,然后按照“私有正式版”-“私有快照版”-“阿里云代理”-“官方中央仓库”顺序排序。点击“Save”即可完成聚合操作。
  7. 在Setting.xml的mirror列表中,用“maven-public”这个仓库替换掉之前配置的“aliyun-maven”就实现了既要用阿里云Maven仓库,又使用私有仓库的要求。
posted @ 2026-01-09 15:36  苍凉温暖  阅读(8)  评论(0)    收藏  举报