前言

Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,常用来搭建 Maven 私服,所以也有人将 Nexus 称为“Maven 仓库管理器”。

Nexus Repository 提供多种包格式的仓库:

image-20220617133124634

官方文档:https://help.sonatype.com/repomanager3

安装部署

这里采用 Docker 进行安装

安装 nexus3

1
2
3
4
5
6
7
8
docker run -itd \
--privileged=true --name=nexus3 \
-p 8081:8081 \
-p 8082:8082 \
-p 8083:8083 \
-p 8084:8084 \
-v /u01/cicd/nexus3/data:/nexus-data \
sonatype/nexus3:3.30.0

参数说明:

8081:可以通过 http 访问 nexus 应用

8082:docker(hosted)私有仓库,可以 pull 和 push

8083:docker(proxy)代理远程仓库,只能 pull

8084:docker(group)私有仓库和代理的组,只能 pull

-v:建立容器与宿主机的连接,将容器中的数据持久化到宿主机上

/nexus-data:容器内 nexus 存放数据的目录

/u01/cicd/nexus3/data:宿主机映射容器内数据目录

访问网页端

容器启动成功后访问:http://192.168.88.236:8081/

默认用户/密码:admin/admin123

创建 Docker 镜像仓库

Repository -> Repositories -> Create repository

repository 的类型

  1. hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
  2. proxy,代理仓库,它们被用来代理远程的公共仓库,如 maven 中央仓库。
  3. group,仓库组,用来合并多个 hosted/proxy 仓库,当你的项目希望在多个 repository 使用资源时就不需要多次引用了,只需要引用一个 group 即可。

image-20220617134246522

创建 docker(hosted)类型的仓库

hosted 类型的仓库主要用于将自己的镜像上传至私库。

在创建镜像仓库的页面中,设置镜像仓库的相关信息(名称、HTTP 端口、是否允许匿名拉取镜像等)。

注意:这里设置的 HTTP 端口(8082)是后续拉取/推送镜像的端口

image-20220617135103754

创建 docker(proxy)类型的仓库

proxy 类型的仓库主要是用于代理中央镜像仓库,从外网将镜像拉取至本地仓库中。

这里用的是阿里云的镜像地址,国内访问比较快。

image-20220617141027757

创建 docker(group)类型的仓库

用于拉取镜像到本地使用,集成代理仓库和本地仓库的镜像。

image-20220617141322000

配置 Docker Realm

将 Docker Bearer Token Realm 配置到右边,保存

image-20220617141707436

修改 docker 配置

/etc/docker/daemon.json 文件中添加下面的内容:

1
2
3
4
$ vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.88.236:8082","192.168.88.236:8084"]
}
  • 8082docker-hosted 仓库端口
  • 8084docker-group 仓库端口

重启 docker 服务

1
2
3
4
5
6
7
8
$ service docker restart

# 查看是否生效
$ docker info
Insecure Registries:
192.168.88.236:8082
192.168.88.236:8084
127.0.0.0/8

上传/拉取镜像

登录私服

1
2
3
4
5
6
7
$ docker login -u admin -p wx123\!@# 192.168.88.236:8082
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded # 登录成功

上传镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 拉取 hello-wrold 镜像
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
# 创建 tag(仓库地址/镜像名称:TAG)
$ docker tag hello-world 192.168.88.236:8082/myhello-world:1.0
# push 镜像
$ docker push 192.168.88.236:8082/myhello-world:1.0
The push refers to repository [192.168.88.236:8082/myhello-world]
e07ee1baac5f: Pushed
1.0: digest: sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4 size: 525

上传私库成功!

image-20220624120029872

拉取镜像

1
2
3
4
5
$ docker pull 192.168.88.236:8082/myhello-world:1.0
1.0: Pulling from myhello-world
Digest: sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4
Status: Image is up to date for 192.168.88.236:8082/myhello-world:1.0
192.168.88.236:8082/myhello-world:1.0

权限管理

默认是使用 admin 用户登录的,权限太高,可以创建一个 docker 账号,并创建对应的角色,分配 nx-repository-view-docker-*-* 权限

创建角色

image-20220624131513867

创建用户

创建用户,并加入对应的角色组

image-20220624131705122