JFrog Container Registry(JCR)社区版(开源版)安装,并配置docker registry和yum repo

前言,由于目前公司在评估几种Docker registry的方案,所以最近也是一直在看好用而且开源免费的方案。目前调研了以下几种方案:

1 Harbor

Harbor是VMware开源的Docker registry解决方案,基于Docker registry和Postgresql数据库搭建。支持Helm部署在kubernetes上,也支持On-premises 部署,目前已支持镜像漏洞扫描,权限验证管控方面做得也很不错。目前是CNCF的一个项目,用的人很多,缺点是稍微有些重,目前架构已经经过了一些优化,执行效率比以前提升了许多。

2 Nexus OSS

Nexus OSS是属于sonatype公司的一款开源产品,支持的仓库类型也比较全,常用的Maven Docker npm yum helm等都支持,而且支持LDAP集成,目前官方支持Docker与二进制部署,Helm chart非官方支持,不过可以在helm官方stable里面找到sonatype-nexus的chart,在kubernetes上部署nexus。目前Nexus支持漏洞扫描,但是此功能为商业版的feature,需要购买订阅。

3 Artifactory

Artifactory是一个成熟的商业版产品,支持HA,分布式部署,并且商业版本对于高并发的处理上会更有效率。Artifactory在权限管理上做的颗粒度很细,可以满足对信息安全有严格要求的企业。在稳定性方面,经过了多家大公司的验证,以及JFrog在行业内的多年技术沉淀,是一款合格的商业级产品。

目前JFrog发布了社区版本的JCR?(JFrog?Container?Registry),作为一款功能强大且丰富的Docker 镜像中心,JCR 已经能够在

jfrog.com/container-registry 进行免费下载和使用。

那么我们今天就JCR的部署进行一个抛砖引玉,来给大家提供一些思路。

下面我们正式开始部署:

首先我们要清楚Artifactory OSS和JCR是两个产品,我们这次要部署的是JCR,官网地址:https://www.jfrog.com/confluence/display/JCR/Overview

环境要求:

Java: JFrog Container Registry must run withJDK 8(JDK 8 update 45 and above preferred)?or JDK 11.

JVM: ?-server -Xms512m -Xmx4g -Xss256k -XX:+UseG1GC

浏览器: Google Chrome;Firefox;Internet Explorer;Safari

硬件配置:

部署方式:

目前JCR支持以下几种方式部署:
Installing with Docker

Installing on Kubernetes

Installing on Linux, Solaris or Mac OS

Installing on Windows

今天我们在CentOS7上用RPM的部署方式,进行All-In-One的部署,所以我们这里不会建立额外数据库。

1 JCR安装

在安装CentOS7的时候,我们不要选择最小化安装,我们要选择Server With Gui,这样装出来的系统,Java JDK都不需要额外配置了,否则系统装完还需要装很多额外的包。

系统安装完成后,我们做一些初始化工作:

# systemctl stop NetworkManager

# systemctl disable NetworkManager

# systemctl stop firewalld

# systemctl disable firewalld

# iptables -F

用root身份登录系统,直接运行以下命令,即可部署最小化安装JCR

# wget https://bintray.com/jfrog/artifactory-rpms/rpm -O bintray-jfrog-artifactory-rpms.repo

# sudo mv bintray-jfrog-artifactory-rpms.repo /etc/yum.repos.d/

# sudo yum install jfrog-artifactory-jcr

安装完成后,我们可以启动JCR:

# systectl start artifactory

# systemctl status artifactory

● artifactory.service - Setup Systemd script for Artifactory in Tomcat Servlet Engine

? Loaded: loaded (/usr/lib/systemd/system/artifactory.service; enabled; vendor preset: disabled)

? Active: active (running) since Tue 2019-11-26 21:37:10 EST; 13min ago

? Process: 3471 ExecStop=/opt/jfrog/artifactory/bin/artifactoryManage.sh stop (code=exited, status=0/SUCCESS)

? Process: 3560 ExecStart=/opt/jfrog/artifactory/bin/artifactoryManage.sh start (code=exited, status=0/SUCCESS)

Main PID: 3612 (java)

? ? Tasks: 0

? CGroup: /system.slice/artifactory.service

? ? ? ? ? ? 3612 /usr/bin/java -Djava.util.logging.config.file=/opt/jfrog/artifactory/tomcat/conf/logging.properties -Djava.util.loggin...

Nov 26 21:37:00 localhost.localdomain artifactoryManage.sh[3560]: /usr/bin/java

Nov 26 21:37:00 localhost.localdomain artifactoryManage.sh[3560]: Starting Artifactory tomcat as user artifactory...

Nov 26 21:37:00 localhost.localdomain su[3588]: (to artifactory) root on none

Nov 26 21:37:00 localhost.localdomain artifactoryManage.sh[3560]: Max number of open files: 32000

Nov 26 21:37:00 localhost.localdomain artifactoryManage.sh[3560]: Using ARTIFACTORY_HOME: /var/opt/jfrog/artifactory

Nov 26 21:37:00 localhost.localdomain artifactoryManage.sh[3560]: Using ARTIFACTORY_PID: /var/run/artifactory.pid

Nov 26 21:37:00 localhost.localdomain artifactoryManage.sh[3560]: Tomcat started.

Nov 26 21:37:10 localhost.localdomain artifactoryManage.sh[3560]: Artifactory Tomcat started in normal mode

Nov 26 21:37:10 localhost.localdomain artifactoryManage.sh[3560]: Artifactory running with PID 3612

Nov 26 21:37:10 localhost.localdomain systemd[1]: Started Setup Systemd script for Artifactory in Tomcat Servlet Engine.

然后我们打开本地浏览器,访问serverIP:8081

用户名:admin

密码:password

由于默认安装没有开启https proxy,所以需要自行装nginx定在JCR前边,由于我们只想测试功能,所以我们这里直接加docker insecure,就不安装代理了。

2 系统配置

首先我们需要设置docker的http配置,

然后docker访问方式选择Path,proxy选择tomcat

这样我们便完成了系统设置工作,下一步我们建立一个本地的docker仓库

3 建立一个local类型的Docker仓库

首先我们选择admin->Repositories->local->new->Docker,然后在Repository Key填入你需要建立的仓库名字,然后Save

然后我们就可以在Artifacts里面看到我们新建立的仓库,截图里面有我建立的其他测试仓库,还有系统初始化自带的俩个仓库

接下来我们拉取一个hello-world镜像,打tag并尝试上传(这里注意,tag需要打成你服务器ip或者域名加端口8081,然后跟你仓库的名字):

[root@localhost ~]# docker pull hello-world

Using default tag: latest

Trying to pull repository docker.io/library/hello-world ...

latest: Pulling from docker.io/library/hello-world

1b930d010525: Pull complete

Digest: sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff

Status: Downloaded newer image for docker.io/hello-world:latest

[root@localhost ~]# docker images

REPOSITORY? ? ? ? ? ? ? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE

docker.io/nginx? ? ? ? ? ? ? ? latest? ? ? ? ? ? ? 231d40e811cd? ? ? ? 4 days ago? ? ? ? ? 126 MB

192.168.26.130:8081/ubr/nginx? latest? ? ? ? ? ? ? 231d40e811cd? ? ? ? 4 days ago? ? ? ? ? 126 MB

192.168.26.130:8081/ubr/nginx? v1? ? ? ? ? ? ? ? ? 231d40e811cd? ? ? ? 4 days ago? ? ? ? ? 126 MB

docker.io/hello-world? ? ? ? ? latest? ? ? ? ? ? ? fce289e99eb9? ? ? ? 11 months ago? ? ? 1.84 kB

[root@localhost ~]# docker tag docker.io/hello-world:latest 192.168.26.130:8081/test/hello-world:latest

[root@localhost ~]# docker push 192.168.26.130:8081/test/hello-world:latest

The push refers to a repository [192.168.26.130:8081/test/hello-world]

af0b15c8625b: Pushed

latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524

这里我们可以看到,我们的镜像已经push成功了,下面我们可以在test仓库是右键点击刷新,或者刷新浏览器,这里我们看到hello-world已经成功上传。

4 配置一个yum仓库

由于JCR默认不支持yum,所以我们需要利用Generic类型仓库,山寨一个yum仓库。

首先我们建立一个Generic的Repo,还是local类型的。根据官方文档,generic类型的仓库可以上传任何类型的package,但是不会为建立索引。所以我们在建立yum仓库的时候,需要提前建立好yum仓库的那些metadata文件,如果直接拷贝rpm包是不行的。我们提前需要通过reposync和createrepo来同步一个仓库,这里我拿之前同步的Redhat的几个官方仓库来做此次测试。

第一次用api的方式测试上传,命令如下:curl -u admin:password -X POST "http://192.168.26.130:8081/artifactory/api/import/repositories?repo=yum&path=/repo" 但是此种方式,只支持一级目录,不能包含子目录,所以放弃

第二次用官方的cli工具测试上传,首先下载cli工具:curl -fL https://getcli.jfrog.io | sh 然后运行 ./jfrog rt u "(*).(*)" repo --recursive=true --include-dirs --flat=false --url http://192.168.26.130:8081/artifactory/yum/ --user admin --password password 特别注意这里--flat=false这个参数必须加上,否则包含子文件夹的目录不会按照目录结构递归传输,导致所有东西全放在一级目录。

上传完毕之后,我们可以看到4个repo仓库都被同步到repo文件夹中了

最后,我们手动添加一个yum repo文件到系统中进行测试:

# vim /etc/yum.repos.d/arti.repo

[arti]

name=arti

baseurl=http://192.168.26.130:8081/artifactory/yum/repo/rhel-7-server-rpms/

gpgcheck=0

# yum repolist

Loaded plugins: langpacks

repo id? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? repo name? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? status

arti? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arti? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5,463

base/x86_64? ? ? ? ? ? ? ? ? ? ? ? ? ? CentOS-7 - Base - mirrors.aliyun.com? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 10,097

*epel/x86_64? ? ? ? ? ? ? ? ? ? ? ? ? Extra Packages for Enterprise Linux 7 - x86_64? ? ? ? ? ? ? ? ? ? ? ? 13,473

extras/x86_64? ? ? ? ? ? ? ? ? ? ? ? ? CentOS-7 - Extras - mirrors.aliyun.com? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 305

updates/x86_64? ? ? ? ? ? ? ? ? ? ? ? CentOS-7 - Updates - mirrors.aliyun.com? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 738

repolist: 30,076

这里我们看到,我们的arti仓库已经可用了

至此,我们已经配置好了Docker仓库和Yum仓库。JCR同样支持HELM仓库,但是比如Mavean NPM PHP Python Ruby的仓库,就得买商业版的Artifactory了。