在前面实践过程中所用到的镜像都是去官方的镜像仓库获取的,但是有时候企业内部的项目不适合放在官方的仓库中去,这时候便需要搭建一个私有的镜像仓库——基于 Harbor
介绍
- 基于角色的访问控制
用户与 Docker 镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
- 基于镜像的复制策略
镜像可以在多个 Registry 实例中复制(可以将仓库中的镜像同步到远程的 Harbor,类似于 MySQL 主从同步功能),尤其适合于负载均衡,高可用,混合云和多云的场景。
- 图形化用户界面
用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管理项目和命名空间。
- 支持 AD/LDAP
Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。
- 镜像删除和垃圾回收
Harbor 支持在 Web 删除镜像,回收无用的镜像,释放磁盘空间;image 可以被删除并且回收 image 占用的空间。
- 审计管理
所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
- RESTful API
RESTful API 提供给管理员对于 Harbor 更多的操控,使得与其它管理软件集成变得更容易。
- 部署简单
提供在线和离线两种安装工具,也可以安装到 vSphere 平台(OVA 方式)虚拟设备。
架构
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 配置文件
wget https://github.com/goharbor/harbor/releases/download/v2.5.1/harbor-offline-installer-v2.5.1.tgz
tar -xvf harbor-offline-installer-v2.5.1.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
配置主机地址和端口等(提时:主机名不要使用 localhost 和 127.0.0.1)
使用./install.sh
命令进行安装
会先检查是否安装 Docker 和 Docker-Compose 及其版本
可以使用 http://127.0.0.1:prot 访问私有仓库
账号:admin 密码:Harbor12345
配置
使用vi /etc/docker/daemon.json
修改配置给 Docker 添加私有仓库,http 需要使用不安全的字段(insecure-registries)
"insecure-registries": ["127.0.0.1:8888"],
故障
端口冲突
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 默认会排除一些端口
netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv4 show excludedportrange protocol=udp
解决办法
1.以管理员身份运行终端,临时关闭 Hyper-V 和 winnat 网络
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
net stop winnat
2.使用以下命令永久排除指定端口作为保留端口(端口被占用需要先重启下)
netsh int ipv4 add excludedportrange protocol=tcp startport=1514 numberofports=1 store=persistent
关键在于store=persistent
参数表示持久化信息,然后设置起始端口,已经后面的个数
3.再开启 Hyper-V 和 winnat 网络,1514 端口就从保留端口排除了
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
net start winnat
netsh interface ipv4 show excludedportrange protocol=tcp