写点什么

把 JFrog Artifactory 作为 Docker 镜像仓库

  • 2020-04-23
  • 本文字数:3232 字

    阅读完需:约 11 分钟

把JFrog Artifactory作为Docker镜像仓库

本文是使用Rancher部署JFrog Artifactory的续集。本文中我们将演示如何把 JFrog Artifctory 作为你 Docker 镜像的私有仓库。


注意: 使用 JFrog Artifactory 的功能前需要获得证书, 不过你可以先选择试用 30 天 ,然后继续按照下文的流程操作。


##为部署工作准备 GCP


如果你想在本地网络以外的地方使用 Artifactory,首先要有一个公有 IP 地址。在这一系列文章的上篇中,我们将集群部署到谷歌云,本文中我们将继续使用 GCP 资源。当然,你要使用其他公有云都是一样的。


你可以通过谷歌云 Shell 或者 gcloud 命令在本地环境中运行下面的命令,申请公共 IP:


gcloud compute addresses create artifactory-demo --global
复制代码


输入名称用于取回 IP 地址(此次教程中我们取的名字是 artifactory-demo)


gcloud compute addresses describe artifactory-demo --global
复制代码


在 output 中查找 address 标签


address: 35.190.61.62
复制代码


为了给我们的部署服务获得满足需求的域名,我们将使用 Basecamp 的 xip.io 服务,在本教程中它的地址是 35.190.61.62.xip.io。

部署 Artifactory

你可以按照上一篇文章中的步骤来部署 Rancher 和 Artifactory,但是当你进入到应用程序部署页面中的配置部分时,还需要添加及修改下面的变量:


ingress.enabled=trueingress.hosts[0]=35.190.61.62.xip.ioartifactory.service.type=NodePortnginx.enabled=falseingress.annotations."kubernetes\.io/ingress\.global-static-ip-name"=artifactory-demo
复制代码


(可以复制/粘贴这块的文本到输入框里,Rancher 会自动转换)


一切完成后,应该会看到下面的样子:



点击 Launch 开始部署资源。

变量的概念解释

新 Artifactory 实例启动起来了,现在来看看刚刚我们都配置了什么。


ingress.enable=true


该变量允许创建一个 ingress 资源,它将作为 Artifactory 的代理,在我们的例子中,Ingresss 是带有 GCP 的负载均衡器。


ingress.hosts[0]=35.190.61.62.xip.io


这设置了 Artifactory 的主机名。xip.io 的一个神奇之处在于,我们可以创建任何子域并将其解析成 IP 地址,因此当我们使用 docker-demo.35.190.61.62.xip.io 时,在后面它都会被解析成 35.190.61.62。


artifactory.service.type=NodePort


在 Kubernetes 节点上的随机端口公开 Artifactory 的服务。Ingress 资源将向该端口发送流量。


nginx.enabled=false


我们是通过 Service 资源,利用 Ingress 和 Artifactory 进行通信的,因此我们希望禁止掉 nginx 代理,因为 Artifactory 在某些情况下会启动它。


ingress.annotations…


这就好比是将 Kubernetes 绑定到静态公共 IP 地址的粘合剂。我们将它设置成你保留的地址的名称,便于 Ingress 查找和使用正确的 IP。我们必须避免使用长长的内容,因为那是标注(annotations)的 name。如果不是这样的话,Kubernetes 可能会误解我们想要做什么。

检查部署

当部署完成后,查看 Workloads 选项卡。这里你会看到两个工作负载,一个是应用程序(artifactory-artifactory),另一个是 artifactory 使用的 PostgreSQL 数据库(artifactory-postgresql)



下一步查看 Load Balancing 选项卡,你会看到 Ingress 对象已经有了我们提供的主机名。



如果选择 View/Edit YAML 并滚动到下面,你可以看到指向 GCP 中地址名的标注(图片中的第 10 行)



在 Ingress 定义的下面你还可以看到 spec.rules.host 中的主机名匹配到了 status.loadBalancer.ingress.ip 的 IP 地址。

配置 Artifactory

关闭 View/Edit YAML 窗口,会返回 Load Balancing 选项卡,这里你可以看到一个带 xip.io 地址的链接。点开它打开 Artifactory,或者在浏览器中输入主机名。


单击 wizard,首先添加证书密钥,接着设置管理员密码。点击其余部分一直到 wizard 完成。


在左侧的菜单中,选择 Admin ,然后在 Repositories 下选择 Local



在这你可以看到经设置 wizard 后创建的默认仓库。在右上角选择+New 创建一个新的仓库,用 Docker 作为 package 类型,输入仓库的名称。在本例中,我们选择了 docker-demo,其余内容都使用的是默认值,然后选择 Save & Finish 来创建新的仓库。



这样一来,你选择的名称(即我们这里的 docker-demo)就成为了 xip.io 域名的子域。在我们此次的安装中,我们使用的是 docker-demo.35.190.61.62.xip.io。当然你配置的会和我不同,不过格式是相同的。

对镜像仓库进行测试

拥有了私有的 Docker 镜像仓库后,如果不使用它,那还有什么意义?


对生产部署,你将通过 SSL 证书来保护仓库的安全,这需要真实域名中的一个真实主机名。在本教程中,你可以直接使用新创建的仓库,不过要告诉 Docker 这是一个不安全的仓库。


按照文档创建或编辑 daemon.json:https://docs.docker.com/registry/insecure/。然后按照下面我的例子这样添加你的主机:


{ "insecure-registries": ["docker-demo.35.190.61.62.xip.io:80"]}
复制代码


如果你使用的是 Windows 或者 Mac 的 Docker,在应用的偏好中进行设置:



重启 Docker 应用更改的内容,在启动之后,你就可以使用仓库:


docker login docker-demo.35.190.61.62.xip.ioUsername: adminPassword:Login Succeeded
复制代码


继续我们的测试,pull 一个公共的容器镜像,re-tag 它,接着把它 push 到新的私有仓库中。

Pull 一个公共的容器镜像

Pull a Public Container Image$ docker pull nginxUsing default tag: latestlatest: Pulling from library/nginxf17d81b4b692: Pull completed5c237920c39: Pull completea381f92f36de: Pull completeDigest: sha256:b73f527d86e3461fd652f62cf47e7b375196063bbbd503e853af5be16597cb2eStatus: Downloaded newer image for nginx:latest
复制代码

Re-tag 镜像

你可以在系统中看到当前的镜像 id 和信息了:


$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               latest              dbfc48660aeb        2 days ago          109MB
复制代码


Re-tag 它,这样 Docker 就知道要把它 push 到你的私有仓库了:


$ docker tag nginx docker-demo.35.190.61.62.xip.io:80/nginx:latest
复制代码

Push 镜像到私有仓库

当镜像有了 re-tag,使用 docker push 传到私有仓库:


$ docker push docker-demo.35.190.61.62.xip.io:80/nginx:latestThe push refers to repository [docker-demo.35.190.61.62.xip.io:80/nginx]86df2a1b653b: Pushedbc5b41ec0cfa: Pushed237472299760: Pushedlatest: digest: sha256:d98b66402922eccdbee49ef093edb2d2c5001637bd291ae0a8cd21bb4c36bebe size: 948
复制代码

在 Artifactory 中验证 Push

返回到 Artifactory UI,在菜单中选择 Artifacts:



这里就可以看到 nginx 镜像以及它的信息了。


下一步可以做什么

如果你有 Artifactory 的证书并且希望运行私有仓库,只需使用你自己的域名以及 ingress 上的 SSL 证书重复上面的教程即可。完成这些附加项之后,你就可以在任何 Docker 或者 Kubernetes 安装中使用私有仓库,而无需告诉主机它可能会出现和不安全仓库的通信。

清理

要想清理掉文中出现的资源,先从 Rancher 中删除 Kubernetes 集群,并且从 GCP 中删除 Rancher 服务器:


gcloud compute --project=rancher-20 instances delete \ rancher-instance --zone=europe-west2-c
复制代码


你还需要删除公共 IP 地址的分配:


gcloud compute addresses delete artifactory-demo --global
复制代码

结语

JFrog Artifactory 提供了用于开发生命周期核心部分的服务,你几乎可以存储和检索到开发团队产生的任何类型的工件,并把这些工件存在一个集中的、受管理的地方,这样对于任何 IP 基础设施,Artifactory 都是它重要的部分。


Rancher 可以轻松地将 Artifactory 部署到 Kubernetes 安装中。短短几分钟内,我们就创建并运行了 Artifactory,这安装所花费的时间甚至可能比实际上配置 Artifactory 本身所需的时间还短!


Rancher 的出现让 Kubernetes 更容易上手,Artifactory 更容易管理 binary 资源,把这两者结合起来,就能把你从繁琐的工序中解放出来,专注于你工作的中心,这种自由才是最重要的!


2020-04-23 17:214062

评论

发布
暂无评论
发现更多内容

基于深度学习的医学图像分割(一)

cv君

AI 引航计划

TensorFlow by GoogleCNN识别猫和狗, 过拟合优化 易筋 ARTS 打卡 Week 70

John(易筋)

ARTS 打卡计划

Vue进阶(幺贰柒):插槽详解

No Silver Bullet

Vue 插槽 10月月更

Interrupted Exception异常可能没你想的那么简单!

华为云开发者联盟

线程 JVM 高并发 并发 java

业界首个机密计算容器运行时—Inclavare Containers正式进入CNCF!

阿里巴巴云原生

阿里云 容器 云原生

disruptor在数据同步场景下的应用实战

编程 架构 面试 后端

第 12 章 -《Linux 一学就会》-重定向和文件的查找

学神来啦

云计算 Linux 运维 linux学习

从头开始(概率)学HMM:精讲第四课-预测问题(维特比算法)

herosunly

AI 引航计划 内容合集

【Flutter 专题】35 图解自定义 View 之 Canvas (三)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

OpenKruise 如何实现应用的可用性防护?

阿里巴巴云原生

阿里云 开源 云原生 OpenKruise

何时适合进行自动化测试?(上)

禅道项目管理

自动化测试

Form Schema 定义详解

全象云低代码

大前端 低代码平台 JSON Schema

【设计模式】第一篇 - 组合模式

Brave

组合模式 10月月更

【布隆过滤】大数据+查重过滤+爬虫领域精选算法

cv君

AI 引航计划

定制个机器人帮你和Ta聊天

万俊峰Kevin

golang chatbot 聊天机器人 微信聊天

源码 | 为金融场景而生的数据类型:Numeric

RadonDB

数据库 postgresql

保姆级人工智能学习成长路径

herosunly

AI 引航计划 内容合集

仁兄,可曾听闻OpenVINO

cv君

AI 引航计划

从头开始(概率)学HMM:精讲第五课-EM算法

herosunly

AI 引航计划 内容合集

智慧火电扭转传统运作模式,3D可视化助力双碳政策疾行

一只数据鲸鱼

数据可视化 智慧能源 火力发电 智慧火电 火电厂

🐬【MySQL技术专题】该换换你的数据库版本了,让我们一同迎接8.0的到来哦!(初探篇)

码界西柚

MySQL 运维 MySQL8.0 MySQL 数据库 10月月更

从头开始(概率)学HMM:精讲第三课-概率计算问题

herosunly

AI 引航计划 内容合集

架构实战营作业 -- 模块四

冬瓜茶

为了减少代码复杂度,我将if-else升级为面向状态编程

华为云开发者联盟

编程 复杂度 面向状态编程 if-else

VSCode设置Python的unittest测试

陈磊@Criss

mysql cpu占用超过100%

hasWhere

决策树——从原理走向实战

cv君

AI 引航计划

自定义Vue脚手架模板之:Vue-Cli源码分析

Brave

源码 vue cli 10月月更

【LeetCode】重复的DNA序列Java题解

Albert

算法 LeetCode 10月月更

010云原生之可观测架构模式

穿过生命散发芬芳

云原生 10月月更

netty系列之:使用netty搭建websocket客户端

程序那些事

Java Netty websocket 程序那些事

把JFrog Artifactory作为Docker镜像仓库_文化 & 方法_Rancher_InfoQ精选文章