前言,由于目前公司在评估几种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了。