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 ---

本文作者:hukey

本文链接:https://www.cnblogs.com/hukey/p/18532480

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hukey  阅读(540)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 彩虹 Jay
彩虹 - Jay
00:00 / 00:00
An audio error has occurred.

彩虹 + 轨迹 (Live) - 周杰伦 (Jay Chou)

彩虹

词:周杰伦

曲:周杰伦

哪里有彩虹告诉我

哪里有彩虹告诉我

能不能把我的愿望还给我

能不能把我的愿望还给我

为什么天这么安静

为什么天这么安静

所有的云都跑到我这里

有没有口罩一个给我

有没有口罩一个给我

释怀说了太多就成真不了

释怀说了太多就成真不了

也许时间是一种解药

也许时间是一种解药

也是我现在正服下的毒药

也是我现在正服下的毒药

看不见你的笑 我怎么睡得着

看不见你的笑 我怎么睡得着

你的声音这么近我却抱不到

你的声音这么近我却抱不到

没有地球太阳还是会绕

没有地球太阳还是会绕

没有理由我也能自己走

没有理由我也能自己走

你要离开 我知道很简单

你要离开 我知道很简单

你说依赖 是我们的阻碍

你说依赖 是我们的阻碍

就算放开 但能不能别没收我的爱

就算放开 但能不能别没收我的爱

当作我最后才明白

当作我最后才明白

看不见你的笑 要我怎么睡得着

看不见你的笑 要我怎么睡得着

你的声音这么近我却抱不到

没有地球太阳还是会绕 会绕

没有理由我也能自己走掉

释怀说了太多就成真不了

也许时间是一种解药 解药

也是我现在正服下的毒药

轨迹

词:黄俊郎

曲:周杰伦

我会发着呆然后忘记你

接着紧紧闭上眼

想着哪一天 会有人代替

想着哪一天 会有人代替

让我不再想念你

我会发着呆 然后微微笑

我会发着呆 然后微微笑

接着紧紧闭上眼

又想了一遍 你温柔的脸

又想了一遍 你温柔的脸

在我忘记之前