docker仓库Harbor安装配置



技术选型

开源Docker Registry的不足

同很多团队进行容器云构建的初始阶段一样,一开始我们并不太注重安全,容器仓库一般都是配置成insecure-registry直接使用。这次,我们决定加强安全方面的控制。我们发现了它的一些不足如下:

  • 用户与鉴权:Docker Registry V2可以基于htpasswd文件进行简单的用户管理,但是维护不便,也没有对外的API可供集成。

  • 缺少日志与审记:Docker Registry没有日志收集能力,也缺少审记。

  • 复制与同步:在不同的Registry实例之间复制镜像是十分普遍的需求,但Docker Registry只支持将公有Registry的镜像同步至私有仓库 。

  • 镜像删除不便:Docker客户端没有提供删除仓库镜像的命令,删除仓库中的镜像,只能通过其它工具调用rest api 。

  • 缺少图形化的管理界面:要想补上这些缺点,需要在自已的容器云中做一些加强,需要工作量。除了Docker Registry,还有没有其它的选择,已经补齐了这些能力,或部分补齐了呢?于是,我们做了一点小了解。

业界可选的Registry

  • Docker Hub 提供了直观的界面、自动化构建、私有仓库以及众多官方镜像。这是官方的公有库,下载镜像必须联接外网。

  • Docker Registry 最流行的开源registry。你可以在自己的设施上运行或者使用Docker Hub。

  • Quay.io 最初由一个两人工作室开发的产品,专注于Docker私有库。目前已被Coreos收购。

  • CoreOS Enterprise Registry Coreos收购Quay.io之后推出的企业级Containger Registry,提供细化权限和审计跟踪。

  • Nexus 3.0 nexus原来只是一个maven的仓库服务器,升级到3.0之后,也可以使用它对docker的镜像进行管理。

  • Harbor vmware开源的企业级容器registry,基于开源的Docker Registry进行增强。

Docker Hub相信大家都不陌生,用来做私库的源库是可以的,可以将一些基础镜像从这个云库拉到私库中。它并不适合在容器云中直接使用,下载镜像时需要连外网,速度也是个大问题。

Docker Registry就不说了,接下来的Quay.io,CoreOS Enterprise Registry是付费的,或者是商业付费的,不考虑。Nexus 3有图形化的管理页面可以操作镜像,但其它的能力与Docker Registry差不多。最后看到的harbor,则令我们眼前一亮。

新的选择–Harbor

Harbor是VMware公司于2016年开源的企业级Docker Registry项目。它是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。

作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

Harbor的特点

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

  • 镜像复制:镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。

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

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

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

  • 国际化:已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。

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

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

Harbor的整体架构

Harbor在架构上主要由五个组件构成:

  • Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。

  • Registry:负责储存Docker镜像,并处理dockerpush/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token,Registry会通过公钥对token 进行解密验证。

  • Core services:这是Harbor的核心功能,主要提供以下服务:UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。 webhook:为了及时获取registry上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。token服务:负责根据用户权限给每个docker push/pull命令签发token.Docker客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。

  • Database:为core-services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。

  • Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

harbor的核心概念

以上是Harbor的核心概念。一个项目可以看成一个用户的小私库,项目成员按照其角色,可以上传,下载,删除镜像,或添加删除成员等。系统管理员可以创建镜像库复制目标,为项目设置复制策略,可以从其它的镜像库复制镜像过来。复制策略会产生复制任务。项目下面可拥有多个镜像,而每个镜像则可以有多个镜像标签。项目包含日志。

Harbor安装

前提

docker 和 docker-compose 安装完成

创建 https 证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建证书目录,并赋予权限
mkdir -p /data/cert && chmod -R 777 /data/cert && cd /data/cert
# 生成私钥,需要设置密码
openssl genrsa -des3 -out harbor.key 2048

# 生成CA证书,需要输入密码
openssl req -sha512 -new \
-subj "/C=CN/ST=JS/L=WX/O=zwx/OU=jhmy/CN=hub.jhmy.com" \
-key harbor.key \
-out harbor.csr

# 备份证书
cp harbor.key harbor.key.org

# 退掉私钥密码,以便docker访问(也可以参考官方进行双向认证)
openssl rsa -in harbor.key.org -out harbor.key

# 使用证书进行签名
openssl x509 -req -days 365 -in harbor.csr -signkey harbor.key -out harbor.crt

  • 安装文档
1
https://goharbor.io/docs/1.10/install-config/

下载解压

1
https://github.com/goharbor/harbor/releases
1
2
3
cd /data/tools
tar -zxf harbor-offline-installer-v1.10.1.tgz
cd /data/tools/harbor

  • 配置harbor.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
hostname: 192.168.145.130

http:
port: 80

https:
port: 443
certificate: /data/cert/harbor.crt
private_key: /data/cert/harbor.key

harbor_admin_password: 123456

database:
password: 123456

  • 安装
1
./install.sh

  • 卸载
1
# docker-compose -f /data/tools/harbor/docker-compose.yml down
  • 配置
1
2
3
4
5
vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.145.130"]
}
service docker restart
  • 端口开放
1
2
3
4
5
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=5000/tcp
firewall-cmd --reload
firewall-cmd --list-all

启动&停止

1
2
docker-compose -f /data/tools/harbor/docker-compose.yml stop
docker-compose -f /data/tools/harbor/docker-compose.yml start

设置host解析

linux

1
2
3
vi /etc/hosts
192.168.145.130 czharbor.com
service network restart

win7

1
2
3
4
C:\Windows\System32\drivers\etc\hosts
# 文件改为读写
192.168.145.130 czharbor.com
# 文件改为只读

访问验证

1
2
https://czharbor.com/harbor/registries
admin/123456

自定义仓库

上传测试镜像

1
2
3
4
docker login -u admin -p 123456 czharbor.com
docker tag redis:3.2 czharbor.com/dev/redis:3.2
docker push czharbor.com/dev/redis:3.2
# docker logout czharbor.com