【Harbor學(xué)習(xí)筆記】-教你快速搭建Docker私有倉(cāng)庫(kù)
Docker容器應(yīng)用的開(kāi)發(fā)和運(yùn)行離不開(kāi)可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉(cāng)庫(kù),但是從安全和效率等方面考慮,部署我們私有環(huán)境內(nèi)的Registry也是非常必要的。Harbor 是由VMware公司開(kāi)源的企業(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公司開(kāi)源的registry為基礎(chǔ),額外提供了如下功能:
- 基于角色的訪問(wèn)控制(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來(lái)進(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訪問(wèn)和鏡像上傳和下載流量; Harbor的registry,UI,token等服務(wù),通過(guò)一個(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)行訪問(wèn)控制,即不同用戶對(duì)Docker image有不同的讀寫(xiě)權(quán)限,Registry會(huì)指向一個(gè)token服務(wù),強(qiáng)制用戶的每次docker pull/push請(qǐng)求都要攜帶一個(gè)合法的token, Registry會(huì)通過(guò)公鑰對(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ù)。-通過(guò)深藍(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。通過(guò)紫色線標(biāo)識(shí)
-
Adminserver:是系統(tǒng)的配置管理中心附帶檢查存儲(chǔ)用量,ui和jobserver啟動(dòng)時(shí)候回需要加載adminserver的配置。通過(guò)灰色線標(biāo)識(shí);
-
Registry:鏡像倉(cāng)庫(kù),負(fù)責(zé)存儲(chǔ)鏡像文件。當(dāng)鏡像上傳完畢后通過(guò)hook通知ui創(chuàng)建repository,上圖通過(guò)紅色線標(biāo)識(shí),當(dāng)然registry的token認(rèn)證也是通過(guò)ui組件完成。通過(guò)紅色線標(biāo)識(shí)
-
Log:為了幫助監(jiān)控Harbor運(yùn)行,負(fù)責(zé)收集其他組件的log,供日后進(jìn)行分析。過(guò)docker的log-driver把日志匯總到一起,通過(guò)淺藍(lán)色線條標(biāo)識(shí)

安裝
1. 下載離線安裝包
-
Harbor以容器的形式進(jìn)行部署, 因此可以被部署到任何支持Docker的Linux發(fā)行版, 要使用Harbor,需要安裝docker和docker-compose編排工具
-
訪問(wèn)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è)鏡像下來(lái),及檢查環(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).
-
如果安裝一切順利,通過(guò)之前在harbor.cfg配置的hostname即可以訪問(wèn)到前端了.
安裝配置問(wèn)題
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
問(wèn)題-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
問(wèn)題-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版本開(kāi)始默認(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證書(shū))
-
如果系統(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/ 沒(méi)有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)"
}
問(wèn)題-3 防止容器進(jìn)程沒(méi)有權(quán)限讀取生成的配置


浙公網(wǎng)安備 33010602011771號(hào)