在實際生產運維中,往往需要把鏡像發布到幾十、上百臺或更多的節點上。這時單臺Docker主機上鏡像已無法滿足,項目越來越多,鏡像就越來越多,都放到一臺Docker主機上是不行的,我們需要一個像Git倉庫一樣系統來統一管理鏡像。這裡介紹的是一個企業級鏡像倉庫Harbor,將作為我們容器雲平臺的鏡像倉庫中心。
Habor是由VMWare公司開源的容器鏡像倉庫。事實上,Habor是在Docker Registry上進行了相應的企業級擴展,從而獲得了更加廣泛的應用,這些新的企業級特性包括:管理用戶界面,基於角色的訪問控制 ,AD/LDAP集成以及審計日誌等,足以滿足基本企業需求。
官方地址:https://vmware.github.io
Github:https://github.com/goharbor/harbor
1、Harbor主要功能基於角色訪問控制(RBAC)在企業中,通常有不同的開發團隊負責不同的項目,鏡像像代碼一樣,每個人角色不同需求也不同,因此就需要訪問權限控制,根據角色分配相應的權限。
例如,開發人員需要對項目構建這就用到讀寫權限(push/pull),測試人員只需要讀權限(pull),運維一般管理鏡像倉庫,具備權限分配能力,項目經理具有所有權限。
鏡像複製
可以將倉庫中的鏡像同步到遠程的Harbor,類似於MySQL主從同步功能。
LDAPHarbor支持LDAP認證,可以很輕易接入已有的LDAP。
鏡像刪除和空間回收Harbor支持在Web刪除鏡像,回收無用的鏡像,釋放磁碟空間。
圖形頁面管理用戶很方面搜索鏡像及項目管理。
審計對倉庫的所有操作都有記錄。
REST API完整的API,方便與外部集成。
2、Harbor組件組件功能harbor-adminserver配置管理中心harbor-dbMysql資料庫harbor-jobservice負責鏡像複製harbor-log記錄操作日誌harbor-uiWeb管理頁面和APInginx前端代理,負責前端頁面和鏡像上傳/下載轉發redis會話registry鏡像存儲3、Harbor部署環境要求:
Harbor安裝有3種方式:
在線安裝:從Docker Hub下載Harbor相關鏡像,因此安裝軟體包非常小
離線安裝:安裝包包含部署的相關鏡像,因此安裝包比較大
OVA安裝程序:當用戶具有vCenter環境時,使用此安裝程序,在部署OVA後啟動Harbor
我們採用離線安裝,首先下載離線安裝包:https://github.com/vmware/harbor/releases
HTTP方式部署基本配置:
# tar zxvf harbor-offline-installer-v1.7.5.tgz
# cd harbor
# vi harbor.cfg
hostname = 10.206.240.188 # IP位址或者域名訪問
ui_url_protocol = http
harbor_admin_password = Harbor12345 # Web登錄密碼
準備配置文件:
# ./prepare
安裝並啟動Harbor:
# ./install.sh
查看運行狀態:
# docker-compose ps
Name Command State Ports
---
harbor-adminserver /harbor/start.sh Up (healthy)
harbor-db /usr/local/bin/docker-entr ... Up (healthy) 3306/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp
harbor-ui /harbor/start.sh Up (healthy)
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp
redis docker-entrypoint.sh redis ... Up 6379/tcp
registry /entrypoint.sh serve /etc/ ... Up (healthy) 5000/tcp
部署完成,是不是很簡單呢!
如果有非Up狀態,先看日誌:
# ls /var/log/harbor/
adminserver.log jobservice.log mysql.log proxy.log redis.log registry.log ui.log
如果想以https加密方式提供服務可以參考這個免費的視頻教程:https://ke.qq.com/course/311382
或者參考官方文檔:https://github.com/vmware/harbor/blob/master/docs/configure_https.md
4、登錄Web頁面
瀏覽器輸入:http://10.206.240.188
帳號:admin
密碼:Harbor12345
這裡有4個項目,library是默認自帶的,通常用這個存儲一些公共的鏡像,這個項目下鏡像誰都可以pull,但不能push,push需要先登錄。其他3個項目是我自己創建的,請忽略。
先創建一個用戶:
進入library項目,將用戶加入這個成員:
這樣lizhenliang用戶就具備了對這個library項目的push權限。
註:創建新項目賦予用戶權限同等方式。
接下來將剛才構建的鏡像推送到Harbor倉庫,先看看我們要推送的鏡像:
在推送之前,需要注意第一列,這個完整格式是:
registry.ctnrs.com/library/hello-world:latest
鏡像中心域名 項目名稱 名稱 版本
如果鏡像只放在本地存儲REPOSITORY寫什麼都可以,但推送到鏡像倉庫就必須指定倉庫中心地址。
所以,先打重命名REPOSITORY,其實就是引用源鏡像標記了一個目標鏡像:
# docker image tag nginx-112 10.206.240.188/library/nginx-112
# docker push 10.206.240.188/library/nginx-112
The push refers to repository [10.206.240.188/library/nginx-112]
e1bad6a42a61: Layer already exists
9515f16f0627: Layer already exists
a422b28b5eeb: Preparing
bcc97fbfc9e1: Preparing
denied: requested access to the resource is denied
訪問拒絕,剛說過,push需先登錄:
# docker login 10.206.240.188
Username: lizhenliang
Password:
Login Succeeded
# docker push 10.206.240.188/library/nginx-112
The push refers to repository [10.206.240.188/library/nginx-112]
e1bad6a42a61: Layer already exists
9515f16f0627: Layer already exists
a422b28b5eeb: Pushed
bcc97fbfc9e1: Pushed
latest: digest: sha256:49db3f916abf883198b1fc4b90bae6a57bd5ed48ae4d597a07356a2e85106277 size: 1159
其他Docker主機怎麼下載剛推送的鏡像呢?
由於我們搭建的Harbor是以HTTP提供服務的,而Docker CLI默認以HTTPS 訪問倉庫,所以要先配置可信任,否則pull鏡像倉庫失敗。如果是HTTPS提供服務就不用配置這一步了。
# vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://bc437cce.m.daocloud.io"],
"insecure-registries": ["10.206.240.188"]
}
# systemctl restart docker
# docker pull 10.206.240.188/library/nginx-112
pull的地址跟push時是一樣的。
推薦閱讀:
高級運維工程師打怪升級之路 【含視頻】
30個Linux Shell腳本經典案例(上)
30個Linux Shell腳本經典案例(中)
30個Linux Shell腳本經典案例(下)
最主流的DevOps技能體系
基於Kubernetes的DevOps流水線實戰
年輕時偷的懶,遲早是要還的。點亮