一、harbor簡介
1、簡介
harbor是一個用于存儲和分發docker鏡像的企業級registry伺服器,通過添加一些企業必需的功能特性,例如安全、辨別和管理等,擴充了開源docker distribution。作為一個企業級私有registry伺服器,harbor提供了更好的性能和安全。提升使用者使用registry建構和運作環境傳輸鏡像的效率。harbor支援安裝在多個registry節點的鏡像資源複制,鏡像全部儲存在私有registry中, 確定資料和知識産權在公司内部網絡中管控。另外,harbor也提供了進階的安全特性,諸如使用者管理,通路控制和活動審計等。
2、特性
(1)基于角色的通路控制 :使用者與docker鏡像倉庫通過“項目”進行組織管理,一個使用者可以對多個鏡像倉庫在同一命名空間(project)裡有不同的權限。
(2)鏡像複制 : 鏡像可以在多個registry執行個體中複制(同步)。尤其适合于負載均衡,高可用,混合雲和多雲的場景。
(3)圖形化使用者界面 : 使用者可以通過浏覽器來浏覽,檢索目前docker鏡像倉庫,管理項目和命名空間。
(4)ad/ldap 支援 : harbor可以內建企業内部已有的ad/ldap,用于鑒權認證管理。
(5)審計管理 : 所有針對鏡像倉庫的操作都可以被記錄追溯,用于審計管理。
(6)國際化 : 已擁有英文、中文、德文、日文和俄文的本地化版本。更多的語言将會添加進來。
(7)restful api : restful api 提供給管理者對于harbor更多的操控, 使得與其它管理軟體內建變得更容易。
(8)部署簡單 : 提供線上和離線兩種安裝工具, 也可以安裝到vsphere平台(ova方式)虛拟裝置。
3、元件
harbor在架構上主要由6個元件構成:
(1)proxy:harbor的registry, ui, token等服務,通過一個前置的反向代理統一接收浏覽器、docker用戶端的請求,并将請求轉發給後端不同的服務。
(2)registry: 負責儲存docker鏡像,并處理docker push/pull 指令。由于我們要對使用者進行通路控制,即不同使用者對docker image有不同的讀寫權限,registry會指向一個token服務,強制使用者的每次docker pull/push請求都要攜帶一個合法的token, registry會通過公鑰對token 進行解密驗證。
(3)core services: 這是harbor的核心功能,主要提供以下服務:
1)ui:提供圖形化界面,幫助使用者管理registry上的鏡像(image), 并對使用者進行授權。
2)webhook:為了及時擷取registry 上image狀态變化的情況, 在registry上配置webhook,把狀态變化傳遞給ui子產品。
3)token 服務:負責根據使用者權限給每個docker push/pull指令簽發token. docker 用戶端向regiøstry服務發起的請求,如果不包含token,會被重定向到這裡,獲得token後再重新向registry進行請求。
(4)database:為core services提供資料庫服務,負責儲存使用者權限、審計日志、docker image分組資訊等資料。
(5)job services:提供鏡像遠端複制功能,可以把本地鏡像同步到其他harbor執行個體中。
(6)log collector:為了幫助監控harbor運作,負責收集其他元件的log,供日後進行分析。
各個元件之間的關系如下圖所示:
4、harbor建構
harbor的每個元件都是以docker容器的形式建構的,官方也是使用docker compose來對它進行部署。用于部署harbor的docker compose模闆位于 harbor/docker-compose.yml,打開這個模闆檔案,發現harbor是由7個容器組成的;
(1)nginx:nginx負責流量轉發和安全驗證,對外提供的流量都是從nginx中轉,是以開放https的443端口,它将流量分發到後端的ui和正在docker鏡像存儲的docker registry。
(2)harbor-jobservice:harbor-jobservice 是harbor的job管理子產品,job在harbor裡面主要是為了鏡像倉庫之前同步使用的;
(3)harbor-ui:harbor-ui是web管理頁面,主要是前端的頁面和後端curd的接口;
(4)registry:registry就是docker原生的倉庫,負責儲存鏡像。
(5)harbor-adminserver:harbor-adminserver是harbor系統管理接口,可以修改系統配置以及擷取系統資訊。
(6)harbor-db:harbor-db是harbor的資料庫,這裡儲存了系統的job以及項目、人員權限管理。由于本harbor的認證也是通過資料,在生産環節大多對接到企業的ldap中;
(7)harbor-log:harbor-log是harbor的日志服務,統一管理harbor的日志。通過inspect可以看出容器統一将日志輸出的syslog。
這幾個容器通過docker link的形式連接配接在一起,這樣,在容器之間可以通過容器名字互相通路。對終端使用者而言,隻需要暴露proxy (即nginx)的服務端口。
二、環境準備
1、生産環境
<col>
名稱
版本
系統環境
centos linux release 7.5.1804 (core)
docker-ce
docker version 18.09.0
docker-compose
1.22.0
harbor
v1.6.0
安裝位置
/usr/local/harbor
2、暫時關閉防火牆和selinux
3、服務下載下傳位址:
docker源:wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
docker-compose:https://github.com/docker/compose/releases/
harbor:https://github.com/goharbor/harbor/releases
三、搭建服務
1、安裝docker-ce
#安裝
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum install docker-ce -y
#解除安裝
# yum remove docker-ce -y
解除安裝後images,containers,volumes,configuration files 是不能自動删除的,為了删除all images,containers,and volumes,請執行如下指令:
# rm -rf /var/lib/docker
2、安裝docker-compose
方法一:二進制
(1)下載下傳包
# wget https://github.com/docker/compose/releases/download/1.22.0/docker-compose-linux-x86_64
(2)安裝服務
# mv docker-compose-linux-x86_64 docker-compose
# cp docker-compose /usr/local/bin/
# chmod u+x /usr/local/bin/docker-compose
(3)根據自己的情況決定是否安裝指令補全功能
# yum install bash-completion
(4)檢視
# docker-compose
# docker-compose version
(5)解除安裝
# rm /usr/local/bin/docker-compose
方法二:pip
(1)安裝
# yum install python-pip
# pip install docker-compose
(2)解除安裝:
# pip uninstall docker-compose
3、安裝harbor
(1)下載下傳
# cd /usr/local/src/
# wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-online-installer-v1.6.0.tgz
(2)解壓檔案
# tar -xvf harbor-online-installer-v1.6.0.tgz -c /usr/local/
# cd /usr/local/harbor/
(3)修改配置檔案
# vim harbor.cfg
#域名配置
hostname = www.jiangjj.com
#郵箱配置
email_server = smtp.qq.com
email_server_port = 25
email_username = [email protected]
email_password = 123456
email_from = admin <[email protected]>
email_ssl = false
email_insecure = false
#禁止使用者注冊
self_registration = off
#設定隻有管理者可以建立項目
project_creation_restriction = adminonly
(4)執行腳本
# ./prepare
# ./install.sh
(5)檢視
# docker ps
或者
# docker-compose ps
(6)harbor的啟動和停止
啟動harbor
# docker-compose start
停止harbor
# docker-comose stop
重新開機harbor
# docker-compose restart
4、通路
在浏覽器輸入www.jiangjj.com,因為我配置的域名為www.jiangjj.com。
預設賬号密碼: admin / harbor12345 登入後修改密碼
http://www.jiangjj.com/
四、harbor配置tls證書
上面對harbor的配置都是使用的http協定通路,但是為了安全性我們工作中一般都是配置https通路。在此,做一個簡單的配置如下:
1、修改harbor配置檔案(購買證書)
ui_url_protocol = https
ssl_cert = /etc/certs/jiangjj.com.crt
ssl_cert_key = /etc/certs/jiangjj.com.key
2、建立自簽名證書key檔案
# mkdir /etc/certs
# openssl genrsa -out /etc/certs/jiangjj.com.key 2048
3、建立自簽名證書crt檔案
# openssl req -x509 -new -nodes -key /etc/certs/jiangjj.com.key -subj "/cn=www.jiangjj.com" -days 5000 -out /etc/certs/jiangjj.com.crt
4、重新安裝harbor
./install.sh
5、配置用戶端證書
# mkdir -p /etc/docker/certs.d/www.jiangjj.com
#把crt證書拷貝到建立目錄下,重新開機docker即可
6、測試
五、測試上傳下載下傳鏡像
1、在各個用戶端修改docker
# vim /usr/lib/systemd/system/docker.service
execstart=/usr/bin/dockerd --insecure-registry www.jiangjj.com
增加 --insecure-registry www.jiangjj.com 即可。
重新開機docker:
# systemctl daemon-reload
# systemctl restart docker
建立/etc/docker/daemon.json檔案,在檔案中指定倉庫位址
# cat > /etc/docker/daemon.json << eof
{ "insecure-registries":["www.jiangjj.com"] }
eof
然後重新開機docker就可以。
2、上傳鏡像
如果不是自己的鏡像需要打包
# docker tag centos:7.4.1708 www.jiangjj.com/jiangjj/centos:7.4.1708
#授權
# docker login www.jiangjj.com
#上傳
# docker push www.jiangjj.com/jiangjj/centos:7.4.1708
在harbor檢視如下圖:
3、用戶端拉去鏡像
# docker pull www.jiangjj.com/jiangjj/centos:7.4.1708
即可