Docker-Registry 企業級私有倉庫Harbor v2 部署實戰 (一)

一、簡介

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,如下

在這裏插入圖片描述

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章