Harbor镜像仓库远程同步

1、简介

Harbor(中文名“港湾”)是一个开源的企业级Docker Registry服务器,旨在为组织和团队提供高度安全、可管理和可扩展的容器镜像存储和分发解决方案。作为Docker镜像的存储库,Harbor充分利用了Docker镜像作为现代应用交付和部署的核心组件,为企业提供了一套功能丰富的工具,以满足镜像管理的多样化需求。

2、特点和功能

  • 安全性和访问控制: Harbor注重保障容器镜像的安全性。它提供了用户身份验证、权限控制和镜像签名等功能,确保只有经过授权的用户才能访问和下载镜像。这种安全机制为敏感应用和数据提供了保护。
  • 多种认证方式: Harbor支持多种认证方式,包括LDAP、AD、OIDC等,使组织能够与现有的身份验证和授权系统集成,方便用户的管理和访问。
  • 版本控制和标签管理: 镜像的版本控制和标签管理对于应用的开发、测试和部署是至关重要的。Harbor允许用户按版本管理镜像,使团队能够轻松地回滚到以前的版本,同时通过添加标签来更好地组织和分类镜像。
  • 垃圾回收和存储管理: 镜像仓库中可能会存在许多不再使用的镜像和层,占用大量存储空间。Harbor支持垃圾回收机制,帮助用户清理废弃的镜像和层,释放存储空间,提高存储效率。
  • 镜像复制和同步: Harbor允许在不同的Registry之间复制和同步镜像,这对于跨不同地区或云环境部署应用的组织非常有用。这样,您可以确保在不同地理位置之间的一致性。
  • 界面友好和可视化: Harbor提供了直观的Web界面,用户可以通过浏览器轻松地浏览、搜索和管理镜像。这种可视化的方式使非技术人员也能够轻松使用该平台。
  • 多仓库支持: 在一个Harbor实例中,您可以创建多个仓库,以组织和管理不同类型的镜像,从而更好地分类和管理镜像。

3、项目级别角色

Harbor基于角色的访问控制,与project关联的角色简单地分为Guest/Developer/Admin三类,角色/project/镜像三者之间进行关联,不同角色的权限不同:

图片
角色权限说明
Guest对于指定项目拥有只读权限
Developer对于指定项目拥有读写权限
ProjectAdmin除了读写权限,同时拥有用户管理/镜像扫描等管理权限

4、Harbor 组件

图片

Proxy: Harbor 的 registry, UI, token 等服务,通过一个前置的反向代理统一接收浏览器、Docker 客户端的请求,并将请求转发给后端不同的服务。

Registry: 负责储存 Docker 镜像,并处理 docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对 Docker image 有不同的读写权限,Registry 会指向一个 token 服务,强制用户的每次 docker pull/push 请求都要携带一个合法的 token, Registry 会通过公钥对 token 进行解密验证。

Core services: 这是 Harbor 的核心功能,主要提供以下服务:

  • UI: 提供图形化界面,帮助用户管理 registry 上的镜像(image), 并对用户进行授权。
  • WebHook: 为了及时获取 registry 上 image 状态变化的情况, 在 Registry 上配置 webhook,把状态变化传递给 UI 模块。
  • Token: 负责根据用户权限给每个 docker push/pull 命令签发 token. Docker 客户端向 – Registry 服务发起的请求,如果不包含 token,会被重定向到这里,获得 token 后再重新向 Registry 进行请求。

Database: 为 core services 提供数据库服务,负责储存用户权限、审计日志、Docker image 分组信息等数据。

Job Services: 提供镜像远程复制功能,可以把本地镜像同步到其他 Harbor 实例中。

Log Collector: 为了帮助监控 Harbor 运行,负责收集其他组件的 log,供日后进行分析。

5、基本权限信息

Harbor的数据库的信息非常简单,从Access表中可以看到其将访问权限进行地划分

MariaDB [registry]> select * from access;
+-----------+-------------+-------------------------------+
| access_id | access_code | comment                       |
+-----------+-------------+-------------------------------+
|         1 | M           | Management access for project |
|         2 | R           | Read access for project       |
|         3 | W           | Write access for project     |
|         4 | D           | Delete access for project     |
|         5 | S           | Search access for project     |
+-----------+-------------+-------------------------------+
5 rows in set (0.00 sec)

MariaDB [registry]>

项目级别的角色目前的5种细粒度的访问权限分别为:M/R/W/D/S

访问权限说明
M管理操作的权限
R读操作的权限
W写操作的权限
D删除访问权限的权限
R查询权限

6、角色的访问权限

项目级别的三种角色,对于上述5种粒度的访问权限,具体的结合为

MariaDB [registry]> select * from role;
+---------+-----------+-----------+--------------+
| role_id | role_mask | role_code | name         |
+---------+-----------+-----------+--------------+
|       1 |         0 | MDRWS     | projectAdmin |
|       2 |         0 | RWS       | developer   |
|       3 |         0 | RS       | guest       |
+---------+-----------+-----------+--------------+
3 rows in set (0.00 sec)

MariaDB [registry]>

7、系统级别角色

除了以上也项目关联的角色,还有两种系统级别的角色,相关权限信息如下

角色权限说明
SysAdmin具有最多的权限,除了以上提及的权限,可以跨项目操作,查询所有项目,设定某个用户作为管理员以及扫描策略等
Anonymous没有登录的用户被视作匿名用户。匿名用户对private的项目不具访问权限,对public的项目具有只读权限

从数据库中也可以看到,这两种基本的用户在创建之初就被自动创建出来了

MariaDB [registry]> select user_id, username from user;
+---------+-----------+
| user_id | username |
+---------+-----------+
|       1 | admin     |
|       2 | anonymous |
+---------+-----------+
2 rows in set (0.00 sec)

MariaDB [registry]>

8、Harbor 安装

进入GitHub官网进行下载,地址:https://github.com/goharbor/harbor/releases

图片

下载成功后并上传至服务器

注:由于网络问题下载不了最新版本只能通过网上其他人共享的进行下载所以这里下载的是1.8.0的

[root@localhost harbox]# ls
harbor-offline-installer-v1.8.0.tgz

解压

[root@localhost harbox]# tar -zxvf harbor-offline-installer-v1.8.0.tgz
#输出如下
harbor/harbor.v1.8.0.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/harbor.yml

修改配置文件

[root@localhost harbox]# vi harbor.yml

# Configuration file of Harbor

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
# 修改为域名或你服务器 IP
hostname: 192.168.0.203  

# http related config
http:
 # port for http, default is 80. If https enabled, this port will redirect to https port
port: 80

执行安装脚本

[root@localhost harbox]# ./install.sh 
[Step 0]: checking installation environment ...

Note: docker version: 19.03.5

Note: docker-compose version: 1.23.2


✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://192.168.0.203. 
For more details, please visit https://github.com/goharbor/harbor .

9、验证是否安装成功

访问地址:http://192.168.0.203

图片

登录

输入账号: admin,密码: Harbor12345

图片

10、Harbor 启动和停止

Harbor 的日常运维管理是通过 docker-compose 来完成的,Harbor 本身有多个服务进程,都放在 docker 容器之中运行,我们可以通过 docker ps 命令查看

[root@localhost harbor]# docker ps | grep goharbor
9b29454470f3       goharbor/nginx-photon:v1.8.0                        "nginx -g 'daemon of…"   6minutes ago       Up 6 minutes (healthy)   0.0.0.0:80->80/tcp         nginx
25c5449344ec       goharbor/harbor-portal:v1.8.0                       "nginx -g 'daemon of…"   6minutes ago       Up 6 minutes (healthy)   80/tcp                     harbor-portal
6d178012bc43       goharbor/harbor-jobservice:v1.8.0                   "/harbor/start.sh"       6minutes ago       Up 6 minutes                                         harbor-jobservice
d447bfae1c8c       goharbor/harbor-core:v1.8.0                         "/harbor/start.sh"       6minutes ago       Up 6 minutes (healthy)                               harbor-core
2e5ab9de4c2b       goharbor/harbor-registryctl:v1.8.0                  "/harbor/start.sh"       6minutes ago       Up 6 minutes (healthy)                               registryctl
8583468d39c4       goharbor/harbor-db:v1.8.0                           "/entrypoint.sh post…"   6minutes ago       Up 6 minutes (healthy)   5432/tcp                   harbor-db
226a6d4e121a       goharbor/redis-photon:v1.8.0                        "docker-entrypoint.s…"   6minutes ago       Up 6 minutes             6379/tcp                   redis
5087f3325973       goharbor/registry-photon:v2.7.1-patch-2819-v1.8.0   "/entrypoint.sh /etc…"   6 minutes ago       Up 6 minutes (healthy)   5000/tcp                   registry
5736ccdf2a9f       goharbor/harbor-log:v1.8.0                          "/bin/sh -c /usr/loc…"   6minutes ago       Up 6 minutes (healthy)   127.0.0.1:1514->10514/tcp   harbor-log
   
# 启动
[root@ks-harbor-104-228 harbor]# vim harbor-restart.sh
docker-compose down --remove-orphans && docker-compose up -d --scale registry=9 --scale core=5
[root@localhost harbor]# sh harbor-restart.sh

# 停止
[root@localhost harbor]# docker-compose stop
Stopping nginx             ... done
Stopping harbor-portal     ... done
Stopping harbor-jobservice ... done
Stopping harbor-core       ... done
Stopping registryctl       ... done
Stopping harbor-db         ... done
Stopping redis             ... done
Stopping registry         ... done
Stopping harbor-log       ... done

说明:

  • nginx: nginx 负责流量转发和安全验证,对外提供的流量都是从 nginx 中转,所以开放 https 的 443 端口,它将流量分发到后端的 ui 和正在 docker 镜像存储的 docker registry。
  • harbor-jobservice: harbor-jobservice 是 harbor 的 job 管理模块,job 在 harbor 里面主要是为了镜像仓库之前同步使用的。
  • harbor-ui: harbor-ui 是 web 管理页面,主要是前端的页面和后端 CURD 的接口。
  • registry: registry 就是 docker 原生的仓库,负责保存镜像。
  • harbor-adminserver: harbor-adminserver 是 harbor 系统管理接口,可以修改系统配置以及获取系统信息。
  • harbor-db: harbor-db 是 harbor 的数据库,这里保存了系统的 job 以及项目、人员权限管理。由于本 harbor 的认证也是通过数据,在生产环节大多对接到企业的 ldap 中。
  • harbor-log: harbor-log 是 harbor 的日志服务,统一管理 harbor 的日志。通过 inspect 可以看出容器统一将日志输出的 syslog。

<!–这几个容器通过 Docker link 的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露 proxy (即 Nginx)的服务端口。–>

11、配置客户端

/etc/docker/daemon.json 中增加如下内容(如果文件不存在请新建该文件)

[root@localhost harbor]# vim /etc/docker/daemon.json
{
 "registry-mirrors": [
   "https://registry.docker-cn.com"
],
 "insecure-registries": [
   "192.168.0.203"
]
}

注意: 该文件必须符合 JSON 规范,否则 Docker 将不能启动。

#重启服务
[root@localhost harbor]# systemctl daemon-reload
[root@localhost harbor]# systemctl restart docker

12、检查客户端配置是否生效

使用 docker info 命令手动检查,如果从配置中看到如下内容,说明配置成功

[root@localhost harbor]# docker info
Insecure Registries:
192.168.0.203
127.0.0.0/8

13、Harbor 上传镜像

新建项目

我们以推送 Nginx 为例,首先需要在 Harbor 上创建一个 公开/私有 的项目

图片
图片

推送镜像

图片
# 在项目中标记镜像
[root@localhost harbor]# docker tag nginx 192.168.141.150/myshop/nginx:latest
# 登录 Harbor
[root@localhost harbor]# docker login 192.168.141.150 -u admin -p Harbor12345
# 推送镜像到项目
[root@localhost harbor]# docker push 192.168.141.150/myshop/nginx:latest

查看镜像

图片
图片

14、Harbor 下载镜像

在其它机器下载镜像只需要配置好客户端即可

[root@node1 ~]# docker pull 192.168.141.150/myshop/nginx:latest

15、实战:Harbor镜像仓库远程同步

新建项目

图片
图片

测试上传镜像

[root@master harbor]# docker pull nginx
[root@master harbor]# docker tag nginx:latest 192.168.1.10/test/nginx:latest
[root@master harbor]# docker push 192.168.1.10/test/nginx:latest
The push refers to repository [192.168.1.10/test/nginx]
4eaf0ea085df: Pushed 
2c7498eef94a: Pushed 
7d2b207c2679: Pushed 
5c4e5adc71a8: Pushed 
87c8a1d8f54f: Pushed 
latest: digest: sha256:13e4551010728646aa7e1b1ac5313e04cf75d051fa441396832fcd6d600b5e71 size:1362

页面查看

图片

创建仓库

图片
图片

添加规则

图片
图片
图片

slave的harbor仓库成功复制

图片

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/307849.html

联系我们
联系我们
分享本页
返回顶部