Docker-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個服務:

UI (harbor-ui) :提供圖形化界面,幫助用戶管理Registry. 上的鏡像( image),並對用戶進行授權

WebHook: 為了及時獲取Registry.上image 狀態變化的情況,在Registry. 上配置 Webhook,把狀態變化傳遞給UI模塊

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.229.90  docker-ce、docker-compose、harbor-offline-v1.2.2

client服務器 192.168.229.90  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.229.90
--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.229.90登錄 Harbor WEB UI 界面,默認的管理員用戶名和密碼是 admin/Harbor12345

(2)輸入用戶名和密碼登錄界面后可以創建一個新項目。點擊“+項目”按鈕

(3)填寫項目名稱為“ly”,點擊“確定”按鈕,創建新項目

(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 redis:latest 127.0.0.1/ly/redis:v1

  

//上傳鏡像到 Harbor

docker push 127.0.0.1/ly/redis:v1

  

(5)在 Harbor 界面 ly 目錄下可看見此鏡像及相關信息

 

 

6. 在其他客戶端上傳鏡像

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

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

  

(1)在 Docker 客戶端配置操作

//解決辦法是:在 Docker server 啟動的時候,增加啟動參數,默認使用 HTTP 訪問。

 

解決辦法是:
第一種:在Docker server啟動的時候,增加啟動參數,默認使用 HTTP 訪問。
vim /usr/lib/systemd/system/docker.service
--13行--修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.229.90 --containerd=/run/containerd/containerd.sock
或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.229.90
第二種:vim /etc/ docker/daemon.json
{
"insecure-registries": ["192.168.229.90"],
#添加,注意用逗號結尾
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"]
}

 

  

  

//重啟 Docker,再次登錄

systemctl daemon-reload
systemctl restart docker

  

//再次登錄 Harbor

docker login -u admin -p Harbor12345 http://192.168.229.90
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.229.90/ly/redis:v1

  

//上傳鏡像進行測試

docker pull cirros
docker tag cirros:latest 192.168.229.90/ly/cirros:v2
docker push 192.168.229.90/ly/cirros:v2

   

(2)刷新 Harbor 的 Web 管理界面進行查看,會發現ly項目里面有兩個鏡像

 

 

三、 維護管理Harbor

1. 通過 Harbor Web 創建項目

在 Harbor 倉庫中,任何鏡像在被 push 到 regsitry 之前都必須有一個自己所屬的項目。

單擊“+項目”,填寫項目名稱,項目級別若設置為"私有",則不勾選。如果設置為公共倉庫,則所有人對此項目下的鏡像擁有讀權限,命令行中不需要執行"Docker login"即可下載鏡像,鏡像操作與 Docker Hub 一致。

 

2. 創建 Harbor 用戶

(1)創建用戶並分配權限

在 Web 管理界面中單擊系統管理 -> 用戶管理 -> +用戶,

填寫用戶名為“lili”,郵箱為“lili@qq.com”,全名為“lili”,密碼為“Abc123456”,注釋為“管理員”(可省略)。

附:用戶創建成功后,單擊左側“...”按鈕可將上述創建的用戶設置為管理員角色或進行刪除操作,本例不作任何設置。

(2)添加項目成員

單擊項目 ->ly-> 成員 -> + 成員,填寫上述創建的用戶lili並分配角色為“開發人員”。

附:此時單擊左側“...”按鈕仍然可對成員角色進行變更或者刪除操作

  

(3)在客戶端上使用普通賬戶操作鏡像

//刪除上述打標簽的本地鏡像

docker rmi 192.168.229.90/ly/cirros:v2

  

//先退出當前用戶,然后使用上述創建的賬戶lili 登錄

docker logout 192.168.229.90

docker login 192.168.229.90
或
docker login -u lili -p Abc123456 http://192.168.229.90

  

//下載和上傳鏡像進行測試

docker pull 192.168.229.90/ly/cirros:v2

docker tag cirros:latest 192.168.229.90/ly/cirros:v3
docker push 192.168.229.90/ly/cirros:v3

  

3. 查看日志

Web 界面日志,操作日志按時間順序記錄用戶相關操作

4. 修改 Harbor.cfg 配置文件

要更改 Harbour的配置文件中的可選參數時,請先停止現有的 Harbor實例並更新 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/ly
cd /data/registry/docker/registry/v2/repositories/ly  
tar zcvf ly.tar.gz ./*

  

 

6. 如需重新部署,需要移除 Harbor 服務容器全部數據

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

再次關閉服務並開啟服務,然后在查看web界面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM