Docker--harbor私有倉庫部署與管理

咖啡coffee發表於2021-10-18

目錄

一、Harbor簡介

 

二、Harbor 部署

三、維護管理Harbor 

 

 

 

 

一、Harbor簡介

1、什麼是Harbor  ?

Harbor 是 VMware 公司開源的企業級 Docker Registry 專案,其目標是幫助使用者迅速搭建一個企業級的 Docker Registry 服務。

Harbor以 Docker 公司開源的 Registry 為基礎,提供了圖形管理 UI 、基於角色的訪問控制(Role Based AccessControl) 、AD/LDAP 整合、以及審計日誌(Auditlogging) 等企業使用者需求的功能,同時還原生支援中文。

Harbor 的每個元件都是以 Docker 容器的形式構建的,使用 docker-compose 來對它進行部署。用於部署 Harbor 的 docker-compose 模板位於 harbor/docker-compose.yml。

2、Harbor的特性

  • 1、基於角色控制:使用者和倉庫都是基於專案進行組織的,而使用者在專案中可以擁有不同的許可權。
  • 2、基於映象的複製策略:映象可以在多個Harbor例項之間進行復制(同步)。
  • 3、支援 LDAP/AD:Harbor 可以整合企業內部已有的 AD/LDAP(類似資料庫的一張表),用於對已經存在的使用者認證和管理。
  • 4、映象刪除和垃圾回收:映象可以被刪除,也可以回收映象佔用的空間。
  • 5、圖形化使用者介面:使用者可以通過瀏覽器來瀏覽,搜尋映象倉庫以及對專案進行管理。
  • 6、審計管理:所有針對映象倉庫的操作都可以被記錄追溯,用於審計管理。
  • 7、支援 RESTful API:RESTful API 提供給管理員對於 Harbor 更多的操控, 使得與其它管理軟體整合變得更容易。
  • 8、Harbor和docker registry的關係:Harbor實質上是對docker registry做了封裝,擴充套件了自己的業務模板。

3、Harbor的構成

Harbor 在架構上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六個元件。

Proxy: Harbor 的 Registry、UI、Token 服務等元件,都處在 nginx 反向代理後邊。該代理將來自瀏覽器、docker clients 的請求轉發到後端不同的服務上。

Registry: 負責儲存 Docker 映象,並處理 Docker push/pull 命令。由於要對使用者進行訪問控制,即不同使用者對 Docker 映象 有不同的讀寫許可權,Registry 會指向一個 Token 服務,強制使用者的每次 Docker pull/push 請求都要攜帶一個合法的 Token, Registry 會通過公鑰對 Token 進行解密驗證。

Core services: Harbor的核心功能,主要提供以下3個服務:
1)UI(harbor-ui): 提供圖形化介面,幫助使用者管理 Registry 上的映象(image), 並對使用者進行授權。
2)WebHook:為了及時獲取Registry 上image 狀態變化的情況,在Registry 上配置 Webhook,把狀態變化傳遞給 UI 模組。
3)Token 服務:負責根據使用者許可權給每個 Docker push/pull 命令簽發 Token。Docker 客戶端向 Registry 服務發起的請求, 如果不包含 Token,會被重定向到 Token 服務,獲得 Token 後再重新向 Registry 進行請求。

Database(harbor-db):為core services提供資料庫服務,負責儲存使用者許可權、審計日誌、Docker 映象分組資訊等資料。

Job services: 主要用於映象複製,本地映象可以被同步到遠端 Harbor 例項上。

Log collector(harbor-log): 負責收集其他元件的日誌到一個地方。

 

Harbor 的每個元件都是以 Docker 容器的形式構建的,因此,使用 Docker Compose 來對它進行部署。
總共分為7個容器執行,通過在docker-compose.yml所在目錄中執行 docker-compose ps 命令來檢視, 名稱分別為:nginx、harbor-jobservice、harbor-ui、harbor-db、harbor-adminserver、registry、harbor-log
其中 harbor-adminserver 主要是作為一個後端的配置資料管理,並沒有太多的其他功能。harbor-ui 所要操作的所有資料都通過 harbor-adminserver 這樣一個資料配置管理中心來完成。

二、Harbor 部署

Harbor伺服器      192.168.91.5           docker-ce、docker-compose、harbor-offline-v1.2.2
client伺服器        192.168.91.10           docker-ce

1、部署 Docker-Compose 服務

//下載或者上傳 Docker-Compose
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose -v  

2、部署 Harbor 服務

(1)下載或上傳 Harbor 安裝程式
wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz

tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/


(2)修改harbor安裝的配置檔案
vim /usr/local/harbor/harbor.cfg
--5行--修改,設定為Harbor伺服器的IP地址或者域名
hostname = 192.168.91.5
--59行--指定管理員的初始密碼,預設的使用者名稱/密碼是admin/Harbor12345
harbor_admin_password = Harbor12345

 

 

 

關於 Harbor.cfg 配置檔案中有兩類引數:所需引數和可選引數
1、所需引數:這些引數需要在配置檔案 Harbor.cfg 中設定。如果使用者更新它們並執行 install.sh 指令碼重新安裝 Harbour, 引數將生效。具體引數如下:
●hostname:用於訪問使用者介面和 register 服務。它應該是目標機器的 IP 地址或完全限定的域名(FQDN),例如 192.168.80.10 或 hub.kgc.cn。不要使用 localhost 或 127.0.0.1 為主機名。

●ui_url_protocol:(http 或 https,預設為 http)用於訪問 UI 和令牌/通知服務的協議。如果處於啟用狀態,則此引數必須為 https。

●max_job_workers:映象複製作業執行緒。

●db_password:用於db_auth 的MySQL資料庫root 使用者的密碼。

●customize_crt:該屬性可設定為開啟或關閉,預設開啟。開啟此屬性時,準備指令碼建立私鑰和根證照,用於生成/驗證登錄檔令牌。當由外部來源提供金鑰和根證照時,將此屬性設定為 off。

●ssl_cert:SSL 證照的路徑,僅當協議設定為 https 時才應用。

●secretkey_path:用於在複製策略中加密或解密遠端 register 密碼的金鑰路徑。

2、可選引數:這些引數對於更新是可選的,即使用者可以將其保留為預設值,並在啟動 Harbor 後在 Web UI 上進行更新。如果進入 Harbor.cfg,只會在第一次啟動 Harbor 時生效,隨後對這些引數的更新,Harbor.cfg 將被忽略。

注意:如果選擇通過 UI 設定這些引數,請確保在啟動 Harbor 後立即執行此操作。具體來說,必須在註冊或在 Harbor 中建立任何新使用者之前設定所需的 auth_mode。當系統中有使用者時(除了預設的 admin 使用者), auth_mode 不能被修改。 具體引數如下:
●Email:Harbor 需要該引數才能向使用者傳送“密碼重置”電子郵件,並且只有在需要該功能時才啟用。請注意,在預設情況下 SSL 連線時沒有啟用。如果 SMTP 伺服器需要 SSL,但不支援 STARTTLS,那麼應該通過設定啟用 SSL email_ssl = TRUE。

●harbour_admin_password:管理員的初始密碼,只在 Harbour 第一次啟動時生效。之後, 此設定將被忽略,並且應在 UI 中設定管理員的密碼。請注意,預設的使用者名稱/密碼是admin/Harbor12345。

●auth_mode:使用的認證型別,預設情況下,它是 db_auth,即憑據儲存在資料庫中。對於LDAP身份驗證,請將其設定為 ldap_auth。

●self_registration:啟用/禁用使用者註冊功能。禁用時,新使用者只能由 Admin 使用者建立,只有管理員使用者可以在 Harbour 中建立新使用者。注意:當 auth_mode 設定為 ldap_auth 時,自注冊功能將始終處於禁用狀態,並且該標誌被忽略。

●Token_expiration:由令牌服務建立的令牌的到期時間(分鐘),預設為 30 分鐘。

●project_creation_restriction:用於控制哪些使用者有權建立專案的標誌。預設情況下,每個人都可以建立一個專案。如果將其值設定為“adminonly”,那麼只有 admin 可以建立專案。

●verify_remote_cert:開啟或關閉,預設開啟。此標誌決定了當Harbor與遠端 register 例項通訊時是否驗證 SSL/TLS 證照。 將此屬性設定為 off 將繞過 SSL/TLS 驗證,這在遠端例項具有自簽名或不可信證照時經常使用。

另外,預設情況下,Harbour 將映象儲存在本地檔案系統上。在生產環境中,可以考慮 使用其他儲存後端而不是本地檔案系統,如 S3、Openstack Swif、Ceph 等物件儲存。但需要更新 common/templates/registry/config.yml 檔案。

3、 啟動 Harbor

cd /usr/local/harbor/
./install.sh

4、檢視 Harbor 啟動映象

cd /usr/local/harbor/
docker-compose ps

5、建立一個新專案

(1)瀏覽器訪問:http://192.168.91.5 登入 Harbor WEB UI 介面,預設的管理員使用者名稱和密碼是 admin/Harbor12345

(2)輸入使用者名稱和密碼登入介面後可以建立一個新專案。點選“+專案”按鈕

(3)填寫專案名稱為“myproject-kgc”,點選“確定”按鈕,建立新專案

(4)此時可使用 Docker 命令在本地通過 127.0.0.1 來登入和推送映象。預設情況下,Registry 伺服器在埠 80 上偵聽。
//登入 Harbor
docker login [-u admin -p Harbor12345] http://127.0.0.1

//下載映象進行測試
docker pull nginx

//將映象打標籤
格式:docker tag 映象:標籤  倉庫IP/專案名稱/映象名:標籤
docker tag nginx:latest 127.0.0.1/myproject-kgc/nginx:v1

//上傳映象到 Harbor
docker push 127.0.0.1/myproject-kgc/nginx:v1

(5)在 Harbor 介面 myproject-kgc 目錄下可看見此映象及相關資訊

 

 

 

 

 6、在其他客戶端上傳映象

以上操作都是在 Harbor 伺服器本地操作。如果其他客戶端登入到 Harbor,就會報如下錯誤。出現這問題的原因為Docker Registry 互動預設使用的是 HTTPS,但是搭建私有映象預設使用的是 HTTP 服務,所以與私有映象互動時出現以下錯誤。

docker login -u admin -p Harbor12345 http://192.168.91.5
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://192.168.91.5/v2/: dial tcp 192.168.91.5:443: connect: connection refused

(1)在 Docker 客戶端配置操作
//解決辦法是:在 Docker server 啟動的時候,增加啟動引數,預設使用 HTTP 訪問。
vim /usr/lib/systemd/system/docker.service
--13行--修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.91.5 --containerd=/run/containerd/containerd.sock
或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.91.5

//重啟 Docker,再次登入
systemctl daemon-reload
systemctl restart docker

//再次登入 Harbor
docker login -u admin -p harbor12345 http://192.168.91.5
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Login Succeeded
//將自動儲存憑據到/root/.docker/config.json,下次登入時可直接使用憑據登入 Harbor

//下載映象進行測試
docker pull 192.168.80.10/myproject-kgc/nginx:v1

//上傳映象進行測試
docker pull cirros
docker tag cirros:latest 192.168.91.5/myproject-kgc/cirros:v2
docker push 192.168.80.10/myproject-kgc/cirros:v2

(2)重新整理 Harbor 的 Web 管理介面進行檢視,會發現 myproject-kgc 專案裡面有兩個映象

 

 

 

 

 

 

 

三、維護管理Harbor 

1、 通過 Harbor Web 建立專案

在 Harbor 倉庫中,任何映象在被 push 到 regsitry 之前都必須有一個自己所屬的專案。
單擊“+專案”,填寫專案名稱,專案級別若設定為"私有",則不勾選。如果設定為公共倉庫,則所有人對此專案下的映象擁有讀許可權,命令列中不需要執行"Docker login"即可下載映象,映象操作與 Docker Hub 一致。

2、建立 Harbor 使用者
(1)建立使用者並分配許可權

在 Web 管理介面中單擊系統管理 -> 使用者管理 -> +使用者,
填寫使用者名稱為“kgc-zhangsan”,郵箱為“kgc-zhangsan@kgc.com”,全名為“zhangsan”,密碼為“Abc123456”,註釋為“管理員”(可省略)。
附:使用者建立成功後,單擊左側“...”按鈕可將上述建立的使用者設定為管理員角色或進行刪除操作,本例不作任何設定。

 

 

(2)新增專案成員

單擊專案 -> myproject-kgc-> 成員 -> + 成員,填寫上述建立的使用者 kgc-zhangsan 並分配角色為“開發人員”。
附:此時單擊左側“...”按鈕仍然可對成員角色進行變更或者刪除操作

 

(3)在客戶端上使用普通賬戶操作映象

 

//刪除上述打標籤的本地映象
docker rmi 192.168.91.5/myproject-kgc/cirros:v2

//先退出當前使用者,然後使用上述建立的賬戶 kgc-zhangsan 登入
docker logout 192.168.91.5

docker login 192.168.91.5
或
docker login -u kgc-zhangsan -p Abc123456 http://192.168.91.5

//下載和上傳映象進行測試
docker pull 192.168.91.5/myproject-kgc/cirros:v2

docker tag cirros:latest 192.168.91.5/myproject-kgc/cirros:v3
docker push 192.168.91.5/myproject-kgc/cirros:v3

 

 

 3、檢視日誌

Web 介面日誌,操作日誌按時間順序記錄使用者相關操作

4、修改 Harbor.cfg 配置檔案

要更改 Harbour的配置檔案中的可選引數時,請先停止現有的 Harbour例項並更新 Harbor.cfg;然後執行 prepare 指令碼來填充配置; 最後重新建立並啟動 Harbour 的例項。

使用 docker-compose 管理 Harbor 時,必須在與 docker-compose.yml 相同的目錄中執行。
cd /usr/local/harbor
docker-compose down -v

vim harbor.cfg			#只能修改可選引數

./prepare

docker-compose up -d
//如果有以下報錯,需要開啟防火牆 firewalld 服務解決
Creating network "harbor_harbor" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name.
 (exit status 1))

systemctl restart firewalld.service
docker-compose up -d

5、移除 Harbor 服務容器同時保留映象資料/資料庫,並進行遷移

//在Harbor伺服器上操作
(1)移除 Harbor 服務容器
cd /usr/local/harbor
docker-compose down -v

(2)把專案中的映象資料進行打包
//持久資料,如映象,資料庫等在宿主機的/data/目錄下,日誌在宿主機的/var/log/Harbor/目錄下
ls /data/registry/docker/registry/v2/repositories/myproject-kgc
cd /data/registry/docker/registry/v2/repositories/myproject-kgc
tar zcvf kgc-registry.tar.gz ./*

 

 

6、如需重新部署,需要移除 Harbor 服務容器全部資料

cd /usr/local/harbor
docker-compose down -v
rm -r /data/database
rm -r /data/registry

 

 

  

 

 

  

 

相關文章