目录
Harbor概述
Harbor的功能
harbor核心组件
harbor和registry区别
Harbor私有仓库的部署
Harbor.cfg 配置文件中参数详解
通过本机IP登录harbor
总结
Harbor 是一个开源注册表,它使用策略和基于角色的访问控制来保护工件,确保图像被扫描并且没有漏洞,并将图像标记为可信。Harbor 是一个 CNCF 毕业项目,它提供合规性、性能和互操作性,以帮助您跨云原生计算平台(如 Kubernetes 和 Docker)一致且安全地管理工件。
Harbor被部署为多个Docker容器,因此可以部署在任何支持Docker 的 Linux发行版,(registry为其核心组件),Harbor 比 registry相比好处是: harbor 支持多种功能、图形化界面管理、多用户权限、角色管理机制、安全机制服务端主机需要安装 Python、Docker和 Docker Compose。(web环境支持的是PY语言,故需要安装Python)
✦ 基于角色的访问控制(Role based access control):用户和存储库通过“项目”组织,用户可以对项目下的图像拥有不同的权限。
✦基于策略的图像复制(Policy based images replication):图像可以在多个注册表实例之间复制(同步),并在错误时自动重试。 非常适合负载均衡、高可用性、多数据中心、混合和多云场景。
✦漏洞扫描(Vulnerability Scanning):港口定期扫描图像,并警告用户漏洞。
✦LDAP/AD支持(LDAP/AD support):Harbor与企业现有LDAP/AD集成,实现用户认证和管理。
✦图像删除和垃圾回收(Image deletion & garbage collection):可以删除图像并回收其空间。
✦Notary:可以保证图像的真实性。
✦图形用户门户(Graphical user portal):用户可以轻松浏览,搜索库和管理项目。
✦审计(Auditing):跟踪存储库的所有操作。
✦RESTful API:大多数管理操作的RESTful API,易于与外部系统集成。
✦易于部署:提供在线和离线安装程序。
✦Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI, token等服务。
✦db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。
✦UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。
✦job sevice:job sevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。
✦Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。
✦Registry:镜像仓库,负责存储镜像文件。
✦Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry起的容器的私有仓库中。企业可以根据自己的需求,使用Dokcerfile生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率。
虽然说Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,肯定harbor功能更为强大一点。
1.提供分层传输机制,优化网络传输
Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
2.提供WEB界面,优化用户体验
只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。3.支持水平扩展集群
当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。4.良好的安全机制
企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。
5.Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。
ps:harbor和registry区别仅用于知识的积累。
环境配置
192.168.37.107 docker、docker-compose、harbor-offline-v1.1.2
server端安装docker-compose
[root@harbor ~]# curl -L "https://github.com/docker/compose/releases/download/1.21.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
给执行权限
[root@harbor /usr/local/bin]# chmod +x docker-compose
[root@harbor /usr/local/bin]# ls
docker-compose
在线安装harbor
[root@harbor ~]# wget https://github.com/vmware/harbor/releases/download/v1.2.2/harbor-online-installer-v1.2.2.tgz
解压到/usr/local
[root@harbor ~]# tar -zxf harbor-online-installer-v1.2.2.tgz -C /usr/local/
harbor目录下的文件
[root@harbor /usr/local]# cd harbor/
[root@harbor /usr/local/harbor]# ls
common docker-compose.notary.yml harbor_1_1_0_template install.sh NOTICE upgrade
docker-compose.clair.yml docker-compose.yml harbor.cfg LICENSE prepare
如果网络不稳定的话,可以离线下载
wget https://github.com/vmware/harbor/releases/download/v1.1.2/harbor-offline-installer-v1.2.2.tgz
tar xvf harbor-offline-installer-v1.2.2.tgz
配置harbor.cfg文件,第5行
[root@harbor /usr/local/harbor]# vim harbor.cfg
。。。。
5 hostname = 192.168.37.107
。。。。
有两类参数:所需参数和可选参数
1)所需参数这些参数需要在配置文件Harbor.cfg中设置。如果用户更新它们并运行install.sh脚本重新安装Harbor,参数将生效。具体参数如下:
hostname:用于访问用户界面和register服务。它应该是目标机器的IP地址或完全限定的域名(FQDN)
PS:不要使用localhost或127.0.0.1为主机名。
ui_url_protocol: (http 或 https,默认为http)用于访问ul和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为 https。(身份验证时会向Mysql数据库进行比对,然后授予令牌)
max_ job_workers: 镜像复制作业线程。
db_password: 用于db_auth的MySQL 数据库root 用户的密码。I
customize_crt:该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。当由外部来源提供密钥和根证书时,将此属性设置为 off。
ssl_cert: ssl证书的路径,仅当协议设置为https 时才应用。
ssl_cert_key: ssl密钥的路径,仅当协议设置为 https时才应用。
secretkey_path:用于在复制策略中加密或解密远程register 密码的密钥路径。
2)可选参数
这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor后在 web ul上进行更新。如果进入Harbor.cfg,只会在第一次启动 Harbor时生效,随后对这些参数的更新,Harbor.cfg将被忽略。PS:如果选择通过uI设置这些参数,请确保在启动Harbour后立即执行此操作。具体来说,必须在注册或在 Harbor中创建任何新用户之前设置所需的
auth_mode 当系统中有用户时(除了默认的 admin用户) ,auth_mode不能被修改。具体参数如下:
Email: Harbor需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才需要。
PS:在默认情况下SSL连接时没有启用。如果SMTP服务器需要SSL,但不支持STARTTLS,那么应该通过设置启用sSL email_ssl = TRUE。
harbour_admin_password:管理员的初始密码,只在Harbour第一次启动时生效。之后,此设置将被忽略,并且应U中设置管理员的密码。
PS:默认的用户名/密码是admin/Harbor12345。
auth_mode:使用的认证类型,默认情况下,它是 db_auth,即凭据存储在数据库中。对于LDAP身份验证(以文件形式验证),将其设置为 ldap_auth。
self_registration:启用/禁用用户注册功能。禁用时,新用户只能由 Admin用户创建,只有管理员用户可以在 Harbour中创建新用户。
PS:当auth_mode设置为 ldap_auth时,自注册功能将始终处于禁用状态,并且该标志被忽略。
Token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为30分钟。
project_creation_restriction:用于控制哪些用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目。如果将其值设置为“adminonly”,那么只有admin可以创建项目。
verify_remote_ceit:打开或关闭,默认打开。此标志决定了当Harbor与远程 register实例通信时是否验证SSL/TLS 证书。将此属性设置为 off 将绕过SSL/TLS验证,这在远程实例具有自签名或不可信证书时经常使用。
另外,默认情况下,Harbor将镜像存储在本地文件系统上。在生产环境中,可以考虑使用其他存储后端而不是本地文件系统,
如S3、Openstack Swif、Ceph 等。但需要更新common/templates/registry/config.yml文件。
启动harbor
[root@harbor /usr/local/harbor]# sh /usr/local/harbor/install.sh
查看harbor的镜像和容器
#####docker harbor启动镜像
[root@harbor /usr/local/harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vmware/registry 2.6.2-photon c38af846a0da 4 years ago 240MB
vmware/nginx-photon 1.11.13 2971c92cc1ae 4 years ago 200MB
vmware/harbor-log v1.2.2 36ef78ae27df 4 years ago 200MB
vmware/harbor-jobservice v1.2.2 e2af366cba44 4 years ago 164MB
vmware/harbor-ui v1.2.2 39efb472c253 4 years ago 178MB
vmware/harbor-adminserver v1.2.2 c75963ec543f 4 years ago 142MB
vmware/harbor-db v1.2.2 ee7b9fa37c5d 4 years ago 329MB
###harbor启动的容器
[root@harbor /usr/local/harbor]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3730588275b vmware/harbor-jobservice:v1.2.2 "/harbor/harbor_jobs…" 3 minutes ago Up 3 minutes harbor-jobservice
0fe2805ffc41 vmware/nginx-photon:1.11.13 "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:4443->4443/tcp, :::4443->4443/tcp nginx
82f3593341c3 vmware/harbor-ui:v1.2.2 "/harbor/harbor_ui" 3 minutes ago Up 3 minutes harbor-ui
c25fc7c74391 vmware/harbor-db:v1.2.2 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 3306/tcp harbor-db
596b37337b52 vmware/registry:2.6.2-photon "/entrypoint.sh serv…" 3 minutes ago Up 3 minutes (healthy) 5000/tcp registry
afc4ff9606f0 vmware/harbor-adminserver:v1.2.2 "/harbor/harbor_admi…" 3 minutes ago Up 3 minutes harbor-adminserver
8f7337ecacb3 vmware/harbor-log:v1.2.2 "/bin/sh -c 'crond &…" 3 minutes ago Up 3 minutes 127.0.0.1:1514->514/tcp harbor-log
访问harbor
真机访问192.168.37.107
账号:admin
密码:Harbor12345
创建一个项目
默认情况下, Register服务器在端口 80 上侦听
[root@harbor /usr/local/harbor]# ss -natp |grep 80
LISTEN 0 128 *:80 *:* users:(("docker-proxy",pid=44451,fd=4))
LISTEN 0 128 :::80 :::* users:(("docker-proxy",pid=44458,fd=4))
此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像
[root@harbor /usr/local/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 ###登录成功了
现在我们来测试一下,创建一个镜像上传到harbor(测试的话使用cirros镜像,体积小)
###拉取镜像
[root@harbor /usr/local/harbor]# docker pull cirros
Using default tag: latest
latest: Pulling from library/cirros
d0b405be7a32: Pull complete
bd054094a037: Pull complete
c6a00de1ec8a: Pull complete
Digest: sha256:1e695eb2772a2b511ccab70091962d1efb9501fdca804eb1d52d21c0933e7f47
Status: Downloaded newer image for cirros:latest
docker.io/library/cirros:latest
###镜像打标签
[root@harbor /usr/local/harbor]# docker tag cirros:latest 127.0.0.1/xiaobin/cirros:v2
##上传镜像
[root@harbor /usr/local/harbor]# docker push 127.0.0.1/xiaobin/cirros:v2
The push refers to repository [127.0.0.1/xiaobin/cirros]
984ad441ec3d: Pushed
f0a496d92efa: Pushed
e52d19c3bee2: Pushed
v2: digest: sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22 size: 943
此时回到harbor页面,创建的晓彬项目下有了我们上传的镜像了。
以上操作都是在harbor服务器本地操作,如果其他客户端想上传镜像到harbor,需要连接至harbor服务器! 因为,Docker Registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交互时可能会出现错误
[root@harbor /usr/local/harbor]# docker login 192.168.37.107
Username: admin
Password:
Error response from daemon: Get "https://192.168.37.107/v2/": dial tcp 192.168.37.107:443: connect: connection refused
解决方法① 修改配置文件
[root@harbor /usr/lib/systemd/system]# vim docker.service
.。。
13 ExecStart=/usr/bin/dockerd -H fd:// -insecure-registry 192.168.37.107 --containerd=/run/containerd/containerd.sock
。。。
重启docker
[root@harbor /usr/lib/systemd/system]# systemctl daemon-reload
[root@harbor /usr/lib/systemd/system]# systemctl restart docker
先登出
[root@harbor /usr/lib/systemd/system]# docker logout
Removing login credentials for https://index.docker.io/v1/
再用本机ip地址登录,可以使用docker-compose重启容器
[root@harbor /usr/local/harbor]# docker-compose down -v
Stopping registry ... done
Stopping harbor-log ... done
Removing nginx ... done
Removing harbor-jobservice ... done
Removing harbor-ui ... done
Removing harbor-db ... done
Removing harbor-adminserver ... done
Removing registry ... done
Removing harbor-log ... done
Removing network harbor_harbor
[root@harbor /usr/local/harbor]# docker-compose up -d
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registry ... done
Creating harbor-adminserver ... done
Creating harbor-db ... done
Creating harbor-ui ... done
Creating harbor-jobservice ... done
Creating nginx ... done
[root@harbor /usr/local/harbor]# docker login -u admin -p Harbor12345 http://192.168.37.107
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
重新打上tag
[root@harbor /usr/local/harbor]# docker tag cirros:latest 192.168.37.107/xiaobin/cirros:v5
[root@harbor /usr/local/harbor]# docker push 192.168.37.107/xiaobin/cirros:v5
The push refers to repository [192.168.37.107/xiaobin/cirros]
984ad441ec3d: Layer already exists
f0a496d92efa: Layer already exists
e52d19c3bee2: Layer already exists
v5: digest: sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22 size: 943
刷新harbor网页查看
解决本机ip地址不能上传harbor的一个问题就解决啦
还有一种方法就是直接添加IP地址也可以
[root@localhost /etc/docker]# vim daemon.json
{
"insecure-registries":["http://192.168.37.107"],
"registry-mirrors": ["https://mf7z1s6m.mirror.aliyuncs.com"]
}
VMware开源的企业级Registry项目Harbor,以Docker公司开源的registry 为基础,提供了管理UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文,主要特点有:基于角色的访问控制、 镜像复制、图形化用户界面 、AD/LDAP 支持 、审计管理、国际化、RESTful API 、部署简单