nexus3代理仓库的使用
nexus简介
相当于centos 的 yum 仓库,docker 的 harbor 仓库。nexus 的用途是自建私有仓库,用途可以非常广泛。
需求分析
有这样一个环境,内网是无互联网的,但是前后端编译以及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/
默认帐号:admin
密码获取办法:
#进入容器
docker exec -it nexus bash
#查看密码
bash-4.4$ cat /nexus-data/admin.password
首次登录成功后,会提示一些设置。
重新设置密码
这里一定要选择允许任何人访问,否则后面会出现一些权限问题。
后面就直接点击完成。到此,docker 安装 nexus3 及初始化完成。
容器镜像代理仓库
首先,docker镜像仓库因为前段时间被限制的原因,国内源几乎全部阵亡。因此这里你有特殊手段,小飞机、Clash 什么的,然后打开软件的代理,如图:
配置nexus3网络代理
登录成功后,点击 齿轮。登录成功才会有 齿轮。
点击左侧 system -> HTTP
开启代理并配置你自己的代理IP及端口。
配置完毕,拉到最后点击save
这样配置完毕之后,nexus3 及可以代理访问“外网”了。
首页红色提示升级问题处理。
配置好“外网”之后,返回首页 nexus3 会提示升级,而然我们并不需要升级而且看着也很烦,可以进行关闭。
点击 齿轮 -> system -> Capabilities -> Outreach: Management -> Disable 即可。
再次返回首页,也就没有升级提示了。
创建docker仓库存储
选择file并设置名称为:dockerhub
点击 save,即可创建完毕。
配置docker本地仓库
首先,配置本地仓库。本地仓库用来干嘛?本地仓库用来存储:由本地制作或备份的镜像文件,使用命令:docker push 的镜像文件。
- 给个名字叫:docker-hosted
- 开启HTTP端口为:8010(在启动容器时,多映射了两个端口:8010和8000,就是为了这里配置时候使用)
- 开放允许pull的权限
- 兼容docker 的v1接口
- 仓库数据存储在 dockerhub中
拉到最后点击:Create repository ,到这里镜像本地仓库创建完毕。
配置docker代理仓库
选择 docker(proxy)
- 给个名字叫:docker-proxy
- 注意这里不开启HTTP端口
- 开放允许pull的权限
- 兼容docker 的v1接口
- 配置proxy - remote storage为:
https://registry-1.docker.io
- 仓库数据存储在 dockerhub中
拉到最后点击:Create repository ,到这里镜像代理仓库创建完毕。
配置docker仓库组
组的概念就是囊括了所有的docker仓库。
选择docker(group)
- 给个名字叫:docker-all
- 开启HTTP端口为:8000(在启动容器时,多映射了两个端口:8010和8000,就是为了这里配置时候使用)
- 开放允许pull的权限
- 兼容docker 的v1接口
- 仓库数据存储在 dockerhub中
将所有docker仓库都加入到组
拉到最后点击:Create repository ,到这里镜像组创建完毕。
创建完毕后 ,切换到主页就可以浏览这三个仓库
配置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
移动到右边去,然后点击保存。
之后,再次进行登录测试。
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
镜像拉取成功,通过页面查看仓库。
查看 docker-all
仓库 证实了,通过nexus代理拉取到的镜像。再次查看 docker-proxy
仓库。
当通过 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
镜像上传成功,通过控制台查看仓库.
仓库可查镜像,上传成功。
测试下 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仓库存储
选择file并设置名称为:npm
配置npm代理镜像
- 编写名字
- 设置代理地址为:https://registry.npm.taobao.org
拉到最后点击: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
编译完成后,通过控制台查看文件
到此,实现了内网通过nexus3拉取依赖环境。
后端mvn代理仓库
创建mvn仓库存储
选择file并设置名称为:mvn
点击save即可。
配置mvn代理镜像
选择 maven2(proxy)
- 写名称
- 配置代理地址:https://maven.aliyun.com/repository/public
- 存储改为 npm
拉到最后点击: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控制台查看仓库
下载过的依赖库已经缓存了下来,到此 mvn基于nexus3代理仓库配置完毕。