Harbor概述
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
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做了封裝,擴充了自己的業務模闆。
Harbor的構成
Harbor 在架構上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六個元件。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM2YDMykzN5EzN4kjN0YTMvwVMxMDMyIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
Harbor元件 | 說明 |
---|---|
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部署
伺服器 | IP位址 | 主要軟體 |
---|---|---|
Harbor伺服器 | 192.168.163.143 | docker-ce、docker-compose、harbor-offline-v1.2.2 |
client伺服器 | 192.168.163.142 | docker-ce |
案例需求
通過Harbor建立Docker私有倉庫
使用圖形化管理Docker私有倉庫鏡像
實驗準備
在服務端安裝docker和docker-compose
用戶端上安裝docker
關閉防火牆
修改主機名
1. 部署 Harbor 服務
Harbor 被部署為多個 Docker 容器,是以可以部署在任何支援 Docker 的 Linux 發行版上。
服務端主機需要安裝Docker 和 Docker Compose。
安裝Docker Compose如下
放入指令壓縮包
cp -p docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
1)下載下傳 Harbor 安裝程式
- Harbor:192.168.163.143
//線上下載下傳
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 參數檔案
- Harbor:192.168.163.143
vim /usr/local/harbor/harbor.cfg
//第5行
hostname = 192.168.163.143
3)啟動 Harbor
- Harbor:192.168.163.143
sh /usr/local/harbor/install.sh
4)檢視 Harbor 啟動鏡像和容器
- Harbor:192.168.163.143
#檢視鏡像
docker images
#檢視容器
docker ps -a
- 檢查服務容器是否開啟
cd /usr/local/harbor/
docker-compose ps
5)在UI界面建立項目
真機
上圖檢查一切正常,此時可以打開浏覽器通路 http://192.168.163.143 的管理頁面,預設的管理者使用者名和密碼是 admin/Harbor12345。
- 登入後的頁面
- 添加項目并且填寫項目名稱
6)在本地測試倉庫功能
- Harbor:192.168.163.143
此時可使用 Docker 指令在本地通過 127.0.0.1 來登入和推送鏡像。預設情況下,Register 伺服器在端口 80 上偵聽。
1.登入
docker login -u admin -p Harbor12345 http://127.0.0.1
2.下載下傳鏡像進行測試
docker pull nginx
3.鏡像打标簽
docker tag nginx 127.0.0.1/testproject/nginx:v1
4.上傳鏡像到Harbor
docker push 127.0.0.1/testproject/nginx:v1
5.驗證是否上傳成功
7)在用戶端上傳鏡像
-
client:192.168.163.142
上述操作都是在 Harbor 伺服器本地操作。如果其他用戶端上傳鏡像到 Harbor,就會報如下錯誤。出現這問題的原因 Docker Registry 互動預設使用的是 HTTPS,但是搭建私有鏡像預設使用的是 HTTP 服務,是以與私有鏡像互動時出現以下錯誤。
docker login -u admin -p Harbor12345 http://192.168.163.143
#-------------------輸出内容------------------------------------------
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://192.168.163.143/v2/: dial tcp 192.168.163.143:443: connect: connection refused
- 解決方法
vim /usr/lib/systemd/system/docker.service
#--------------------修改内容-----------------------------------
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.163.143 --containerd=/run/containerd/containerd.sock
#---------------------------------------------------------------
//重新開機服務
systemctl daemon-reload
systemctl restart docker
//再次登入
docker login -u admin -p Harbor12345 http://192.168.163.143
#----------------------輸出内容--------------------------------------------
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
#--------------------------------------------------------------------
- 檢視
docker pull tomcat
docker images
docker tag tomcat 192.168.163.143/testproject/tomcat:v2
docker push 192.168.163.143/testproject/tomcat:v2
2. 維護管理Harbor
- 可以使用 docker-compose 來管理 Harbor。一些有用的指令如下所示,必須在與docker-compose.yml 相同的目錄中運作。
-
修改 Harbor.cfg 配置檔案所需選項的步驟
要更改 Harbour 的配置檔案時,請先停止現有的 Harbor 執行個體并更新 Harbor.cfg;然後運作 prepare 腳本來填充配置;最後重新建立并啟動 Harbour 的執行個體。
1)停止現有的 Harbor 執行個體
cd /usr/local/harbor
docker-compose down -v
2)修改配置檔案 Harbor.cfg
vim harbor.cfg
3)運作 prepare 腳本來填充配置
./prepare
4)重新開機服務
docker-compose up -d
3.建立 Harbor 使用者
- 删除之前打标簽的鏡像, 在用戶端上操作
docker rmi 192.168.163.143/testproject/tomcat:v2
- 測試建立的新使用者能否使用
//登出登入
docker logout 192.168.163.143
//使用新建立的使用者和密碼登入私有倉庫
docker login 192.168.163.143
//從私有倉庫下載下傳鏡像
docker pull 192.168.163.143/testproject/nginx:v1
//檢視鏡像
docker images
4.移除 Harbor 服務容器以及全部資料
docker-compose down -v
rm -rf /data/database/
rm -rf /data/registry/