Harbor

611 阅读8分钟

1、什么是Harbor?

Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它通过策略和基于角色的访问控制来保护工件,确保图像被扫描并且没有漏洞,并将图像签名为受信任的。 Harbor 是 CNCF 毕业的项目,可提供合规性、性能和互操作性,帮助你跨云原生计算平台(如 Kubernetes 和 Docker)一致且安全地管理平台。

虽然Docker官方提供了公共的镜像仓库,但是Harbor拥有更丰富的权限权利和完善的架构设计,从安全和效率等多方面考虑,部署本地的私有镜像仓库是有必要的。

2、安装Harbor

1、在安装之前,我们需要确保机器满足以下几点

1、Harbor是部署在Docker容器上的,所以我们可以将Harbor部署在任何支持Docker的Linux版本上。

2、硬件需求:

资源最小建议
CPU2 核4 核
内存4 GB8 GB
磁盘空间40 GB160 GB

3、软件需求:Docker engine 版本大于等于 17.06.0-ce+ ,Docker Compose版本大于等于1.18.0 ,Openssl最新的优先

4、网络端口:Harbor 要求在目标主机上打开以下端口:4443、443、80。

2、正式部署

安装docker

 # 安装依赖包
 yum install -y yum-utils device-mapper-persistent-data lvm2
 ​
 # 安装阿里云镜像源
 wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 ​
 # 重新加载yum缓存
 yum clean all
 yum makecache
 ​
 # 安装docker-ce
 yum install docker-ce -y

下载docker-compose和Harbor

 # 安装docker-compose
 wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
 mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
 chmod 755 /usr/bin/docker-compose
 # 查看版本
 docker-compose  --version
 docker-compose version 1.29.2, build 5becea4c
 ​
 # 下载Harbor
 wget https://github.com/goharbor/harbor/releases/download/v2.3.1/harbor-offline-installer-v2.3.1.tgz
 tar -zxvf harbor-offline-installer-v2.3.1.tgz

配置文件Harbor YML File

hostname:指定要部署的Harbor的主机IP或域名,这是访问Horbor Portal和注册服务的地址。例如:192.168.31.100或者reg.domain.com,注册的服务可以从外部访问,因此不要使用127.0.0.1、0.0.0.0这种ip指定为hostname

Http、Https:不要再生产环境中使用Http,仅在没有连接在外部的机器上使用

子参数:

port:http 80(默认)、https 443(默认)端口号

certificate:SSL证书路径

private_key:SSL key路径

internal_tls:内部环境是否使用tsl进行交流

子参数:

enabled:true or false

dir:证书和密钥文件路径

harbor_admin_password:为 Harbor 系统管理员设置初始密码。 该密码仅在Harbor 首次启动时使用。 在后续登录时,将忽略此设置,并在 Harbor Portal 中设置管理员密码。 默认用户名和密码为 admin 和 Harbor12345

database:使用本地数据库或者外部数据库

子参数:

password:数据库密码

max_idle_conns:空闲连接池的最大连接数,默认为50,不配置为2

max_open_conns:到数据库的最大打开连接数, Harbor 数据库的最大连接数,默认值为 100,不配置,则值为 0

data_volume:主机上存储 Harbor 数据的位置。 即使删除或重新创建 Harbor 的容器,该数据也保持不变。 可以选择配置外部存储,在这种情况下禁用此选项并启用 storage_service。 默认为 /data

trivy:是一种适用于 CI 的简单而全面的容器漏洞扫描程序。软件漏洞是指软件或操作系统中存在的故障、缺陷或弱点。Trivy 检测操作系统包(Alpine、RHEL、CentOS等)和应用程序依赖(Bundler、Composer、npm、yarn等)的漏洞

子参数:

ignore_unfixed:true仅显示修复的漏洞,默认为false

skip_update:您可能希望在测试或 CI/CD 环境中启用此标志以避免 GitHub 速率限制问题。 如果启用了该标志,您必须手动下载 trivy-offline.tar.gz 存档,提取 trivy.db 和 metadata.json 文件并将它们安装在 /home/scanner/.cache/trivy/db/trivy 中。 容器中的数据库路径。 默认值为 false

insecure:将该标志设置为 true 以跳过验证注册证书。 默认值为 false

github_token:设置令牌下载Trivy DB GitHub的访问。Trivy DB由Trivy从GitHub的发布页面下载。 来自 GitHub 的匿名下载受到每小时 60 个请求的限制

jobservice:工作服务。子参数:max_job_workers:对于每个镜像复制作业,工作人员将存储库的所有标签同步到远程目标。 增加这个数字允许系统中更多的并发复制作业。 但是由于每个worker都会消耗一定的网络/CPU/IO资源,所以根据主机的硬件资源来设置这个属性的值。 默认值为 10

notification:子参数:webhook_job_max_retry :设置 web hook 作业的最大重试次数。 默认值为 10。

chart:子参数:absolute_url:设置图表以使用绝对 URL

log:配置日志记录。 Harbor 使用 rsyslog 来收集每个容器的日志

子参数:

level:设置日志等级,debug、info、warning、error、fatal,默认为info

local:设置日志保留参数

external_endpoint:启用此选项可将日志转发到系统日志服务器

proxy

子参数:

http_proxy:配置HTTP代理,例如my.proxy.com:3128

https_proxy:配置HTTPS代理,例如my.proxy.com:3128

no_proxy:配置何时不使用代理,例如 127.0.0.1、localhost、registry

external_url:启用此选项以使用外部代理。 启用后,不再使用主机名,对应着nginx所设置的代理后访问地址

storage_service:默认情况下,Harbor 将图像和图表存储在您的本地文件系统上。 在生产环境中,可能使用另一个存储后端而不是本地文件系统。 下面列出的参数是注册表的配置。

子参数:

ca_bundle:自定义根 CA 证书的路径,该证书被注入到注册表和图表存储库容器的信任库中。 如果内部存储使用自签名证书,则需要这样做。

filesystem:默认为文件系统,但您可以设置 azure、gcs、s3、swift 和 oss。 有关如何配置其他后端的信息,请参阅下面的配置存储后端。 设置 maxthreads 以限制外部提供程序的线程数。 默认值为 100。

redirect:禁用注册表重定向时,将 disable 设置为 true

external_database:如果禁用本地数据库选项,则配置外部数据库设置。 目前,Harbor 仅支持 PostgreSQL 数据库。 需要为 Harbor 核心、Notary 服务器和 Notary 签名者创建三个数据库。 这些表是在 Harbor 启动时自动生成的。

子参数:harbor(host、port、db_name....)、notary_signer(host、port、db_name....)、notary_server(host、port、db_name....)

external_redis:配置外部redis实例

子参数:host、passwort、sentinel_master_set、registry_db_index

metric:配置将 Harbor 实例指标暴露给指定的端口和路径

子参数:enabled(启用该功能)portpath

 [root@test-194 harbor]# cp harbor.yml.tmpl harbor.yml
 ​
 #默认情况只需要修改hostname就可以运行了,如果不使用Https,需要将配置文件中的相关配置注释掉
 ​
 #运行Harobr
 [root@test-194 ~]# cd /home/harbor/ && ./install.sh

安装过程

0、检查Docker是否安装

1、检查docker-compose是否安装

2、安装Harbor镜像

3、准备环境

4、准备Harbor配置文件

5、启动Harbor

image-20210812151242224

查看下载的镜像和运行的容器

image-20210816101744538

关闭 Harbor

 docker-compose up -d
 #如需重新部署,需要移除 Harbor 服务容器全部数据,持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的

image-20210812152311756

重新启动Harbor

 docker-compose up -d

image-20210812152411190

3、Harbor图形化管理界面

1、进入管理界面

打开浏览器,输入http://ip:port (如果没有改动密码配置的话,初始密码为Harbor12345)

image-20210816095736031

2、创建项目

image-20210816100427102

image-20210816100506837

3、推送镜像

 #首先登陆本地镜像仓库
 [root@test-194 harbor]# docker login -u admin -p Harbor12345 http://127.0.0.1
 WARNING! Using --password via the CLI is insecure. Use --password-stdin.
 WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
 Configure a credential helper to remove this warning. See
 https://docs.docker.com/engine/reference/commandline/login/#credentials-store
 
 Login Succeeded
 
 #更改本地已有镜像的名称
 [root@test-194 harbor]# docker tag nginx:latest 127.0.0.1/test/nginx:v1
 
 #将镜像push到已经创建好的项目中
 [root@test-194 harbor]# docker push 127.0.0.1/test/nginx:v1
 The push refers to repository [127.0.0.1/test/nginx]
 e3135447ca3e: Pushed
 b85734705991: Pushed
 988d9a3509bb: Pushed
 59b01b87c9e7: Pushed
 7c0b223167b9: Pushed
 814bff734324: Pushed
 v1: digest: sha256:3f13b4376446cf92b0cb9a5c46ba75d57c41f627c4edb8b635fa47386ea29e20 size: 1570

查看是否推送成功

image-20210816102135076

4、其它机器登陆

我们可以尝试使用其他的机器登录

 [root@test-213 ~]# docker login -u admin -p Harbor12345 http://10.224.192.194
 WARNING! Using --password via the CLI is insecure. Use --password-stdin.
 Error response from daemon: Get "https://10.224.192.194/v2/": dial tcp 10.224.192.194:443: connect: connection refused

我们可以看到登录失败了,因为Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以上错误。

 [root@test-213 ~]# vim /usr/lib/systemd/system/docker.service
 #在ExecStart后面添加参数 --insecure-registry=10.224.192.194
 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=10.224.192.194
 ​
 [root@test-213 ~]# systemctl daemon-reload
 [root@test-213 ~]# systemctl restart docker

再次登录

 [root@test-213 ~]# docker login -u admin -p Harbor12345 http://10.224.192.194
 WARNING! Using --password via the CLI is insecure. Use --password-stdin.
 WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
 Configure a credential helper to remove this warning. See
 https://docs.docker.com/engine/reference/commandline/login/#credentials-store
 ​
 Login Succeeded