什么是Harbor?
Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它通过策略和基于角色的访问控制来保护工件,确保图像被扫描并且没有漏洞,并将图像签名为受信任的。 Harbor 是 CNCF 毕业的项目,可提供合规性、性能和互操作性,帮助你跨云原生计算平台(如 Kubernetes 和 Docker)一致且安全地管理平台。
虽然Docker官方提供了公共的镜像仓库,但是Harbor拥有更丰富的权限权利和完善的架构设计,从安全和效率等多方面考虑,部署本地的私有镜像仓库是有必要的。
安装Harbor
在安装之前,我们需要确保机器满足以下几点
1、Harbor是部署在Docker容器上的,所以我们可以将Harbor部署在任何支持Docker的Linux版本上。
2、硬件需求:
资源 | 最小 | 建议 |
---|---|---|
CPU | 2 核 | 4 核 |
内存 | 4 GB | 8 GB |
磁盘空间 | 40 GB | 160 GB |
3、软件需求:Docker engine 版本大于等于 17.06.0-ce+ ,Docker Compose版本大于等于1.18.0 ,Openssl最新的优先
4、网络端口:Harbor 要求在目标主机上打开以下端口。4443、443、80
正式部署
安装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代理,例如http://my.proxy.com:3128?
https_proxy
:配置HTTPS代理,例如http://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
(启用该功能)port
、path
[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
查看下载的镜像和运行的容器
关闭 Harbor
docker-compose up -d
#如需重新部署,需要移除 Harbor 服务容器全部数据,持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的
重新启动Harbor
docker-compose up -d
Harbor图形化管理界面
进入管理界面
打开浏览器,输入http://ip:port
(如果没有改动密码配置的话,初始密码为Harbor12345)
创建项目
推送镜像
#首先登陆本地镜像仓库
[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
查看是否推送成功
其它机器登陆
我们可以尝试使用其他的机器登录
[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