写点什么

把 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:214105

评论

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

BoCloud博云微服务平台3.0正式发布:让微服务转型路径更清晰

BoCloud博云

微服务

个推CTO谈数据中台(上):从要求、方法论到应用实践

个推

大数据 数据中台 数字化转型 数据智能

Python3 Note __slots__

awen

Python slots

安迈云首席战略官于晓晖:去中心化云计算构建Web3.0世界

DT极客

实现接口幂等性的四种方案!

李阿柯

面试 编程之路 幂等性

NUCLEO-L432KC实现GPIO控制(STM32L432KC)

不脱发的程序猿

嵌入式 stm32 单片机 NUCLEO-L432KC STM32L432KC

工业制造业在数字化时代的三大发展方向

CECBC

Python3 Note 函数注解

awen

Python Function 函数注解

苏州源控电子科技怎么样?名副其实的行业新星

Geek_8a195c

从VMWare安装到Nginx配置

wildpig

nginx vmware Centos 7

数字人民币有望为全球贸易结算开辟新视窗

CECBC

【LeetCode】包含min函数的栈Java题解

Albert

算法 LeetCode 6月日更

六一儿童节,看我用ModelArts让8090梦回童年

华为云开发者联盟

AI 美食 童年 modelarts 六一

“图发展”与“保安全”:大数据今后怎么玩?

CECBC

六一限定,致每一个追光者

白洞计划

全球案例 | 一家财富500强公司利用 Jira 和 Jira Align 将万人级团队的生产力提高了 30%

Atlassian

管理 DevOps 敏捷 Jira 协同办公

mPaaS 月度小报 | 应用上线前都应该检查哪些指标?CodeHub#5回顾:小程序容器加持下的技术架构“提质增效”

蚂蚁集团移动开发平台 mPaaS

小程序 移动开发 mPaaS

因为一个字符校对问题,我的大厂面试挂了

华为云开发者联盟

MySQL 字符 字符校对 语句 MySQL5.7

人生算法:涌现,在自己身上发挥群体智慧

石云升

读书笔记 6月日更

净筹6亿美元:微盟正在加速拉开差距

ToB行业头条

SaaS 微盟

GitHub上收录400余篇任正非的讲话稿

不脱发的程序猿

GitHub 开源 程序人生 任正非讲话

webRTC探索音视频的录制的实现

云小梦

JavaScript WebRTC 浏览器API

用敏捷扑克做需求评审的3大优势,你get了吗?

LigaAI

高效工作 团队管理 产品思考

一文带你认识队列数据结构

华为云开发者联盟

Java 数据结构 数组 队列

智慧工厂VR拆解零件——3D虚实现实可视化系统

一只数据鲸鱼

数据可视化 工业互联网 vr 智慧工厂 零件拆解

Android studio 在外置硬盘运行项目报.lock 的错误

三爻

flutter android Mac Android Studio

Serverless over Storage

焱融科技

云计算 容器 云原生 高性能 文件存储

计算机视觉常用图像数据集标记平台

不脱发的程序猿

人工智能 计算机视觉 图像处理 图像数据集标记平台

☕️【Java技术之旅】深入学习JIT编译器实现机制(原理篇)

码界西柚

Java 编译器 JIT 6月日更

模块五总结

竹林七贤

Python3 Note 对象初始化

awen

Python 生命周期 对象初始化

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