Harbor 是存储和分发 Docker 镜像的企业级 Registry 服务器,也支持 Helm 仓库,由 VMware 开源

d2b933ca04b36decdfb76fe79864f1b3.png

一、介绍

  • 基于角色的访问控制

用户与 Docker 镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。

  • 基于镜像的复制策略

镜像可以在多个 Registry 实例中复制(可以将仓库中的镜像同步到远程的 Harbor,类似于 MySQL 主从同步功能),尤其适合于负载均衡,高可用,混合云和多云的场景。

  • 图形化用户界面

用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管理项目和命名空间。

  • 支持 AD/LDAP

Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。

  • 镜像删除和垃圾回收

Harbor 支持在 Web 删除镜像,回收无用的镜像,释放磁盘空间;image 可以被删除并且回收 image 占用的空间。

  • 审计管理

所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。

  • RESTful API

RESTful API 提供给管理员对于 Harbor 更多的操控,使得与其它管理软件集成变得更容易。

  • 部署简单

提供在线和离线两种安装工具,也可以安装到 vSphere 平台(OVA 方式)虚拟设备。

二、架构

4d67fe4fdf322f4060bed408513db6e3.png

  • Proxy:反向代理工具
  • Registry:负责存储 docker 镜像,处理上传/下载命令。对用户进行访问控制,它指向一个 token 服务,强制用户的每次 docker pull/push 请求都要携带一个合法的 token,registry 会通过公钥对 token 进行解密验证。
  • Core service:Harbor 的核心功能:
  • UI:图形界面
  • Webhook:及时获取 registry 上 image 状态变化情况,在 registry 上配置 webhook,把状态变化传递给 UI 模块。
  • Token 服务:复杂根据用户权限给每个 Docker
  • Push/Pull 命令签发 Token。Docker 客户端向 registry 服务发起的请求,如果不包含 token,会被重定向到这里,获得 token 后再重新向 registry 进行请求。
  • Database:提供数据库服务,存储用户权限,审计日志,docker image 分组信息等数据
  • Log collector:为了帮助监控 harbor 运行,复责收集其他组件的 log,供日后进行分析

    三、部署

    Harbor 的所有组件都在 Docker 中部署,所以 Harbor 可使用 Docker Compose 快速部署(Harbor 是基于 Docker Registry V2 版本,所以 Docker 版本必须 > = 1.10.0 Docker-Compose >= 1.6.0);官方列出了需要部署的组件,如下图:

点击下载最新的离线安装包,也可以在线安装

上传并解压,然后修改 yml 配置文件

1
2
3
4
5
cd /app/service
wget https://github.com/goharbor/harbor/releases/download/v2.6.0/harbor-offline-installer-v2.6.0.tgz
tar -xvf harbor-offline-installer-v2.6.0.tgz
cd harbor && cp harbor.yml.tmpl harbor.yml
vi harbor.yml

配置主机地址和端口等(提时:主机名不要使用 localhost127.0.0.1

然后进行安装

1
./install.sh

会先检查是否安装 Docker 和 Docker-Compose 及其版本


可以使用 http://127.0.0.1:prot 访问私有仓库

账号:admin
密码:Harbor12345

登录进去可以修改密码,以及其他的操作

之后命令

1
2
3
4
5
6
vi docker-compose.yml

docker-compose up -d
docker-compose start
docker-compose restart
docker-compose stop

修改配置给 Docker 添加私有仓库,http 需要使用不安全的字段(insecure-registries)

1
2
3
4
vi /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.1:8080"]
}

然后重启 Docker 生效

四、故障

1.端口冲突

Error response from daemon: Ports are not available: exposing port TCP 127.0.0.1:1514 -> 0.0.0.0:0: listen tcp 127.0.0.1:1514: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

报错信息来看时端口占用,搜索发现 Widnows Hyper-V 默认会排除一些端口

1
2
3
netstat -ano | findstr 1514
netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv4 show excludedportrange protocol=udp

2.解决办法

1.以管理员身份运行终端,临时关闭 Hyper-Vwinnat 网络

1
2
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
net stop winnat

2.使用以下命令永久排除指定端口作为保留端口(端口被占用需要先重启下)

1
netsh int ipv4 add excludedportrange protocol=tcp startport=1514 numberofports=1 store=persistent

关键在于 store=persistent 参数表示持久化信息,然后设置起始端口,已经后面的个数

3.再开启 Hyper-Vwinnat 网络,1514 端口就从保留端口排除了

1
2
3
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
net start winnat
netsh interface ipv4 show excludedportrange protocol=tcp

重新开启 Hyper-V 没有进行重启,其实桌面系统可以不开启这个