一、什么是私有镜像仓库?
镜像仓库(Docker Registry)有公有和私有的两种形式:
- 公共仓库:例如Docker官方的
Docker Hub
,国内也有一些云服务商提供类似于Docker Hub
的公开服务,比如网易云镜像服务、DaoCloud
镜像服务、阿里云镜像服务等。- 除了使用公开仓库外,用户还可以在本地搭建私有
Docker Registry
。企业自己的镜像最好是采用私有Docker Registry
来实现。比如Nexus 、Harbor 、等。
二、私有仓库能做什么?
- 可以存储公司私有镜像,避免暴露到外网。
- 快速交付:当应用程序开发完成后,可以直接打包成一个镜像,将镜像上传到私有仓库后,可以在任何装有Doker的机器上下载该镜像,并运行为一个容器。
三、Nexus 、Harbor的区别
- Harbor :可以自建文件夹进行分组这点就非常好。其实说实话,作为一个私有的镜像仓库,
Harbor
已经做得很好的了,唯一的缺点是它无法帮你下载镜像。因为在kubernetes
环境下,你肯定有去公网拉镜像的需求,无论是官方还是非官方。你不可能因为这个而特地给你的所有node
节点开通外网访问吧,这样风险太多且不可控。在我看来,整个kubernetes
集群都不能访问外网。- Nexus :当你需要拉公网镜像的时候,你只要向它发起请求,它如果本地没有,就会自动去你配置的镜像仓库下载,下载完成之后先在本地缓存一份,然后发送给你。你甚至不用给
Nexus
开通外网,只需要在一台可以访问外网的机器上搭建一个代理服务就行,让Nexus
通过代理去下载。
四、Nexus的搭建
4.1 Docker安装Nexus
yaml
# Step 1:保证服务器对Nexus端口开放
# Step 2:创建/opt/docker/nexus文件夹。
# -p: 没有就创建。
mkdir -p /opt/docker/nexus
# Step 3:放给最高权限,方便使用
chmod 777 -R /opt/docker
# Step 4:运行 nexus3 容器
docker run -d --restart=always -p 8081:8081 --name nexus_container -v /opt/docker/nexus:/nexus-data sonatype/nexus3
# Step 5:日志查看
docker logs -f nexus_container
五、Nexus的使用
5.1 登录Nexus
yaml
# Step 1:安装完成后可访问Nexus管理平台:http:ip:端口
# Step 2:登录Nexus,默认管理员用户名:admin 密码:admin123,如果提示密码不对,需要到容器里面查看管理员admin密码。
# cat /home/nexus/data/admin.password
# Step 3:第一次登陆之后,一般提示修改密码!修改密码之后,重新登录!
5.2 配置Nexus
Nexus默认创建了几个仓库,如下:
5.2.1 仓库名称
仓库名称 | 说明 |
---|---|
maven-central | Nexus 对 Maven 中央仓库的代理,默认从repo1.maven.org/maven2/拉取ja... |
maven-releasse | Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库,私库发行版jar,初次安装请将Deployment policy设置为Allow redeploy要求 releasse 版本 |
maven-snapshots | Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库,要求 snapshots 版本 |
maven-public | Nexus 默认创建,仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml或项目pom.xml中使用 |
5.2.2 仓库类型
仓库类型 | 说明 |
---|---|
proxy | 代理仓库:它们被用来代理远程的公共仓库,如maven中央仓库。 |
hosted | 本地仓库:通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。 |
group | 仓库组:用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。 |
5.3 创建 Nexus仓库
除了自带的仓库,有时候我们需要单独创建自己的仓库,按照默认创建的仓库类型来创建我们自己的仓库。点击Create Repository
选择如下三种类型的仓库。
5.3.1 Hosted 仓库
输入仓库名,点击创建即可。
5.3.2 Proxy仓库
输入仓库名以及被代理仓库的URL,这里我输入阿里云的仓库地址,默认为中央仓库。
5.3.3 Group仓库
根据group仓库的解释,group仓库是其他仓库的集合,所以需要将其他创建的仓库添加到组里。
上面的仓库创建好之后就可以在首页看到了。
5.4 通过 Nexus 下载 jar 包
5.4.1 创建一个新仓库
Nexus私服搭建好之后就可以通过Nexus下载jar包了。为了方便演示我在本地创建了一个空的仓库:new-repo
5.4.2 修改Maven的配置,将新仓库作为默认仓库
5.4.3 修改镜像配置(这里我们之前都是配置的阿里云仓库,现在改为我们自己的Nexus仓库)
xml
<mirror>
<id>maven-public</id>
<mirrorOf>central</mirrorOf>
<name>Maven public</name>
<url>http://192.168.11.164:8090/repository/maven-public/</url>
</mirror>
这里的 url 标签是这么来的: 把上图中看到的地址复制出来即可。如果我们在前面允许了匿名访问,到这里就够了。但如果我们禁用了匿名访问,那么接下来我们还要继续配置settings.xml
:
xml
<server>
<id>maven-public</id>
<username>admin</username>
<password>admin</password>
</server>
注意:server 标签内的 id 标签值必须和 mirror
标签中的 id 值一样,用户名和密码是修改之后的。
5.4.4 验证
我们新建一个Maven
项目然后引入一个依赖(这里我用fastjson2
举例)来验证jar包是否是通过Nexus
下载的。新建项目之后修改项目的Maven
配置以及引入依赖。
等待下载完成我们刷新对应的仓库可以发现jar包已经下载到Nexus里面了。
5.5 将 jar 包部署到 Nexus
演示完通过
Nexus
下载jar
包,接下该演示怎么将本地模块打包发布到Nexus
私服,让其他的项目来引用,以更简洁高效的方式来实现复用和管理。因为发布jar包涉及到snapshots 和releases仓库,所以需要配置这两个的仓库的访问权限,同样的这是针对禁用了匿名访问的操作的,如果没有禁用匿名访问,这里依然不用配置。
5.5.1 需要配置的server:
xml
<server>
<id>maven-public</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>maven-releases</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>maven-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
5.5.2 配置pom.xml
然后在我们需要上传的 maven 项目中的pom.xml添加如下配置:
xml
<!-- 这里的 id 要和上面的 server 的 id 保持一致,name 随意写-->
<distributionManagement>
<repository>
<id>maven-releases</id>
<name>Releases Repository</name>
<url>http://192.168.11.164:8090/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>maven-snapshots</id>
<name>Snapshot Repository</name>
<url>http://192.168.11.164:8090/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
5.5.3 部署到Nexus
然后点击部署deploy 就可以将项目发布到Nexus了。
然后刷新maven-snapshots
仓库就可以发现,项目已经发布了。
5.6 疑问
注意:为什么是发布到snapshot仓库呢?那如果想要发布到releases仓库该怎么做呢?
这是因为我们创建Maven的时候,版本号默认为1.0-SNAPSHOT,所以就对应发布到snapshot仓库了,只需要将版本号改为正式版本号就可以了。
然后点击deploy 就可以在releases 仓库找到了。
最后,介绍一下Maven几个常用命令的作用。
package
命令完成了项目编译、单元测试、打包功能。
install
命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库。
deploy
命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。