[TOC]
Docker容器應(yīng)用的開發(fā)和運(yùn)行離不開可靠的鏡像管理门驾,雖然Docker官方也提供了公共的鏡像倉(cāng)庫(kù)谜疤,但是從安全和效率等方面考慮甫恩,部署我們私有環(huán)境內(nèi)的Registry也是非常必要的。Harbor 是由VMware公司開源的企業(yè)級(jí)的Docker Registry管理項(xiàng)目羞反,它包括權(quán)限管理(RBAC)吗蚌、LDAP贺纲、日志審核、管理界面褪测、自我注冊(cè)猴誊、鏡像復(fù)制和中文支持等功能。
Harbor 的所有組件都在 Dcoker 中部署侮措,所以 Harbor 可使用 Docker Compose 快速部署懈叹。
注: 由于 Harbor 是基于 Docker Registry V2 版本,所以 docker 版本必須 > = 1.10.0 docker-compose >= 1.6.0
Harbor的目標(biāo)是幫助用戶迅速搭建一個(gè)企業(yè)級(jí)的Docker registry服務(wù)分扎。它以Docker公司開源的registry為基礎(chǔ)
澄成,額外提供了如下功能:
- 基于角色的訪問控制(Role Based Access Control)
- 基于策略的鏡像復(fù)制(Policy based image replication)
- 鏡像的漏洞掃描(Vulnerability Scanning)
- AD/LDAP集成(LDAP/AD support)
- 鏡像的刪除和空間清理(Image deletion & garbage collection)
- 友好的管理UI(Graphical user portal)
- 審計(jì)日志(Audit logging)
- RESTful API
- 部署簡(jiǎn)單(Easy deployment)
架構(gòu)圖
Harbor的每個(gè)組件都是以Docker容器的形式構(gòu)建的,可以使用Docker Compose來進(jìn)行部署。如果環(huán)境中使用了kubernetes墨状,Harbor也提供了kubernetes的配置文件卫漫。
Harbor大概需要以下幾個(gè)容器組成:ui(Harbor的核心服務(wù))、log(運(yùn)行著rsyslog的容器肾砂,進(jìn)行日志收集)列赎、mysql(由官方mysql鏡像構(gòu)成的數(shù)據(jù)庫(kù)容器)、Nginx(使用Nginx做反向代理)镐确、registry(官方的Docker registry)包吝、adminserver(Harbor的配置數(shù)據(jù)管理器)、jobservice(Harbor的任務(wù)管理服務(wù))源葫、redis(用于存儲(chǔ)session)诗越。
Harbor是一個(gè)用于存儲(chǔ)和分發(fā)Docker鏡像的企業(yè)級(jí)Registry服務(wù)器,整體架構(gòu)還是很清晰的息堂。下面借用了網(wǎng)上的架構(gòu)圖:
Harbor依賴的外部組件
-> Nginx(即Proxy代理層): Nginx前端代理嚷狞,主要用于分發(fā)前端頁(yè)面ui訪問和鏡像上傳和下載流量; Harbor的registry,UI,token等服務(wù),通過一個(gè)前置的反向代理統(tǒng)一接收瀏覽器荣堰、Docker客戶端的請(qǐng)求床未,并將請(qǐng)求轉(zhuǎn)發(fā)給后端不同的服務(wù)。
-> Registry v2: 鏡像倉(cāng)庫(kù)持隧,負(fù)責(zé)存儲(chǔ)鏡像文件; Docker官方鏡像倉(cāng)庫(kù), 負(fù)責(zé)儲(chǔ)存Docker鏡像,并處理docker push/pull命令逃片。由于我們要對(duì)用戶進(jìn)行訪問控制屡拨,即不同用戶對(duì)Docker image有不同的讀寫權(quán)限,Registry會(huì)指向一個(gè)token服務(wù)褥实,強(qiáng)制用戶的每次docker pull/push請(qǐng)求都要攜帶一個(gè)合法的token, Registry會(huì)通過公鑰對(duì)token進(jìn)行解密驗(yàn)證呀狼。
-> Database(MySQL或Postgresql):為core services提供數(shù)據(jù)庫(kù)服務(wù),負(fù)責(zé)儲(chǔ)存用戶權(quán)限损离、審計(jì)日志哥艇、Docker image分組信息等數(shù)據(jù)。
Harbor自有組件
- -> Core services(Admin Server): 這是Harbor的核心功能僻澎,主要提供以下服務(wù):
- -> UI:提供圖形化界面貌踏,幫助用戶管理registry上的鏡像(image), 并對(duì)用戶進(jìn)行授權(quán)。
- -> webhook:為了及時(shí)獲取registry 上image狀態(tài)變化的情況窟勃, 在Registry上配置webhook祖乳,把狀態(tài)變化傳遞給UI模塊。
- -> Auth服務(wù):負(fù)責(zé)根據(jù)用戶權(quán)限給每個(gè)docker push/pull命令簽發(fā)token. Docker 客戶端向Regi?stry服務(wù)發(fā)起的請(qǐng)求,如果不包含token秉氧,會(huì)被重定向到這里眷昆,獲得token后再重新向Registry進(jìn)行請(qǐng)求。
- -> API: 提供Harbor RESTful API
- -> Replication Job Service:提供多個(gè) Harbor 實(shí)例之間的鏡像同步功能。
- -> Log collector:為了幫助監(jiān)控Harbor運(yùn)行亚斋,負(fù)責(zé)收集其他組件的log作媚,供日后進(jìn)行分析。
核心組件
Proxy:一個(gè)nginx的前端代理帅刊,代理Harbor的registry,UI, token等服務(wù)纸泡。-通過深藍(lán)色先標(biāo)識(shí)
db:負(fù)責(zé)儲(chǔ)存用戶權(quán)限、審計(jì)日志厚掷、Dockerimage分組信息等數(shù)據(jù)弟灼。
UI:提供圖形化界面,幫助用戶管理registry上的鏡像, 并對(duì)用戶進(jìn)行授權(quán)冒黑。
jobsevice:jobsevice是負(fù)責(zé)鏡像復(fù)制工作的田绑,他和registry通信,從一個(gè)registry pull鏡像然后push到另一個(gè)registry抡爹,并記錄job_log掩驱。通過紫色線標(biāo)識(shí)
Adminserver:是系統(tǒng)的配置管理中心附帶檢查存儲(chǔ)用量,ui和jobserver啟動(dòng)時(shí)候回需要加載adminserver的配置冬竟。通過灰色線標(biāo)識(shí)欧穴;
Registry:鏡像倉(cāng)庫(kù),負(fù)責(zé)存儲(chǔ)鏡像文件泵殴。當(dāng)鏡像上傳完畢后通過hook通知ui創(chuàng)建repository涮帘,上圖通過紅色線標(biāo)識(shí),當(dāng)然registry的token認(rèn)證也是通過ui組件完成笑诅。通過紅色線標(biāo)識(shí)
-
Log:為了幫助監(jiān)控Harbor運(yùn)行调缨,負(fù)責(zé)收集其他組件的log,供日后進(jìn)行分析吆你。過docker的log-driver把日志匯總到一起弦叶,通過淺藍(lán)色線條標(biāo)識(shí)
image
安裝
1. 下載離線安裝包
Harbor以容器的形式進(jìn)行部署, 因此可以被部署到任何支持Docker的Linux發(fā)行版, 要使用Harbor,需要安裝docker和docker-compose編排工具
訪問harbor release page妇多,下載Harbor軟件tgz壓縮包
或執(zhí)行如下命令
wget https://storage.googleapis.com/harbor-releases/release-2.0.0/harbor-offline-installer-latest.tgz
-
解壓tgz壓縮包
tar xvf harbor-offline-installer-<version>.tgz
2. 配置 harbor.cfg (harbor.yml)
注: 新版本是.yaml文件伤哺,之前版本是.conf 或者 .cfg文件
-
解壓后文件在當(dāng)前目錄下的
harbor/
目錄下cd harbor/ vim harbor.cfg harbor_admin_password = Harbor12345
3. 啟動(dòng) Harbor
-
配置完后,執(zhí)行安裝腳本
./install.sh
#會(huì)拉取好幾個(gè)鏡像下來者祖,及檢查環(huán)境 Note: docker version: 1.12.5 Note: docker-compose version: 1.9.0 [Step 0]: checking installation environment ... .... [Step 1]: loading Harbor images ... .... [Step 2]: preparing environment ... .... [Step 3]: checking existing instance of Harbor ... .... [Step 4]: starting Harbor ... ? ----Harbor has been installed and started successfully.---- ... For more details, please visit https://github.com/vmware/harbor .
安裝完成后立莉,會(huì)發(fā)現(xiàn)解壓目錄harbor下面多了一個(gè)docker-compose.yml文件,里面包含了harbor依賴的鏡像和對(duì)應(yīng)容器創(chuàng)建的信息
執(zhí)行 docker-compose ps (執(zhí)行docker-compose需在包含docker-compose.yml的目錄) , 確保 container 的狀態(tài)都是up (healthy).
如果安裝一切順利七问,通過之前在harbor.cfg配置的hostname即可以訪問到前端了.
安裝配置問題
Harbor安裝 之后桃序,需要用docker-compose ps
命令去查看狀態(tài),保證所有docker 容器都是 healthy, 否則 很可能login harbor 失敗
如果那個(gè)service 啟動(dòng)不正常烂瘫,就去查看/var/log/harbor/ 下對(duì)應(yīng)的log
owen@swarm-node-107:/disk/harbor_v2.0.0$ ls /var/log/harbor/ -lht
總用量 22M
-rw-r--r-- 1 10000 10000 3.5M 12月 15 23:03 registryctl.log
-rw-r--r-- 1 10000 10000 5.4M 12月 15 23:02 core.log
-rw-r--r-- 1 10000 10000 4.4M 12月 15 23:02 portal.log
-rw-r--r-- 1 10000 10000 4.9M 12月 15 23:02 registry.log
-rw-r--r-- 1 10000 10000 1.2M 12月 15 23:02 proxy.log
-rw-r--r-- 1 10000 10000 392K 12月 15 23:00 redis.log
-rw-r--r-- 1 10000 10000 1.6M 12月 15 23:00 jobservice.log
-rw-r--r-- 1 10000 10000 53K 12月 14 21:42 postgresql.log
-rw-r--r-- 1 10000 10000 65K 7月 7 23:35 clair.log
-rw-r--r-- 1 10000 10000 1.2K 7月 5 11:43 clair-adapter.log
-rw-r--r-- 1 10000 10000 1.4K 7月 5 11:38 chartmuseum.log
修改harbor的運(yùn)行配置媒熊,需要如下步驟:
# 停止 harbor
docker-compose down -v
# 修改配置
vim harbor.cfg
# 執(zhí)行./prepare已更新配置到docker-compose.yml文件
./prepare
# 啟動(dòng) harbor
docker-compose up -d
問題-1 服務(wù)啟動(dòng)異常
ubuntu@172-20-16-51:/opt/harbor$ docker login 192.20.16.51
Username: admin
Password:
Error response from daemon: login attempt to http://192.20.16.51/v2/ failed with status: 502 Bad Gateway
Harbor-db service 不能正常啟動(dòng)奇适,最后查看postgresql.log 發(fā)現(xiàn)下面 message.
| initdb: directory "/var/lib/postgresql/data" exists but is not empty
| If you want to create a new database system, either remove or empty
| the directory "/var/lib/postgresql/data" or run initdb
| with an argument other than "/var/lib/postgresql/data".
因?yàn)楫?dāng)時(shí)/data/datebase 目錄下,確實(shí)不是empty, 手動(dòng)改了docker-compose.yml 芦鳍,然后 docker-compose up -d
重新啟動(dòng)容器嚷往,服務(wù)正常
postgresql:
image: goharbor/harbor-db:v2.0.0
container_name: harbor-db
restart: always
cap_drop:
- ALL
cap_add:
- CHOWN
- DAC_OVERRIDE
- SETGID
- SETUID
volumes:
- /data/database:/var/lib/postgresql/data:z
問題-2- dial tcp xxx.xxx.xxx.xxx:443: connect: connection refused
# docker login 192.20.16.51:80
Username: admin
Password:
Error response from daemon: Get https://192.20.16.51:80/v2/: http: server gave HTTP response to HTTPS client
或者
Error response from daemon: Get https://192.168.31.107/v2/: dial tcp 192.168.31.107:443: connect: connection refused
docker1.3.2版本開始默認(rèn)docker registry使用的是https,·Harbor默認(rèn)安裝使用的是HTTP協(xié)議·柠衅,所以當(dāng)執(zhí)行用docker login皮仁、pull、push等命令操作非https的docker regsitry
的時(shí)就會(huì)報(bào)錯(cuò)菲宴。
臨時(shí)解決辦法:需要在每一臺(tái)harbor客戶端機(jī)器都要設(shè)置"insecure-registries" (徹底解決需要啟動(dòng)Harbor HTTPS證書)
如果系統(tǒng)是MacOS贷祈,則可以點(diǎn)擊“Preference”里面的“Advanced”在“Insecure Registry”里加上hostname (e.g. docker.bksx.com),重啟Docker客戶端就可以了喝峦。
如果系統(tǒng)是
Ubuntu
势誊,則修改配置文件/lib/systemd/system/docker.service
,修改[Service]下ExecStart參數(shù)谣蠢,增加–insecure-registry hostname
(e.g. docker.bksx.com)如果系統(tǒng)是
Centos
粟耻,可以修改配置/etc/sysconfig/docker
,將OPTIONS增加–insecure-registry hostname
(e.g. docker.bksx.com)
如果是新版本的docker在/etc/sysconfig/ 沒有docker這個(gè)配置文件的情況下眉踱。
#在daemon.json中添加以下參數(shù)
[root@localhost harbor]# cat /etc/docker/daemon.json
{
"insecure-registries": [
"hostname"
]
}
注意:該文件必須符合 json 規(guī)范挤忙,否則 Docker 將不能啟動(dòng)。另外hostname 必須與harbor.cfg 里的hostname 一致谈喳。
添加完了后重新啟動(dòng) docker:systemctl daemon-reload && systemctl enable docker && systemctl restart docker
登錄后册烈,賬號(hào)信息都保存到本機(jī)的~/.docker/config.json
owen@swarm-manager-105:~/gitee/vnote_notebooks$ docker login 192.168.31.107
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /home/owen/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
owen@swarm-manager-105:~/gitee/vnote_notebooks$ cat ~/.docker/config.json
{
"auths": {
"192.168.31.107": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.14 (linux)"
}