首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开源Registry项目Harbor源代码结构解析

开源Registry项目Harbor源代码结构解析

作者头像
Henry Zhang
发布2019-04-12 16:27:00
1.2K0
发布2019-04-12 16:27:00
举报
文章被收录于专栏:亨利笔记亨利笔记

题图摄于旧金山7号码头(Pier 7):曙光初现

上周我们介绍了Harbor开源企业级容器Registry的架构,获得了社区很多朋友的反馈和建议,再次一并感谢,希望和大家一起,共同建设一个优秀的开源项目。本文请Harbor项目工程师尹文开介绍源码结构,帮助开发和运维人员理解代码的工作原理。

Harbor项目概览

容器应用的开发和运行离不开可靠的镜像管理。从安全和效率等方面考虑,在企业私有环境内部署的Registry服务是非常必要的。Harbor(https://github.com/vmware/harbor)是由VMware中国研发团队为企业用户设计的Registry Server开源项目,包括了权限管理(RBAC)、图形管理界面、LDAP/AD集成、审计、自我注册、HA等企业必需的功能,同时针对中国用户的特点,原生支持中文,并计划实现镜像复制(roadmap)等功能。

本文主要介绍Harbor项目的源码结构,帮助开发和运维人员理解其工作原理。

主要组件

Harbor系统由五个容器组成:Proxy、Core Services(包含UI, tokenservice和webhook)、Database、Registry和Log Collector。

  • Proxy提供反向代理服务,用户的不同请求由Proxy分发到后端的UI或者Registry。Harbor中使用的是官方的nginx镜像。
  • Core Services是Harbor项目的核心组件,主要提供权限管理、审计、管理界面UI、token service以及可供其他系统调用的API等功能。
  • Database提供数据持久化服务,采用了官方的mysql镜像。
  • Registry是Docker官方的开源的Registry镜像,主要提供镜像的存储和分发功能。
  • Log Collector负责收集其他容器的日志并进行日志轮转。

各个容器之间的关系如下图所示:

源码结构

以下所述主要为Core Services组件的源码结构,通过根目录下的Dockerfile可以构建出Core Services的镜像。另外Deploy目录下的db和log分别对应Database和Log Collector的Dockerfile镜像构建文件,而Nginx和Registry则都是采用的官方镜像。

| -- api (Harbor提供的外部调用的API)

| -- auth (认证模块,目前提供两种方式:数据库和LDAP)

| -- db (数据库认证)

| -- ldap (LDAP认证)

| -- controllers (控制器相关代码)

| -- dao (数据持久层)

| -- Deploy (部署相关代码)

| -- db (构建Database镜像的源码)

| -- log (构建Log Collector镜像的源码)

| -- docker-compose.yml (运行Harbor的docker compose文件)

| -- docs (文档)

| -- log (log工具)

| -- models (数据库映射的模型代码)

| -- routers (路由相关代码)

| -- service (服务)

| -- notification.go (处理Registry发来的镜像上传或下载等事件)

| -- token.go (为Registry提供鉴权服务)

| -- static (js、css等文件)

| -- utils (工具类)

| -- vendor (依赖的第三方源码)

| -- views (html模版文件)

| -- Dockerfile (构建Core Services镜像的Dockerfile)

| -- main.go (入口函数)

源码分析

下面以获取项目列表和获取某个项目的详细信息为例来分析Harbor源码。

Harbor项目使用了go语言开发,WEB框架采用beego。main.go、routers目录和controllers目录分别对应了入口函数、路由函数目录和控制器函数目录。当Core Services启动时,routers目录下的相应函数会将各个控制器与其所对应的用户请求URL进行注册,这样当不同的用户请求到达的时候,不同的控制器逻辑就会被触发。主要处理流程如下图所示:

当获取项目列表时会发送请求http://hostname/api/projects/,该请求首先到达Nginx。Nginx的配置文件如下:

server { listen 80; location / { proxy_passhttp://ui/; … } location /v1/ { return 404; } location /v2/ { proxy_passhttp://registry/v2/; … } location/service/ { proxy_passhttp://ui/service/; … } }

根据配置文件该请求会被转发到http://ui/,也即Core Services中的UI。根据UI中routers/router.go中定义的规则:

beego.Router( "/api/projects/?:id",&api.ProjectAPI{} )

可知该请求最终是由api包中的ProjectAPI的Get方法来处理的。ProjectAPI结构体的定义如下:

typeProjectAPI struct { BaseAPI userID int projectID int64 }

在beego中,控制器处理用户请求的方法执行之前首先会执行Prepare()方法来进行一些准备或者校验操作,ProjectAPI定义的Prepare()方法如下:

func(p *ProjectAPI) Prepare() { p.userID = p.ValidateUser() … }

Prepare()中调用BaseAPI中的ValidateUser方法检查用户的合法性,并将用户ID赋值给ProjectAPI的userID属性。之后执行Get方法来处理用户的请求:

func(p *ProjectAPI) Get() { queryProject :=models.Project{UserID: p.userID} … projectList, err :=dao.QueryProject(queryProject) … for i := 0; i < len(projectList); i++{ if isProjectAdmin(p.userID,projectList[i].ProjectID) { projectList[i].Togglable= true } } p.Data["json"] = projectList p.ServeJSON() }

Get方法中调用dao包中的QueryProject()方法来获取项目列表,之后遍历列表判断该用户是否对此项目具有administrator的权限,最终返回项目列表的JSON数据,此次用户请求处理完毕。

当获取某个项目的详细信息时会发送请求http://hostname/registry/detail,该请求同样会经过Nginx和Router并最终到达其对应的Controller的处理方法如下:

func (idc *ItemDetailController) Get() { //具体处理逻辑 … idc.ForwardTo("page_title_item_details","item-detail") }

具体的处理逻辑此处忽略。该方法的最后一步调用idc.ForwardTo(“page_title_item_details”,”item-detail”)定位对应的HTML模版文件。模版文件默认的存放目录为views,“item-detail”为模板文件名,因此该语句最终定位到views/item-detail.tpl的文件。经过数据填充最终生成对应的HTML文件并返回。

欢迎广大用户使用Harbor项目并反馈意见和建议,也欢迎加入我们贡献代码。如果您是Harbor的用户或开发者,请长按下面二维码加入Harbor开源项目群,以方便沟通。Github网址:

https://github.com/vmware/harbor

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 亨利笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档