harbor
Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution。作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。Harbor 支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor 也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
Installation & Configuration Guide
Harbor on Kubernetes with Harbor chart
Configuring Harbor with HTTPS Access
1. 特性
- 云原生仓库:支持容器镜像和 Helm charts
- 基于角色的访问控制:用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
- 基于策略的镜像复制:可以基于具有多个过滤器的策略在多个仓库实例之间复制(同步)镜像。如果遇到任何错误,Harbor 将自动重试进行复制。非常适合负载平衡,高可用性,多数据中心,混合和多云场景。
- 漏洞扫描:Harbor 定期扫描镜像并警告用户漏洞。
- 图形化用户界面:用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
- LDAP/AD 支持:Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
- 国际化:已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
- 镜像删除和垃圾收集:可以删除镜像,并可以回收它们的空间。
- RESTful API:适用于大多数管理操作的 RESTful API,易于与外部系统集成。
- 易于部署:提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
2. 安装步骤
cd /tmp
wget http://10.0.43.24:8066/harbor-offline-installer-v1.6.1.tgz
tar zxvf harbor-offline-installer-v1.6.1.tgz
cd harbor
# 修改配置
# 启动 harbor
sh /data/harbor/install.sh --with-clair --with-chartmuseum
docker-compose -f ./docker-compose.yml -f ./docker-compose.clair.yml -f ./docker-compose.chartmuseum.yml down -v
docker-compose -f ./docker-compose.yml -f ./docker-compose.clair.yml -f ./docker-compose.chartmuseum.yml up -d
docker-compose -f ./docker-compose.yml -f ./docker-compose.clair.yml -f ./docker-compose.chartmuseum.yml up -d registry-web
3. 权限管理
Harbor基于角色的访问控制,与 project 关联的角色简单地分为 Guest/Developer/Admin 三类,角色/project/镜像三者之间进行关联,不同角色的权限不同:
角色 | 权限说明 |
---|---|
Guest | 对于指定项目拥有只读权限 |
Developer | 对于指定项目拥有读写权限 |
ProjectAdmin | 除了读写权限,同时拥有用户管理/镜像扫描等管理权限 |
4. 镜像回收
风险比较高,必须先备份数据,防止出现意外情况。
而且需要将仓库设置为只读,或者临时下线。
cd /data/harbor
docker-compose stop
# The above option "--dry-run" will print the progress without removing any data
docker run -it --name gc --rm --volumes-from registry goharbor/registry:2.6.2-photon garbage-collect --dry-run /etc/registry/config.yml
docker run -it --name gc --rm --volumes-from registry goharbor/registry:2.6.2-photon garbage-collect /etc/registry/config.yml
docker-compose start
实测结论:
- 在界面软删除一个镜像,后端执行GC后,镜像空间可以回收,但是镜像的层并没有被删除,因此再次 push 会告知
Layer already exists
- 由此可见,不能随意地去删除一个镜像,除非确定这个镜像所有的层都不会再用了(一般不好确定,因此不是很占空间的镜像就别删了)
- 实际应用中,应该将最基础的镜像 push 到仓库中,永不删除,而代码构建的镜像都是基于基础镜像,在删除时只会删除代码构建的那一层,从而可以确保基础镜像层安全,同时要删除的也就是这些业务代码构建的镜像
- 尽量不要删除所有镜像,至少保留最新的一个版本
- 在删除镜像前要做好数据备份,镜像删除是一个容易出错的事情
- 可以考虑使用镜像同步产生新的镜像仓库,将基础镜像同步过去,然后彻底抛弃老仓库
- 可以考虑使用镜像同步做基础镜像备份
5. Harbor API
自己写脚本扩展功能时非常重要:
# 查看镜像是否在存在于 harbor 仓库
curl -u "scm:n7izpoc6N2" -X GET -H "Content-Type: application/json" "http://hub.wonhigh.cn/api/repositories/petrel%2Fpetrel-register-center/tags/1.0.0-SNAPSHOT"
6. 问题
Q:管理员登录后没有管理员的操作权限? A:清除浏览器缓存。
Q:仓库同步报错:hub.wonhigh.cn: no such host A:需要处理 docker-compose.yml 文件,增加对 jobservice 服务的 extra_hosts 参数。
Q:点击镜像删除后,大小变成0,怎么也删不掉 A:Strange behaviour when deleting an repo after GC
7. 升级指南
Harbor upgrade and database migration guide
8. 第三方开源工具
9. 参考资料
Harbor Registry Garbage Collect(垃圾回收)