nexus3代理仓库的使用

nexus简介


相当于centos 的 yum 仓库,docker 的 harbor 仓库。nexus 的用途是自建私有仓库,用途可以非常广泛。


需求分析


image-20241106105915696

有这样一个环境,内网是无互联网的,但是前后端编译以及docker基础镜像都是需要通过互联网来获取的。找来了一台主机做了双网卡。

需要实现:前端编译、后端打包、docker基础镜像的拉取都通过 nexus来代理实现。


基础环境介绍


主机配置尽量在 4 核、8G 及以上。

操作系统 版本
CentOS 7.9
docker-ce 26.1.4
nexus

网络上翻了半天别人的教程,也跟着做了几次,还是没能成功。因此,自己慢慢摸索记录下来。


容器安装nexus3


nexus服务器:192.168.199.61
测试客户端:192.168.199.62

通过容器安装nexus3

root@localhost(192.168.199.61)/root>mkdir -pv /data/nexus
mkdir: created directory ‘/data/nexus’
root@localhost(192.168.199.61)/data/nexus>mkdir nexus-data
#因为容器运行起来是nexus用户,UID/GID为200
root@localhost(192.168.199.61)/data/nexus>chown -R 200:200 nexus-data/

#编写启动脚本
root@localhost(192.168.199.61)/data/nexus>vim run.sh
#!/bin/bash
docker run -d \
--name nexus \
-p 8081:8081 \
-p 8000:8000 \
-p 8010:8010 \
--restart always \
-v $PWD/nexus-data:/nexus-data \
sonatype/nexus3:latest

###启动脚本说明###
#8081 - nexus web控制台
#8000 - 预留给镜像仓库的端口
#8010 - 预留给上传镜像的端口
#
#如果是做为 docker 镜像仓库,至少需要开放2个端口。
##################


#授权并执行
root@localhost(192.168.199.61)/data/nexus>chmod +x run.sh
root@localhost(192.168.199.61)/data/nexus>./run.sh
2f89ed06ac1beeb732ff54be3ed1ad3eaca7d0128eda193b47808ff582bd4d11

nexus 容器启动较慢,在如下初始化较慢。

2024-11-07 02:36:00,643+0000 INFO  [FelixStartLevel] *SYSTEM org.sonatype.nexus.internal.security.model.orient.OrientSecurityConfigurationSource - Initializing default users
2024-11-07 02:36:23,204+0000 INFO  [FelixStartLevel] *SYSTEM org.sonatype.nexus.internal.security.model.orient.OrientSecurityConfigurationSource - Initializing default user/role mappings
...

出现如下信息表示启动成功。

2024-11-07 02:40:44,555+0000 INFO  [jetty-main-1] *SYSTEM org.eclipse.jetty.server.Server - Started @438414ms
2024-11-07 02:40:44,555+0000 INFO  [jetty-main-1] *SYSTEM org.sonatype.nexus.bootstrap.jetty.JettyServer -
-------------------------------------------------

Started Sonatype Nexus OSS 3.66.0-02

-------------------------------------------------

网页控制台登录

通过浏览器打开 http://192.168.199.61:8081/

image-20241107104625923

默认帐号:admin
密码获取办法:
#进入容器
docker exec -it nexus bash
#查看密码
bash-4.4$ cat /nexus-data/admin.password

首次登录成功后,会提示一些设置。

image-20241107105214847

重新设置密码

image-20241107105244597

这里一定要选择允许任何人访问,否则后面会出现一些权限问题。

image-20241107105302491

后面就直接点击完成。到此,docker 安装 nexus3 及初始化完成。


容器镜像代理仓库


首先,docker镜像仓库因为前段时间被限制的原因,国内源几乎全部阵亡。因此这里你有特殊手段,小飞机、Clash 什么的,然后打开软件的代理,如图:

image-20241106180540844


配置nexus3网络代理

登录成功后,点击 齿轮。登录成功才会有 齿轮。

image-20241107105609940

点击左侧 system -> HTTP

image-20241107105703709

开启代理并配置你自己的代理IP及端口。

image-20241107105739964

配置完毕,拉到最后点击save

image-20241107105819517

这样配置完毕之后,nexus3 及可以代理访问“外网”了。

首页红色提示升级问题处理。

配置好“外网”之后,返回首页 nexus3 会提示升级,而然我们并不需要升级而且看着也很烦,可以进行关闭。

点击 齿轮 -> system -> Capabilities -> Outreach: Management -> Disable 即可。

image-20241107110235429

再次返回首页,也就没有升级提示了。

image-20241107110253251


创建docker仓库存储

image-20241107110729332

选择file并设置名称为:dockerhub

image-20241107110821713

点击 save,即可创建完毕。


配置docker本地仓库

image-20241107110345698

首先,配置本地仓库。本地仓库用来干嘛?本地仓库用来存储:由本地制作或备份的镜像文件,使用命令:docker push 的镜像文件。

image-20241107110423665

  1. 给个名字叫:docker-hosted
  2. 开启HTTP端口为:8010(在启动容器时,多映射了两个端口:8010和8000,就是为了这里配置时候使用)
  3. 开放允许pull的权限
  4. 兼容docker 的v1接口
  5. 仓库数据存储在 dockerhub中

image-20241107110944466

拉到最后点击:Create repository ,到这里镜像本地仓库创建完毕。


配置docker代理仓库

image-20241107110345698

选择 docker(proxy)

image-20241107111307042

  1. 给个名字叫:docker-proxy
  2. 注意这里不开启HTTP端口
  3. 开放允许pull的权限
  4. 兼容docker 的v1接口
  5. 配置proxy - remote storage为:https://registry-1.docker.io
  6. 仓库数据存储在 dockerhub中

image-20241107112210825

image-20241107112101187

拉到最后点击:Create repository ,到这里镜像代理仓库创建完毕。


配置docker仓库组

组的概念就是囊括了所有的docker仓库。

image-20241107110345698

选择docker(group)

  1. 给个名字叫:docker-all
  2. 开启HTTP端口为:8000(在启动容器时,多映射了两个端口:8010和8000,就是为了这里配置时候使用)
  3. 开放允许pull的权限
  4. 兼容docker 的v1接口
  5. 仓库数据存储在 dockerhub中

image-20241107112417880

将所有docker仓库都加入到组

image-20241107112622501

拉到最后点击:Create repository ,到这里镜像组创建完毕。

创建完毕后 ,切换到主页就可以浏览这三个仓库

image-20241107112719400


配置docker使用nexus3仓库

#客户端:192.168.199.62

#安装docker-ce
root@localhost(192.168.199.62)/root>yum install -y docker-ce

#配置安全仓库,将nexus3 docker仓库的两个端口配置进去
root@localhost(192.168.199.62)/root>vim /etc/docker/daemon.json
...
  "insecure-registries": [
    "192.168.199.61:8000",
    "192.168.199.61:8010"
  ],
    "registry-mirrors": [
    "http://192.168.199.61:8000",
    "http://192.168.199.61:8010"
  ]
}

#重启docker更新配置
root@localhost(192.168.199.62)/root>systemctl restart docker

#docker登录nexus3仓库
root@localhost(192.168.199.62)/root>docker login -u admin -p admin123 192.168.199.61:8010
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: login attempt to http://192.168.199.61:8010/v2/ failed with status: 401 Unauthorized

注意:这里的用户名和密码都是页面登录认证的用户名密码,如果输入正确的用户名密码依然报401,则需要查看是否授权。

点击 齿轮 -> Security -> Realms

Docker Bearer Token 移动到右边去,然后点击保存。

image-20241107113808427

之后,再次进行登录测试。

root@localhost(192.168.199.62)/root>docker login -u admin -p admin123 192.168.199.61:8010
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

拉取镜像测试

root@localhost(192.168.199.62)/root>docker pull nginx:alpine
alpine: Pulling from library/nginx
43c4264eed91: Pull complete
d1171b13e412: Pull complete
596d53a7de88: Pull complete
f99ac9ba1313: Pull complete
fd072e74e282: Pull complete
379754eea6a7: Pull complete
45eb579d59b2: Pull complete
472934715761: Pull complete
Digest: sha256:2140dad235c130ac861018a4e13a6bc8aea3a35f3a40e20c1b060d51a7efd250
Status: Downloaded newer image for nginx:alpine
docker.io/library/nginx:alpine

root@localhost(192.168.199.62)/root>docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        alpine    cb8f91112b6b   5 weeks ago   47MB

镜像拉取成功,通过页面查看仓库。

image-20241107114122464

查看 docker-all仓库 证实了,通过nexus代理拉取到的镜像。再次查看 docker-proxy仓库。

image-20241107114223577

当通过 docker-all 去拉取镜像时,如果没有,则从 docker-proxy通过“外网” 去下载镜像,并在nexus存储一份。

上传镜像测试

制作一个测试使用的镜像,编写文件如下:

root@localhost(192.168.199.62)/root/manfiests>cat Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
root@localhost(192.168.199.62)/root/manfiests>cat index.html
hello hukey

#创建镜像
root@localhost(192.168.199.62)/root/manfiests>docker build -t 192.168.199.61:8000/myapp:v1 ./

#上传镜像
root@localhost(192.168.199.62)/root/manfiests>docker push 192.168.199.61:8000/myapp:v1
The push refers to repository [192.168.199.61:8000/myapp]
9e37e7afc57a: Preparing
528b47987bcf: Layer already exists
a533c9e2e114: Layer already exists
6033613561cc: Layer already exists
0de02d5b2d31: Layer already exists
f80bfdacda57: Waiting
1241fe31c0bf: Waiting
4e9e0d6ba2cc: Waiting
63ca1fbb43ae: Waiting
denied: Deploying to groups is a PRO-licensed feature. See https://links.sonatype.com/product-nexus-repository

注意:

denied: Deploying to groups is a PRO-licensed feature. See https://links.sonatype.com/product-nexus-repository 

官网说明

“deploying to groups”是Pro许可证才具备的功能。这个功能允许用户将程序包发布到指定的组,而不是一个一个单独的设备上。
这对于大规模的部署任务非常有用,例如企业内部需要同时安装大量电脑上的程序,可以通过部署到组的方式来大大提高效率。需要注意的是,这个功能是Pro许可证才有的,如果用户只是免费使用软件,是无法享受该功能的。

但是,实际上研发人员提交的docker仓库是host模式,而不是group模式。

本文中,监听 host模式的端口为:8010,修改镜像tag

root@localhost(192.168.199.62)/root/manfiests>docker tag 192.168.199.61:8000/myapp:v1 192.168.199.61:8010/myapp:v1
root@localhost(192.168.199.62)/root/manfiests>docker push 192.168.199.61:8010/myapp:v1
The push refers to repository [192.168.199.61:8010/myapp]
9e37e7afc57a: Pushed
528b47987bcf: Pushed
a533c9e2e114: Pushed
6033613561cc: Pushed
0de02d5b2d31: Pushed
f80bfdacda57: Pushed
1241fe31c0bf: Pushed
4e9e0d6ba2cc: Pushed
63ca1fbb43ae: Pushed
v1: digest: sha256:22efaffb2e309f2ae2a5c6dac1131a6f292835ef22e66a6f4ec748b72ee566cc size: 2196

镜像上传成功,通过控制台查看仓库.

image-20241107135437211

仓库可查镜像,上传成功。

测试下 nexus3 proxy 的缓存效果:

#删除所有镜像
root@localhost(192.168.199.62)/root/manfiests>docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

#再次下载nginx:alpine镜像
root@localhost(192.168.199.62)/root/manfiests>docker pull nginx:alpine
alpine: Pulling from library/nginx
43c4264eed91: Already exists
d1171b13e412: Already exists
596d53a7de88: Already exists
f99ac9ba1313: Already exists
fd072e74e282: Already exists
379754eea6a7: Already exists
45eb579d59b2: Already exists
472934715761: Already exists
Digest: sha256:2140dad235c130ac861018a4e13a6bc8aea3a35f3a40e20c1b060d51a7efd250
Status: Downloaded newer image for nginx:alpine
docker.io/library/nginx:alpine

root@localhost(192.168.199.62)/root/manfiests>docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        alpine    cb8f91112b6b   5 weeks ago   47MB

通过pull镜像的日志可以看到,该镜像已经存在,就直接从 docker-proxy仓库中获得,nexus3 缓存到了上次pull的镜像,起到了缓存镜像、加速拉取的效果。


前端node代理仓库


创建npm仓库存储

image-20241107140026523

选择file并设置名称为:npm

image-20241107140114269


配置npm代理镜像

image-20241107110345698

  1. 编写名字
  2. 设置代理地址为:https://registry.npm.taobao.org

image-20241107140556870

image-20241107140625839

拉到最后点击:Create repository ,到这里npm代理仓库创建完毕。


配置npm使用nexus3仓库

使用前端代码来使用npm编译前端代码。

#前端代码
root@localhost(192.168.199.62)/root/frontend>ls
Dockerfile  nginx/  package.json  public/  README.md  scripts/  src/

#使用node镜像启动前端代码并编译
root@localhost(192.168.199.62)/root>docker run -it --rm -v /root/frontend:/app node:15.2.0 bash

#开始编译
root@cdf0a8f0d625:~# cd /app/
root@cdf0a8f0d625:/app# npm install --legacy-peer-deps --registry=http://192.168.199.61:8081/repository/npm-proxy/
...
49 packages are looking for funding
  run `npm fund` for details

root@cdf0a8f0d625:/app# npm run build

编译完成后,通过控制台查看文件

image-20241107142109887

到此,实现了内网通过nexus3拉取依赖环境。


后端mvn代理仓库


创建mvn仓库存储

image-20241107142351090

选择file并设置名称为:mvn

image-20241107142426401

点击save即可。


配置mvn代理镜像

image-20241107110345698

选择 maven2(proxy)

  1. 写名称
  2. 配置代理地址:https://maven.aliyun.com/repository/public
  3. 存储改为 npm

image-20241107142634610

image-20241107142644033

拉到最后点击:Create repository ,到这里mvn代理仓库创建完毕。


配置mvn使用nexus3仓库

从主机安装的 maven 中拷贝一份配置文件 settings.xml 进行如下修改:

#mirrors修改如下:
<!--
<mirrors>
    <mirror>
        <id>nexus3</id>
        <mirrorOf>*</mirrorOf>
        <name>nexus3</name>
        <url>http://192.168.199.61:8081/repository/mvn-proxy/</url>
    </mirror>
</mirrors>
-->
...

启动maven容器并挂载后端代码

#启动容器
root@localhost(192.168.199.62)/root>docker run -it --rm -v /root/settings.xml:/root/.m2/settings.xml -v /root/backend:/app maven:3.6.1-jdk-8 bash

#编译代码
root@65b7aabbf1e9:/app# ls
assembly  pom.xml  sql  src
root@65b7aabbf1e9:/app# mvn clean install -Dmaven.test.skip=true
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  27.115 s
[INFO] Finished at: 2024-11-07T07:54:06Z
[INFO] ------------------------------------------------------------------------

通过nexus控制台查看仓库

image-20241107155952681

下载过的依赖库已经缓存了下来,到此 mvn基于nexus3代理仓库配置完毕。



--- EOF ---
posted @ 2024-11-07 16:04  hukey  阅读(195)  评论(0编辑  收藏  举报