在前面实践过程中所用到的镜像都是去官方的镜像仓库获取的,但是有时候企业内部的项目不适合放在官方的仓库中去,这时候便需要搭建一个私有的镜像仓库——基于 Harbor

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);官方列出了需要部署的组件,如下图:
image.png
点击下载最新的离线安装包,也可以在线安装
image.png
上传并解压,然后修改 yml 配置文件

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

配置主机地址和端口等(提时:主机名不要使用 localhost127.0.0.1
image.png
使用./install.sh命令进行安装
image.png
会先检查是否安装 Docker 和 Docker-Compose 及其版本
image.png
image.png
可以使用 http://127.0.0.1:prot 访问私有仓库
image.png

账号:admin 密码:Harbor12345

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

配置

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

  1. "insecure-registries": ["127.0.0.1:8888"],

然后重启 Docker 生效

故障

端口冲突

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.

报错信息来看时端口占用,使用netstat -ano | findstr 1514查看并木有,搜索发现 Widnows Hyper-V 默认会排除一些端口

  1. netsh interface ipv4 show excludedportrange protocol=tcp
  2. netsh interface ipv4 show excludedportrange protocol=udp

image.pngimage.png

解决办法

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

  1. dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
  2. 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. dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
  2. net start winnat
  3. netsh interface ipv4 show excludedportrange protocol=tcp

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