Docker 搭建Nexus3私服

一、Nexus 简介

Nexus Repository Manager 3(简称Nexus3)是Sonatype公司推出的一款仓库管理工具,主要用于存储、管理和分发:

  • Maven(Java)依赖
  • Docker 镜像
  • npm(Node.js)包
  • PyPI(Python)包
  • NuGet(.NET)包
  • APT(Debian)包
  • Yum(RPM)包
  • Go 模块
  • 等多种开发语言的组件

二、Nexus 核心概念

2.1 仓库类型

Nexus3的仓库类型主要分为三大类:代理仓库(Proxy Repository)、宿主仓库(Hosted Repository)和仓库组(Repository Group)。

  1. 代理仓库(Proxy Repository)

    • 作用:作为远程仓库的缓存代理,提高访问速度并减少外部网络流量。

    • 特点:

      • 缓存远程仓库内容
      • 支持负缓存(缓存404响应)
      • 可设置缓存策略
    • 配置示例(Maven代理仓库):

      json 复制代码
      {
        "name": "maven-central",
        "type": "proxy",
        "format": "maven2",
        "url": "https://repo.maven.apache.org/maven2",
        "storage": {
          "blobStoreName": "default",
          "strictContentTypeValidation": true
        },
        "proxy": {
          "remoteUrl": "https://repo.maven.apache.org/maven2",
          "contentMaxAge": 1440,
          "metadataMaxAge": 1440
        },
        "negativeCache": {
          "enabled": true,
          "timeToLive": 1440
        },
        "httpClient": {
          "blocked": false,
          "autoBlock": true,
          "connection": {
            "retries": 0,
            "userAgentSuffix": "Nexus",
            "timeout": 60,
            "enableCircularRedirects": false,
            "enableCookies": false
          }
        }
      }
  2. 宿主仓库(Hosted Repository)

    • 作用:存储企业内部生成的制品。

    • 子类型:

      • 发布仓库(Releases):存储稳定版本
      • 快照仓库(Snapshots):存储开发中版本
      • 混合仓库(Mixed):同时支持发布和快照
    • 配置示例:

      json 复制代码
      {
        "name": "maven-releases",
        "type": "hosted",
        "format": "maven2",
        "online": true,
        "storage": {
          "blobStoreName": "default",
          "writePolicy": "ALLOW_ONCE",  // 防止覆盖
          "strictContentTypeValidation": true
        },
        "cleanup": {
          "policyNames": ["weekly-cleanup"]
        },
        "maven": {
          "versionPolicy": "RELEASE",  // RELEASE, SNAPSHOT 或 MIXED
          "layoutPolicy": "STRICT"     // STRICT 或 PERMISSIVE
        }
      }
  3. 仓库组(Repository Group)

    • 作用:聚合多个仓库,提供统一的访问入口。

    • 特点:

      • 虚拟仓库,不实际存储内容
      • 可包含代理、宿主或其他组仓库
      • 按顺序搜索成员仓库
    • 配置示例:

      bash 复制代码
      {
        "name": "maven-public",
        "type": "group",
        "format": "maven2",
        "online": true,
        "storage": {
          "blobStoreName": "default",
          "strictContentTypeValidation": true
        },
        "group": {
          "memberNames": [
            "maven-releases",
            "maven-snapshots", 
            "maven-central",
            "third-party"
          ]
        }
      }

2.2 仓库格式支持

Nexus3 支持多种包管理格式:

  • Maven 仓库

    bash 复制代码
    # 配置示例
    maven-central (proxy)       # Maven中央仓库代理
    maven-releases (hosted)    # 内部发布版本
    maven-snapshots (hosted)   # 内部快照版本
    maven-public (group)       # 聚合所有Maven仓库
  • Docker 仓库

    bash 复制代码
    # 类型
    docker-hosted      # 存储内部Docker镜像
    docker-proxy       # 代理Docker Hub/Registry
    docker-group       # 聚合多个Docker仓库
    
    # 配置要点
    - 需要配置HTTP/HTTPS端口
    - 支持Blob存储优化
    - 可配置清理策略
  • NPM 仓库

    bash 复制代码
    # 类型
    npm-proxy    # 代理npm官方仓库
    npm-hosted   # 存储私有npm包  
    npm-group    # 聚合npm仓库
    
    # 使用示例
    npm config set registry http://nexus:8081/repository/npm-group/

三、Docker 部署 Nexus3

3.1 拉取镜像

bash 复制代码
# 拉取 Nexus3 官方镜像
docker pull sonatype/nexus3:latest

3.2 创建挂载目录

bash 复制代码
# 创建数据目录(用于持久化存储
mkdir -p /usr/local/src/nexus/nexus-data
chmod 777 /usr/local/src/nexus/nexus-data

3.3 运行容器

  • 基础运行命令

    bash 复制代码
    # 最简单的方式
    docker run -d --name nexus3 -p 8081:8081 sonatype/nexus3
    
    # 推荐方式(挂载数据卷)
    docker run -d \
      --name nexus3 \
      -p 8081:8081 \
      -v nexus-data:/nexus-data \
      sonatype/nexus3:latest
  • 完整配置命令(生产环境推荐)

    bash 复制代码
    docker run -d \
      --name nexus3 \
      --restart unless-stopped \
      -p 8081:8081 \
      -p 5000:5000 \  # Docker 仓库端口(可选)
      -v /usr/local/src/nexus/nexus-data:/nexus-data \
      -v /etc/localtime:/etc/localtime:ro \
      -e INSTALL4J_ADD_VM_PARAMS="-Xms256M -Xmx512M -XX:MaxDirectMemorySize=1g" \
      -e NEXUS_CONTEXT="/" \
      sonatype/nexus3:latest
    • -d:后台运行
    • --name nexus3:容器名称
    • --restart unless-stopped:自动重启策略,其他选项:no(不重启)、always(总是重启)、on-failure(失败时重启)
    • -p 8081:8081:映射 Web 管理端口:主机8081 -> 容器8081
    • -p 5000:5000:Docker 私有仓库端口
    • -v nexus-data:/nexus-data:挂载数据卷(持久化存储),将主机目录挂载到容器内
    • -v /etc/localtime:/etc/localtime:ro:时区同步,将主机的时区文件挂载到容器内
    • -e INSTALL4J_ADD_VM_PARAMS:JVM 内存参数设置
    • -e NEXUS_CONTEXT="/":上下文路径(默认为根目录)

3.4 初始访问

  1. 等待容器启动(首次启动需要 2-5 分钟)

  2. 访问:http://localhost:8081

  3. 默认管理员账号:

    • 用户名:admin

    • 初始密码:查看容器日志获取

      bash 复制代码
      # 查看容器日志,找到初始密码
      docker logs nexus3 | grep "admin.password"
      
      # 或者直接查看文件
      docker exec nexus3 cat /nexus-data/admin.password
  4. 登录账号:admin

  5. 按提示修改密码

3.5 基本设置

  1. 禁用匿名访问

    bash 复制代码
    设置 → Security → Anonymous Access
    取消勾选 "Allow anonymous users to access the server"
  2. 创建用户

    bash 复制代码
    设置 → Security → Users → Create local user
    填写:ID、First Name、Last Name、Email、Password
    选择 Role:nx-admin(管理员权限)

四、配置各种类型仓库

4.1 Maven 仓库配置

  • 创建代理仓库(Proxy)
    1. 进入 设置 → Repository → Repositories → Create repository
    2. 选择 maven2 (proxy)
    3. 配置示例:
  • 创建宿主仓库(Hosted)

    1. 选择 maven2 (hosted)
    2. 配置示例:
      • Name: maven-releases
      • Version policy: Release
      • Deployment policy: Allow redeploy
  • 创建仓库组(Group)

    1. 选择 maven2 (group)
    2. 将前面创建的仓库加入组:
      • maven-central
      • maven-releases
      • maven-snapshots

4.2 Docker 仓库配置

  1. 启用 Docker 仓库

    bash 复制代码
    设置 → Repository → Repositories → Create repository
    选择 docker (hosted)
  2. 配置 Docker 仓库

    bash 复制代码
    Name: docker-hosted
    HTTP: 8082  # 注意此端口需要与容器映射端口一致
    Deployment policy: Allow redeploy

五、仓库使用

5.1 Maven 仓库使用

  1. Maven 配置

    bash 复制代码
    <settings>
      <servers>
        <server>
          <id>nexus</id>
          <username>deployment</username>
          <password>your-password</password>
        </server>
      </servers>
      
      <mirrors>
        <mirror>
          <id>nexus</id>
          <mirrorOf>*</mirrorOf>
          <url>http://localhost:8081/repository/maven-public/</url>
        </mirror>
      </mirrors>
    </settings>
  2. 项目 pom.xml 配置:

    bash 复制代码
    <distributionManagement>
      <repository>
        <id>nexus</id>
        <name>Releases</name>
        <url>http://localhost:8081/repository/maven-releases/</url>
      </repository>
      <snapshotRepository>
        <id>nexus</id>
        <name>Snapshots</name>
        <url>http://localhost:8081/repository/maven-snapshots/</url>
      </snapshotRepository>
    </distributionManagement>
  3. 发布和拉取

    bash 复制代码
    # 发布到 Nexus
    mvn clean deploy
    
    # 从 Nexus 拉取依赖
    mvn clean install

5.2 Docker 仓库使用

  1. 配置 Docker 客户端

    bash 复制代码
    # 1. 配置 insecure-registries(Linux/Mac)
    sudo vim /etc/docker/daemon.json
    {
      "insecure-registries": ["localhost:8082"]
    }
    
    # 重启 Docker
    sudo systemctl restart docker
    
    # 2. 登录到 Nexus
    docker login localhost:8082
    # 用户名/密码:Nexus 创建的用户
  2. 推送/拉取镜像

    bash 复制代码
    # 1. 给镜像打标签
    docker tag my-image:latest localhost:8082/my-image:latest
    
    # 2. 推送到 Nexus
    docker push localhost:8082/my-image:latest
    
    # 3. 从 Nexus 拉取
    docker pull localhost:8082/my-image:latest
    
    # 4. 拉取远程镜像(通过代理)
    # Nexus 会自动缓存 Docker Hub 的镜像
    docker pull localhost:8082/library/nginx:latest

六、高级功能

6.1 权限管理(RBAC)

bash 复制代码
设置 → Security → Roles
设置 → Security → Privileges
  • 创建角色(Role)
  • 分配权限(Privilege)
  • 用户绑定角色

6.2 LDAP 集成

bash 复制代码
设置 → Security → LDAP
  • 连接公司 LDAP/AD 进行用户认证

6.3 清理策略

bash 复制代码
设置 → Repository → Cleanup Policies
  • 基于时间清理
  • 基于版本数清理
  • 正则表达式匹配

6.4 Webhook

bash 复制代码
设置 → System → Capabilities → Webhook

配置事件通知,如:

  • 制品上传
  • 清理完成
  • 系统异常

七、最佳实践

  1. 定期备份:备份整个 nexus-data 目录
  2. 监控告警:设置磁盘使用率监控
  3. 权限细分:按团队分配最小必要权限
  4. 定期清理:配置自动清理策略
  5. 版本控制:重要配置导出备份
  6. HTTPS:生产环境启用 HTTPS
  7. 高可用:考虑集群部署(Nexus Pro 版本)
相关推荐
June`2 小时前
SSH连接原理与守护进程实战
linux·运维·服务器
古城小栈2 小时前
K3s + 边缘 AI:轻量级 K8s 在嵌入式设备的部署
人工智能·容器·kubernetes
小道士写程序2 小时前
Kubernetes 1.23.17 集群部署完全记录(单点)
云原生·容器·kubernetes
driver19992 小时前
hyperV装的windows11安装docker不支持虚拟化
运维·docker·容器
_OP_CHEN3 小时前
【Git原理与使用】(五)Git 多人协作:从分支协作到冲突解决,团队开发效率翻倍秘籍
linux·运维·git·团队开发·运维开发·企业级组件·git多人协作
warrah3 小时前
docker portainer的应用
docker
企鹅侠客3 小时前
Linux性能调优:详解CPU使用率计算方式
linux·运维·服务器·性能调优
hakuii4 小时前
linux中的一些配置
linux·运维·服务器