一、简介

Harbor 是由VMware公司开源的容器镜像仓库,它在Docker Registry的基础上进行了企业级扩展,包括基于角色的权限控制、AD/LDAP集成、可视化管理界面、日志审计等,它同Docker Registry一样提供容器镜像的存储及分发服务,但与Docker Registry有很多不同,Harbor进行了不少优化及改进,主要差别如下:

1)传输效率优化:Harbor根据容器镜像每层的UUID标识进行增量同步,而不是全量同步,减少带宽及其他资源占用。
2)镜像仓库水平扩展:由于上传、下载镜像文件涉及大量的耗时I/O操作,当用户对性能有较高要求时,需要创建多个Registry,通过负载均衡器将访问压力分发到不同的Registry,同时多个Registry存储时进行镜像文件的同步,便于水平扩展。
3)用户认证:Harbor在Docker Registry的基础上扩展了用户认证授权的功能,用户在Harbor中进行访问需要携带token,以增强安全性。镜像漏洞扫描的功能,可以发现容器镜像中存在的安全漏洞并告警,通知用户及时采取防范措施。容器镜像安全扫描原理就是扫描镜像中的文件系统,逐个文件地检查是否存在安全漏洞,在Harbor中集成了开源项目clair的扫描功能,可从公开的CVE字典库下载漏洞资料。
4)镜像漏洞安全扫描:上传到Harbor上的镜像文件能够通过clair的安全扫描,以发现镜像中存在的安全漏洞,并提高镜像文件的安全性。【需要连接扫描器】
5)提供可视化的Web界面以优化用户体验:Registry只提供命令行方式,没有操作界面,而Harbor提供用户界面,可以支持登录、搜索功能,镜像分类管理包括区分公有、私有镜像等功能,优化了用户管理及操作体验
6)快速部署: 通过 docker-compose 或 Helm Chart 部署
7)RESTful API:提供 RESTful API 方便与其他外部系统集成。

1. Harbor 架构

harbor_arch

1.1 proxy (反向代理)

Proxy 是Habor 的核心服务(Registry、UI等)的反向代理,通过其可以将客户端发送的请求转发给后端服务来完成响应。

1.2 Registry (镜像仓库)

Registry 是容器镜像仓库,负责Docker Image 的存储,完成Image 的pull/push 操作,在访问过程中会进行访问权限控制,用户每次执行 docker pull/push请求都需要携带一个合法的token,为了提高安全性,Registry 会通过公钥对 token 进行解密验证,解密验证无误后才能进行相应操作。

1.3 Core Services(核心服务)

Core services 是Harbor的核心服务,主要包含如下功能:

  • UI:Web 图形化展示界面,根据用户的授权采用可视化方式管理镜像仓库中的各个Image。
  • token 服务: 根据用户权限给每个镜像操作请求生成token。Docker 客户端向Registry 服务发起的请求如不包含token 会被重定向到这个token 服务。获取token 后再重新向Registry 发送请求,这个 token 是Image 操作的唯一合法身份标识,直到token 过期或者用户退出当前session。
  • webhook : 主要用于实时监控Registry 中镜像文件的状态变化。Registry 上的webhook把image 状态变化传递给UI模块。

1.4 Database (DB)

为核心服务提供数据库存储及访问,负责存储用户权限、审计日志、Docker Image 分组等信息。

1.5 Log Collector (日志采集)

负责收集组件运行过程中产生的日志,并监视Harbor 运行状况,以便后期进行运行状况分析。

二、Harbor 部署

部署环境:

1. CentOS Linux release 7.6.1810 (Core)
2. Docker version 19.03.8, build afacb8b
3. docker-compose version 1.26.1, build f216ddbf
4. harbor.v2.0.1

1. 安装要求

详见:Harbor Installation Prerequisites

2. 下载离线压缩包

goharbor/harbor
这里我采用最新的v2: harbor-offline-installer-v2.0.1.tgz
由于墙太高了,网络飞不起来,所以提供备用地址:备用地址

3. 创建自签HTTPS 证书

3.1 创建证书目录

mkdir -p /data/cert && cd /data/cert

3.2 生成CA证书私钥

openssl genrsa  -out ca.key 4096

3.3 生成自己的CA证书

根据自己的机构调整-subj选项中的值。

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=BJ/L=BJ/O=docker/OU=Personal/CN=docker.com" \
 -key ca.key \
 -out ca.crt
官方证书配置: Configure HTTPS Access to Harbor

==注:==在生产环境中,应该从第三方证书机构购买CA证书。测试或开发环境中,可以通过上述方式生成自己的CA证书。

4. 部署安装Harbor

1. 解压离线安装包

tar -xvf harbor-offline-installer-v2.0.1.tgz -C /opt

2. 编辑Harbor 配置文件harbor.yml,如下

在这里插入图片描述
注: 其数据默认存在与 /data 目录下,可以通过修改harbor.yml 配置文件更改默认工作目录。

3. 运行 install.sh (–with-clair 增加镜像文件漏洞安全扫描)

脚本运行基本流程:检查环境 -> 导入镜像 -> 准备环境 -> 准备配置(含移除旧版本)-> 开始启动

[root@docker harbor]# ./install.sh --with-clair
# 检查 Docker
[Step 0]: checking if docker is installed ...

Note: docker version: 19.03.8
# 检查docker-compose 
[Step 1]: checking docker-compose is installed ...

Note: docker-compose version: 1.26.1
# 加载Harbor 镜像(Image)
[Step 2]: loading Harbor images ...
Loaded image: goharbor/trivy-adapter-photon:v2.0.1
Loaded image: goharbor/harbor-portal:v2.0.1
Loaded image: goharbor/harbor-core:v2.0.1
Loaded image: goharbor/harbor-jobservice:v2.0.1
Loaded image: goharbor/notary-server-photon:v2.0.1
Loaded image: goharbor/harbor-log:v2.0.1
Loaded image: goharbor/registry-photon:v2.0.1
Loaded image: goharbor/notary-signer-photon:v2.0.1
Loaded image: goharbor/clair-photon:v2.0.1
Loaded image: goharbor/chartmuseum-photon:v2.0.1
Loaded image: goharbor/prepare:v2.0.1
Loaded image: goharbor/harbor-db:v2.0.1
Loaded image: goharbor/harbor-registryctl:v2.0.1
Loaded image: goharbor/nginx-photon:v2.0.1
Loaded image: goharbor/redis-photon:v2.0.1
Loaded image: goharbor/clair-adapter-photon:v2.0.1

# 准备环境
[Step 3]: preparing environment ...

[Step 4]: preparing harbor configs ...
prepare base dir is set to /root/Harbor/harbor
Clearing the configuration file: /config/log/logrotate.conf
Clearing the configuration file: /config/log/rsyslog_docker.conf
Clearing the configuration file: /config/nginx/nginx.conf
Clearing the configuration file: /config/core/env
Clearing the configuration file: /config/core/app.conf
Clearing the configuration file: /config/registry/passwd
Clearing the configuration file: /config/registry/config.yml
Clearing the configuration file: /config/registry/root.crt
Clearing the configuration file: /config/registryctl/env
Clearing the configuration file: /config/registryctl/config.yml
Clearing the configuration file: /config/db/env
Clearing the configuration file: /config/jobservice/env
Clearing the configuration file: /config/jobservice/config.yml
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/registryctl/config.yml
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
loaded secret from file: /data/secret/keys/secretkey
Generated configuration file: /config/clair/postgres_env
Generated configuration file: /config/clair/config.yaml
Generated configuration file: /config/clair/clair_env
Generated configuration file: /config/clair-adapter/env
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir


# 启动 Harbor
[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating network "harbor_harbor-clair" with the default driver
Creating harbor-log ... done
Creating registry      ... done
Creating harbor-db     ... done
Creating registryctl   ... done
Creating harbor-portal ... done
Creating redis         ... done
Creating clair         ... done
Creating harbor-core   ... done
Creating clair-adapter     ... done
Creating harbor-jobservice ... done
Creating nginx             ... done
✔ ----Harbor has been installed and started successfully.----

镜像漏洞扫描
在这里插入图片描述

4. 部署Harbor 完成,通过HTTPS 方式访问IP即可:

在这里插入图片描述

Web UI 控制界面
在这里插入图片描述

所有Docker Container

[root@docker harbor]# docker ps
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS                    PORTS                                         NAMES
4e55162294f8        goharbor/nginx-photon:v2.0.1           "nginx -g 'daemon of…"   12 minutes ago      Up 12 minutes (healthy)   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp   nginx
3b44f254e86d        goharbor/harbor-jobservice:v2.0.1      "/harbor/entrypoint.…"   12 minutes ago      Up 12 minutes (healthy)                                                 harbor-jobservice
5ca86d2ef51a        goharbor/clair-adapter-photon:v2.0.1   "/home/clair-adapter…"   12 minutes ago      Up 12 minutes (healthy)   8080/tcp                                      clair-adapter
a199e2a93e11        goharbor/harbor-core:v2.0.1            "/harbor/entrypoint.…"   12 minutes ago      Up 12 minutes (healthy)                                                 harbor-core
1c8ba4d3ee0c        goharbor/clair-photon:v2.0.1           "./docker-entrypoint…"   12 minutes ago      Up 12 minutes (healthy)   6060-6061/tcp                                 clair
2e765760d47f        goharbor/harbor-portal:v2.0.1          "nginx -g 'daemon of…"   12 minutes ago      Up 12 minutes (healthy)   8080/tcp                                      harbor-portal
ac4e8ad392c8        goharbor/redis-photon:v2.0.1           "redis-server /etc/r…"   12 minutes ago      Up 12 minutes (healthy)   6379/tcp                                      redis
8d724d97ead9        goharbor/harbor-registryctl:v2.0.1     "/home/harbor/start.…"   12 minutes ago      Up 12 minutes (healthy)                                                 registryctl
32b6cbc7b0d8        goharbor/registry-photon:v2.0.1        "/home/harbor/entryp…"   12 minutes ago      Up 12 minutes (healthy)   5000/tcp                                      registry
5f6ce7928947        goharbor/harbor-db:v2.0.1              "/docker-entrypoint.…"   12 minutes ago      Up 12 minutes (healthy)   5432/tcp                                      harbor-db
60f3e3efbcd4        goharbor/harbor-log:v2.0.1             "/bin/sh -c /usr/loc…"   12 minutes ago      Up 12 minutes (healthy)   127.0.0.1:1514->10514/tcp                     harbor-log

配置Docker镜像仓库,配置hosts 文件

[root@docker harbor]# vim /etc/hosts
192.168.254.128  docker.com

# 编辑Docker 配置文件
[root@docker harbor]# vim /etc/docker/daemon.json
{
	"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
	"insecure-registries": ["docker.com"]  # 配置域名
}

测试

# 给镜像重新打标签
docker tag alpine:3.11 docker.com/library/alplne:3.11

# 登录进行上传
docker login docker.com
docker push docker.com/library/alpine:3.11

5. Harbor 启动与停止:

docker-compose up -d   # 启动Harbor Server

docker-compose down -v   # 停止Harbor Server

参考:

  1. 最新版Harbor搭建(harbor-offline-installer-v1.10.1.tgz)
  2. Harbor Installation and Configuration
  3. Overview of Docker Compose
  4. 《基于Kubernetes的容器云平台实战 》 陆平等
  5. 《容器云运维实战:Docker与Kubernetes集群 》黄靖钧 冯立灿
  6. 《再也不踩坑的kubernetes实战指南》 杜宽
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐