Harbor github项目地址:https://github.com/goharbor/harbor
Harbor是一个开源的可信云本机注册表项目,用于存储,签名和扫描内容。Harbor通过添加用户通常需要的功能(如安全性,身份和管理)来扩展开源Docker Distribution。使注册表更接近构建和运行环境可以提高图像传输效率。Harbor支持在注册表之间复制映像,还提供用户管理,访问控制和活动审计等高级安全功能。
云本机注册表:Harbor 支持容器映像和Helm图表,可用作云本机环境(如容器运行时和业务流程平台)的注册表。
基于角色的访问控制:用户和存储库通过“项目”进行组织,用户可以对项目下的图像拥有不同的权限。
基于策略的映像复制:可以基于具有多个过滤器(存储库,标记和标签)的策略在多个注册表实例之间复制(同步)映像。如果遇到任何错误,Harbor将自动重试进行复制。非常适合负载平衡,高可用性,多数据中心,混合和多云场景。
漏洞扫描:Harbor定期扫描图像并警告用户漏洞。
LDAP / AD支持:Harbor与现有企业LDAP / AD集成以进行用户身份验证和管理,并支持将LDAP组导入Harbor并为其分配适当的项目角色。
图像删除和垃圾收集:可以删除图像,并可以回收它们的空间。
公证:可以确保图像的真实性。
图形用户门户:用户可以轻松浏览,搜索存储库和管理项目。
审计:跟踪存储库的所有操作。
RESTful API:适用于大多数管理操作的RESTful API,易于与外部系统集成。
易于部署:提供在线和离线安装程序。
① 配置参数位于文件harbor.yml
中;
② 在harbor.yml
中有两类参数,必需参数和可选参数。
harbor.yml
并运行install.sh脚本以重新安装Harbor,harbor.yml
将会生效;harbor.yml
,则这些参数只会在首次启动Harbor时生效。harbor.yml
将忽略对这些参数的后续更新。③ 注意:如果您选择通过Portal设置这些参数,请务必在Harbor启动后立即执行此操作。特别是必须在Harbor中注册或创建任何新用户之前设置所需的auth_mode,当系统中有用户时(除默认管理员用户外),无法更改auth_mode;
④ 请注意至少需要更改hostname
属性(指定harbor仓库域名)。
hostname:目标主机的主机名,用于访问Portal和注册表服务。它应该是目标计算机的IP地址或完全限定的域名(FQDN),例如,192.168.1.10或reg.yourdomain.com。不要使用localhost或127.0.0.1作为主机名 - 外部客户端需要访问注册表服务
ui_url_protocol:http或https,默认为http,用于指定访问Portal和令牌/通知服务的协议。如果启用了公证,则此参数必须为https。默认情况下,这是http。要设置https协议,请参阅使用HTTPS访问配置Harbor。
db_password:用于db_auth的PostgreSQL数据库的root密码。更改此密码以用于任何生产用途
max_job_workers :(默认值为10)作业服务中的最大复制工作者数。对于每个映像复制作业,工作程序将存储库的所有标记同步到远程目标。增加此数量可以在系统中实现更多并发复制作业。但是,由于每个工作者都消耗一定量的网络/ CPU / IO资源,请根据主机的硬件资源仔细选择该属性的值。
customize_crt:(on or off. Default is on),如果此属性on,在准备脚本创建注册表的令牌生成/验证私钥和根证书。当外部源提供密钥和根证书时,将此属性设置为off。有关详细信息,请参阅自定义密钥和港口令牌服务证书。
ssl_cert:SSL证书的路径,仅在协议设置为https时应用。
ssl_cert_key:SSL密钥的路径,仅在协议设置为https时应用。
secretkey_path:用于加密或解密复制策略中远程注册表密码的密钥路径。
log_rotate_count:设置日志文件在被删除之前会被轮换次数。如果count为0,则删除旧版本而不是旋转。
log_rotate_size:仅当日志文件大于log_rotate_size字节时才会轮换日志文件。如果大小后跟k,则假定大小以千字节为单位。如果使用M,则大小以兆字节为单位,如果使用G,则大小为千兆字节。尺寸100,尺寸100k,尺寸100M和尺寸100G都是有效的。
http_proxy:为Clair配置http代理,例如http://my.proxy.com:3128。
https_proxy:为Clair配置https代理,例如http://my.proxy.com:3128。
no_proxy:为Clair配置无代理,例如127.0.0.1,localhost,core,registry。
电子邮件设置:Harbor需要这些参数才能向用户发送“密码重置”电子邮件,并且仅在需要该功能时才需要。另外,请注意,在默认情况下SSL连接时没有启用-如果你的SMTP服务器需要SSL,但不支持STARTTLS,那么你应该通过设置启用SSL email_ssl = TRUE。如果电子邮件服务器使用自签名证书或不受信任证书,则设置
email_insecure = true
email_server = smtp.mydomain.com
email_server_port = 25
email_identity =
email_username = [email protected]
email_password = abc
email_from = admin [email protected]
email_ssl = false
email_insecure = false
harbor_admin_password:管理员的初始密码。此密码仅在Harbor首次启动时生效。之后,将忽略此设置,并且应在Portal中设置管理员密码。请注意,默认用户名/密码为admin / Harbor12345
auth_mode:使用的身份验证类型。默认情况下,它是db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为ldap_auth。重要信息:从现有Harbor实例升级时,必须确保在启动新版本的Harbor之前auth_mode相同harbor.yml。否则,用户可能无法在升级后登录。
ldap_url:LDAP端点URL(例如ldaps://ldap.mydomain.com)。 仅在auth_mode设置为
ldap_auth时使用。
ldap_searchdn:具有搜索LDAP / AD服务器权限的用户的DN(例如
uid=admin,ou=people,dc=mydomain,dc=com)。
ldap_search_pwd:ldap_searchdn指定的用户密码。
ldap_basedn:查找用户的基本DN,例如ou=people,dc=mydomain,dc=com,仅在auth_mode
设置为ldap_auth时使用。
ldap_filter:用于查找用户的搜索过滤器,例如(objectClass=person)。
ldap_uid:用于在LDAP搜索期间匹配用户的属性,它可以是uid,cn,email或其他属性。
ldap_scope:搜索用户的范围,0-LDAP_SCOPE_BASE,1-LDAP_SCOPE_ONELEVEL,2-
LDAP_SCOPE_SUBTREE。默认值为2。
ldap_timeout:连接LDAP服务器时超时(以秒为单位)。默认值为5。
ldap_verify_cert:验证来自LDAP服务器的证书。默认为true。
ldap_group_basedn:在LDAP / AD中查找组的基本dn,例如
ou=group,dc=mydomain,dc=com。
ldap_group_filter:搜索LDAP / AD组的过滤器,例如objectclass=group。
ldap_group_gid:用于命名LDAP / AD组的属性,它可以是cn,name。
ldap_group_scope:搜索ldap组的范围。0-LDAP_SCOPE_BASE,1-LDAP_SCOPE_ONELEVEL,2-
LDAP_SCOPE_SUBTREE。默认值为2。
self_registration:启用/禁用用户注册他/她自己的能力,默认启用。禁用时,新用户只能由管理员用户创建,只有管理员用户可以在Harbor中创建新用户。 注意:当auth_mode设置为ldap_auth时,始终禁用自注册功能,并忽略此标志。
token_expiration:令牌服务创建的令牌的到期时间(以分钟为单位),默认为30分钟。
project_creation_restriction:用于控制用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目,设置为“adminonly”,这样只有管理员才能创建项目。
默认情况下,Harbor将图像存储在本地文件系统中。在生产环境中,您可以考虑使用其他存储后端,而不是本地文件系统,如S3,OpenStack Swift,Ceph等。这些参数是注册表的配置。
registry_storage_provider_name:注册表的存储提供程序名称,可以是filesystem,s3,gcs,azure等。默认为filesystem。
registry_storage_provider_config:存储提供程序配置的逗号分隔“key:value”对,例如“key1:value,key2:value2”。默认为空字符串。
registry_custom_ca_bundle:自定义根ca证书的路径,它将注入到注册表和图表存储库容器的信任库中。当用户使用自签名证书托管内部存储时,通常需要这样做。
例如,如果使用Openstack Swift作为存储后端,则参数可能如下所示:
registry_storage_provider_name = swift
registry_storage_provider_config = “ username:admin,password:ADMIN_PASS,
authurl:http:// keystone_addr:35357 / v3 / aut
注意:有关注册表存储后端的详细信息,请参阅“注册表配置参考”
注册表配置参考链接:https://docs.docker.com/registry/configuration/
[root@johnnyg03 ~]# yum install https://rpmfind.net/linux/epel/7/x86_64/Packages/d/docker-compose-1.18.0-4.el7.noarch.rpm -y
[root@johnnyg03 ~]# docker-compose version
docker-compose version 1.18.0, build 8dd22a9
docker-py version: 2.6.1
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.0.2k-fips 26 Jan 2017
[root@johnnyg03 ~]# wget -c https://github.com/goharbor/harbor/releases/download/v2.4.1/harbor-offline-installer-v2.4.1.tgz
[root@johnnyg03 ~]# ll harbor-offline-installer-v2.4.1.tgz
-rw-rw-rw- 1 root root 612698835 Aug 5 20:06 harbor-offline-installer-v2.4.1.tgz
//解压至/usr/local
[root@johnnyg03 ~]# tar xf harbor-offline-installer-v2.4.1.tgz -C /usr/local/
[root@johnnyg03 ~]# cd /usr/local/harbor/
[root@johnnyg03 harbor]# ll
total 601612
-rw-r--r-- 1 root root 3361 Dec 16 2021 common.sh
-rw-r--r-- 1 root root 616006217 Dec 16 2021 harbor.v2.4.1.tar.gz
-rw-r--r-- 1 root root 8999 Dec 16 2021 harbor.yml.tmpl
-rwxr-xr-x 1 root root 2500 Dec 16 2021 install.sh
-rw-r--r-- 1 root root 11347 Dec 16 2021 LICENSE
-rwxr-xr-x 1 root root 1881 Dec 16 2021 prepare
[root@johnnyg03 harbor]# cp harbor.yml.tmpl harbor.yml
[root@johnnyg03 harbor]# vim harbor.yml
hostname: johnnyg.openlab.com
//下方此部分如果不进行加密直接注释,否则报错
#https:
# # https port for harbor, default is 443
# port: 443
# # The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
[root@johnnyg03 harbor]# vim /etc/hosts
http://1.13.249.218/ johnnyg.openlab.com
//安装部署启动Harbor
[root@johnnyg03 harbor]# ./install.sh
//可以看到Harbor自动开启很多容器服务
[root@johnnyg03 harbor]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
353ed74e8e2c goharbor/harbor-jobservice:v2.4.1 "/harbor/entrypoint.…" 7 minutes ago Up 7 minutes (healthy) harbor-jobservice
ec2bb70608b7 goharbor/nginx-photon:v2.4.1 "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes (healthy) 0.0.0.0:80->8080/tcp, :::80->8080/tcp nginx
9abb3e3d5be1 goharbor/harbor-core:v2.4.1 "/harbor/entrypoint.…" 7 minutes ago Up 7 minutes (healthy) harbor-core
cb8d47180da9 goharbor/registry-photon:v2.4.1 "/home/harbor/entryp…" 7 minutes ago Up 7 minutes (healthy) registry
5dd93394f575 goharbor/harbor-portal:v2.4.1 "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes (healthy) harbor-portal
e24e310d7fc8 goharbor/redis-photon:v2.4.1 "redis-server /etc/r…" 7 minutes ago Up 7 minutes (healthy) redis
c036675029b0 goharbor/harbor-db:v2.4.1 "/docker-entrypoint.…" 7 minutes ago Up 7 minutes (healthy) harbor-db
04a7e8bc22de goharbor/harbor-registryctl:v2.4.1 "/home/harbor/start.…" 7 minutes ago Up 7 minutes (healthy) registryctl
ab95148a1d28 goharbor/harbor-log:v2.4.1 "/bin/sh -c /usr/loc…" 7 minutes ago Up 7 minutes (healthy) 127.0.0.1:1514->10514/tcp harbor-log
【注:此处访问级别默认为私有(不勾选公开)表示上传下载镜像均需要进行登录认证,如果勾选公开表示为公有,上传下载镜像无需登录认证】
//修改docker的daemon.json守护进程文件
[root@johnnyg03 harbor]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.2.12:5000"],
"insecure-registries": ["johnnyg.openlab.com"] //添加此行为harbor仓库域名(允许使用http访问)
}
[root@johnnyg03 harbor]# systemctl restart docker
//重启docker之后,所有容器自动关闭,需要重启
[root@johnnyg03 harbor]# docker start `docker ps -aq`
//为需要上传仓库的镜像打标签(标签名:仓库地址/镜像名:版本)
[root@johnnyg03 harbor]# docker tag busybox:latest johnnyg.openlab.com/demo/busybox:latest
[root@johnnyg03 harbor]# docker tag nginx:latest johnnyg.openlab.com/demo/nginx:latest
[root@johnnyg03 harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
johnnyg.openlab.com/demo/busybox latest beae173ccac6 7 months ago 1.24MB
johnnyg.openlab.com/demo/nginx latest 605c77e624dd 7 months ago 141MB
//由于在创建仓库项目时选择了私有仓库,因此需要进行认证
//登录所使用的账号可以是仓库默认管理员admin & 自创账户
//此处使用默认管理员admin登录
[root@johnnyg03 harbor]# docker login johnnyg.openlab.com
Username: admin
Password:
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仓库
[root@johnnyg03 harbor]# docker push johnnyg.openlab.com/demo/busybox:latest
The push refers to repository [johnnyg.openlab.com/demo/busybox]
01fd6df81c8e: Pushed
latest: digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee size: 527
//测试使用自创账户tom登录
[root@johnnyg03 harbor]# docker login johnnyg.openlab.com
Username: tom
Password:
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
//可见登录成功
//使用自创账户tom上传镜像至harbor仓库
[root@johnnyg03 harbor]# docker push johnnyg.openlab.com/demo/nginx:latest
The push refers to repository [johnnyg.openlab.com/demo/nginx]
d874fd2bc83b: Layer already exists
32ce5f6a5106: Layer already exists
f1db227348d0: Layer already exists
b8d6e692a25e: Layer already exists
e379e8aedd4d: Layer already exists
2edcec3590a4: Layer already exists
latest: digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 size: 1570
//可见上传成功