安装nexus3
以下配置中的
<nexus_host>都可以使用主机名.local(mDNS 域名)来代替
- docker
1 | mkdir -p /usr/local/nexus3 |
- docker-compose
1 | version: '3.8' |
问题补记
问题:nexus启动失败,报错 cannot open local storage ‘/nexus-data/db/{config或者component}‘ with mode=rw
1 | # 切记在磁盘满了的情况不要随意清除blob下vol文件,但可以尝试拷贝出去,之后启动nexus成功后再拷贝回来 |
Docker仓库配置
docker仓库规划(方式一)
在Nexus3中支持3种Docker仓库:
hosted:本地仓库,同Docker官方仓库一样。proxy:代理仓库,提供代理其他仓库的功能,如我内网只有一台主机能上网,其他主机不能上网,则可以在可以上网的主机上面配置这种代理仓库,然后别的不能上网的主机就可以通过该代理仓库下载docker镜像了。group:聚合仓库,将多个仓库组合成一个仓库。
我需要配置这三种类型的仓库,现规划如下:
| 仓库类型 | 仓库名称 | HTTP端口号 | HTTPS端口号 | 支持docker操作 |
|---|---|---|---|---|
| proxy代理仓库 | docker-proxy | 8001 | 不设置 | pull |
| hosted本地仓库 | docker-hosted | 8002 | 不设置 | pull、push |
| group聚合仓库 | docker-group | 8003 | 不设置 | pull |
创建docker blob 对象
为了使docker的blob和其他的不同,我们创建一个docker的blob,用来存储docker相关的文件。
依次点击【Repository】--【Blob Stores】--【Create Blob Store】:

Blob类型选择File:

然后,名称设置为docker,不勾选【Soft Quota】,最后点击【Save】保存:

可以看到,新的Blob创建成功:

然后,创建docker-proxy代理仓库。
创建docker-proxy代理库
进入到设置页面后,点击左侧的【Repositories】进入到仓库管理页面,点击【Create Repository】按钮,我们需要使用的docker仓库,以看到docker(proxy):
docker代理仓库说明:
- name: docker-proxy
- format: docker
- type: proxy
- HTTP端口:8001
- HTTPS端口:不勾选,忽略
- Allow anonymous docker pull ( Docker Bearer Token Realm required ): 允许匿名下载镜像,勾选该处。
- Enable Docker V1 API: 允许docker客户端使用V1 API,勾选该处。
- Remote storage: 远程存储仓库的URL地址【可以配置成国内加速源地址】。
- Docker Index: 这里为了确保能够拉取 DockerHub 最新的镜像,我选择了 Use DockerHub 这个 Index。
- HTTP request setting,HTTP请求设置,我们一般只需要设置一下User-Agent请求头即可,如填写"Sync docker image. email: mzh.whut@gmail.com"。

注意,代理URL请使用科大镜像、网易、阿里云等加速源,或者腾讯内网地址https://mirror.ccs.tencentyun.com ,不要使用截图中的腾讯外网地址 https://mirrors.cloud.tencent.com 。
使用 docker Blob存储,最后点击【Create repository】创建仓库即可。
创建后,点击新创建的docker-proxy仓库,可以看到仓库详情: 
创建docker-hosted本地仓库
创建docker-hosted本地仓库:
docker本地仓库说明:
- name: docker-hosted
- format: docker
- type: hosted
- HTTP端口:8002
- HTTPS端口:不勾选,忽略
- Allow anonymous docker pull ( Docker Bearer Token Realm required ): 允许匿名下载镜像,勾选该处。
- Enable Docker V1 API: 允许docker客户端使用V1 API,勾选该处
- Blob store: 选择【docker】blob对象
- Deployment policy: 测试时,先可以选择【Allow redeploy】允许重复发布,后期如果用在正式生产环境时,可以将该修改为【Disable redeploy】。

相关信息填写好后,最后点击【Create repository】创建仓库即可。
创建docker-group聚合仓库
创建docker-group聚合仓库:
docker聚合仓库说明:
- name: docker-group
- format: docker
- type: group
- HTTP端口:8003
- HTTPS端口:不勾选,忽略
- Allow anonymous docker pull ( Docker Bearer Token Realm required ): 允许匿名下载镜像,勾选该处。
- Enable Docker V1 API: 允许docker客户端使用V1 API,勾选该处
- Blob store: 选择【docker】blob对象
- Group: Member Repositories,将【docker-hosted】和 【docker-proxy】添加到右侧,这里成员仓库的顺序可以稍微规划下,一般来说将本地的放前面,代理第三方的放后面,好处就是优先使用本地或小众的镜像仓库。

相关信息填写好后,最后点击【Create repository】创建仓库即可。
这样我们三个docker仓库已经创建好了:

开启匿名访问权限/Token
依次点击【Security】--【Realms】,将【Docker Bearer Token Tealm】添加到右侧

配置是否允许匿名登录【勾选上红框标记的位置】

最后点击【Save】保存即可。
测试代理仓库下载镜像
先修改/etc/docker/daemon.json配置:
1 | [root@master ~]# cd /etc/docker/ |
重启docker服务:
1 | [root@master ~]# systemctl daemon-reload |
执行下载镜像之类后,在nexus上面检查Blob对象:

在nexus Browse中也可以看到对应的镜像信息:

如果能够正常代理,则下载镜像时,上面两个位置的信息会发生变化,blob对象会增加,Browse浏览器中也可以看到新下载的镜像信息。
docker仓库规划(方式二)
- 仅创建一个docker hosted仓库供push和pull私有镜像
- pull第三方镜像使用国内镜像源优化速度
新建docker blob

创建docker-hosted仓库

添加Token/配置匿名

配置docker
在daemon.json中添加如下配置
1 | { |
拉取镜像测试
如果是方式一,地址使用
<nexus_host>:8003
如果是方式二,地址使用<nexus_host>:8002
如果是本地访问,<nexus_host>可以替换为localhost
- 使用 `docker pull` 命令拉取镜像时,需要指定Nexus 3的地址。
- 格式:`docker pull <Nexus地址>/<原始镜像名>`。
Npm仓库配置
创建blob存储
为其创建一个单独的存储空间。

进入设置,依次建立npm仓库

创建npm(hosted)私有仓库(hosted改成allow redeploy,这样才能运行重复上传一个包,不然会报400:bad request)

创建npm(proxy)仓库(proxy的remote storage设置:当私有仓库和代理仓库缓存包里无请求的包时,就会通过这里配置的地址去服务器下载需要的包,然后再缓存下来)

创建npm(group)仓库

配置权限
注意点:
npm install后报错如下,可通过配置npm bearer token realm解决

检查npm nexus的 Realms设置,把npm Bearer Token realm放入Active中,并保存

检查一下Nexus Repository Manager上的Anonymous是否开放

使用私有仓库方式
为某一个组配置仓库地址
1 | npm config set @chint:registry http://<nexus_host>:8081/repository/npm-group/ |
全局配置
1 | npm config set registry http://<nexus_host>:8081/repository/npm-group/ |
发布配置方式1
根据提示输入用户/密码/邮箱:
npm adduser --registry=http://<nexus_host>:8081/repository/npm-hosted/package.json内添加
1 | "publishConfig": { |
- 命令:
npm publish
发布配置方式2
根据提示输入用户/密码/邮箱:
npm adduser --registry=http://10.137.8.212:8081/repository/npm-hosted/命令:
npm publish --registry=http://10.137.8.212:8081/repository/npm-hosted/
Maven仓库配置
有默认的这几个仓库:
- maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
- maven-releases:私库发行版jar,初次安装请将
Deployment policy设置为Allow redeploy - maven-snapshots:私库快照(调试版本)jar
- maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置
settings.xml中使用。
Nexus默认的仓库类型有以下四种:
- group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;
- hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库);
- proxy(代理类型):从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的Configuration页签下Remote Storage属性的值即被代理的远程仓库的路径);
- virtual(虚拟类型):虚拟仓库(这个基本用不到,重点关注上面三个仓库的使用);
Policy(策略): 表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库;
创建Blob Stores
文件存储的地方,创建一个目录的话,对应文件系统的一个目录,可供仓库上传文件使用,如图所示:

创建一个阿里云的代理(proxy)仓库
由于访问中央仓库有时候会比较慢,这里添加一个阿里云的代理仓库,然后优先级放到默认中央库之前, 阿里云的maven仓库url为
http://maven.aliyun.com/nexus/content/groups/public

然后maven-public组里面将这个
aliyun-proxy仓库加入,排在maven-central之前即可。

Nexus仓库分类的概念
1)Maven可直接从宿主仓库下载构件,也可以从代理仓库下载构件,而代理仓库间接的从远程仓库下载并缓存构件
2)为了方便,Maven可以从仓库组下载构件,而仓库组并没有时间的内容(下图中用虚线表示,它会转向包含的宿主仓库或者代理仓库获得实际构件的内容)

本地Maven使用私服
安装和配置好之后,在开发中可在maven的默认配置settings.xml中修改如下:
这里需要注意几点:
<id>元素必须在repositories、pluginRepositories和distributionManagement元素中保持一致。且pom.xml中指定的<id>和setting.xml中下的<id>对应上(无论是<server>、<mirror>或是其他标签)!这是因为<id>元素用于唯一标识 Maven 存储库,以便 Maven 可以在settings.xml文件中的元素中查找与之匹配的凭据。<url>元素指定 Maven 存储库的 URL。确保 URL 是正确的,并且可以通过网络访问。<releases>元素和<snapshots>元素用于指定 Maven 存储库是否支持发布版本和快照版本。对于支持发布版本的存储库,将<releases>元素的<enabled>子元素设置为true,对于支持快照版本的存储库,将<snapshots>元素的<enabled>子元素设置为true。如果您的存储库不支持某种类型的版本,则可以将相应的元素设置为false。<updatePolicy>元素指定 Maven 更新依赖关系的策略。对于快照版本,可以将<updatePolicy>元素设置为always,以确保 Maven 始终从存储库中获取最新的快照版本。对于发布版本,通常将<updatePolicy>元素设置为daily或never,以减少网络流量和依赖项下载时间。- 如果您使用了自签名的 SSL 证书,则需要在 Maven 的
settings.xml文件中配置<servers>元素,并将trustStore和trustStorePassword属性设置为包含 SSL 证书的 Java 密钥库和密码,以便 Maven 可以验证 SSL 证书并与 Nexus 存储库建立安全连接。
1 | <servers> |
元素activeByDefault:
配置了
<activeByDefault>标签的profile只会在没有其他激活的profile的情况下被激活元素updatePolicy:
用来配置Maven从远程仓库检查更新的频率,默认的值是daily,表示Maven每天检查一次。其他可用的值包括:never——从不检查更新;always——每次构建都检查更新;in-terval:X——每隔X分钟检查一次更新(X为任意整数)。
元素checksumPolicy:
用来配置Maven检查检验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的校验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,怎么办?当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail——Maven遇到校验和错误就让构建失败;ignore——使Maven完全忽略校验和错误。
发布jar到私服
如果需要发布自己的jar到私服,就需要修改工程:
setting.xml
1 | ... |
pom.xml
1 | <distributionManagement> |
注意上面的repository的id值一定要跟settings.xml文件中配置的server一致。
这里使用SpringBoot的starter项目作为测试。
部署到快照版仓库【后缀:SNAPSHOT】
将jar包部署到快照仓库,
pom.xml中的版本配置为0.0.1-SNAPSHOT,
标识为快照。

部署到发行版仓库【后缀:RELEASE,也可以只用版本号】
将jar包部署到发行版仓库,
pom.xml中的版本配置为0.0.1-RELEASE,
标识为发行版,也可以只用版本号,如0.0.1。

- 成功标识:

查看仓库
完成Nexus Repository私有仓库部署,登录私仓后,可以看到多个仓库,
仓库分类如下表所示,
| 序号 | 仓库 | 描述 |
|---|---|---|
| 1 | maven-central | 中央仓库,默认从https://repo1.maven.org/maven2/ 拉取软件包,可配置 |
| 2 | maven-public | 公共仓库,存储发行版和快照版的软件包,即发行版和快照版的软件包都会在public中 |
| 3 | maven-releases | 发行版仓库,软件包稳定后,发布到该仓库,团队内使用 |
| 4 | maven-snapshots | 快照版本仓库,用于测试软件,发布到线上 |
小记:执行指令上传jar到Nexus
- 本地开发完的jar可以直接执行deploy
1 | mvn clean deploy |
- 第三方Jar上传到Nexus
1 | mvn deploy:deploy-file \ |
-DrepositoryId的值即为在setttings.xml里面配置的server id。
使用私服中的依赖
在项目中添加私有仓库的地址,
通过repositories属性,与dependencies属性同级。
再引入对应的jar包Maven坐标,
配置样例如下:
1 | <repositories> |