在上一篇文章中,Jenkins在項(xiàng)目構(gòu)建完成之后,將最終生成的docker鏡像推送到阿里云上,但在有些情況下,比如公司政策或出于安全的考慮,并不希望將鏡像交由外部的網(wǎng)絡(luò),只允許在公司內(nèi)網(wǎng)中訪問(wèn),那這時(shí)可以使用Harbor來(lái)解決這個(gè)問(wèn)題。本文將通過(guò)部署Harbor來(lái)存儲(chǔ)Jenkins最終生成的docker鏡像。
1、Harbor簡(jiǎn)介
Harbor是一個(gè)用于存儲(chǔ)和分發(fā)Docker鏡像的企業(yè)級(jí)Registry服務(wù)器,通過(guò)添加一些企業(yè)必需的功能特性,例如安全、標(biāo)識(shí)和管理等,擴(kuò)展了開源Docker Distribution。作為一個(gè)企業(yè)級(jí)私有Registry服務(wù)器,Harbor提供了更好的性能和安全。提升用戶使用Registry構(gòu)建和運(yùn)行環(huán)境傳輸鏡像的效率。Harbor支持安裝在多個(gè)Registry節(jié)點(diǎn)的鏡像資源復(fù)制,鏡像全部保存在私有Registry中, 確保數(shù)據(jù)和知識(shí)產(chǎn)權(quán)在公司內(nèi)部網(wǎng)絡(luò)中管控。另外,Harbor也提供了高級(jí)的安全特性,諸如用戶管理,訪問(wèn)控制和活動(dòng)審計(jì)等。其擁有如下的特點(diǎn):
- 基于角色的訪問(wèn)控制:用戶與Docker鏡像倉(cāng)庫(kù)通過(guò)“項(xiàng)目”進(jìn)行組織管理,一個(gè)用戶可以對(duì)多個(gè)鏡像倉(cāng)庫(kù)在同一命名空間(project)里有不同的權(quán)限。
- 鏡像復(fù)制:鏡像可以在多個(gè)Registry實(shí)例中復(fù)制(同步)。尤其適合于負(fù)載均衡,高可用,混合云和多云的場(chǎng)景。
- 圖形化用戶界面:用戶可以通過(guò)瀏覽器來(lái)瀏覽,檢索當(dāng)前Docker鏡像倉(cāng)庫(kù),管理項(xiàng)目和命名空間。
- AD/LDAP支持:Harbor可以集成企業(yè)內(nèi)部已有的AD/LDAP,用于鑒權(quán)認(rèn)證管理。
- 審計(jì)管理:所有針對(duì)鏡像倉(cāng)庫(kù)的操作都可以被記錄追溯,用于審計(jì)管理。
- 國(guó)際化:已擁有英文、中文、德文、日文和俄文的本地化版本。更多的語(yǔ)言會(huì)添加進(jìn)來(lái)。
- RESTful API RESTful API:提供給管理員對(duì)于Harbor更多的操控, 使得與其它管理軟件集成變得更容易。
- 部署簡(jiǎn)單:docker-compose和離線安裝。
2、安裝
Harbor的安裝支持離線和在線安裝,同時(shí)也可以通過(guò)helm在k8s集群中進(jìn)行安裝,這里采用在線安裝的方式。
2.1 準(zhǔn)備
- 硬件
新建一臺(tái)虛擬機(jī),CPU 2核 內(nèi)存 4G 硬盤20+100(掛載到/data目錄)G - 軟件
docker:19.03.2
docker-compose:1.24.1
openssl:用于生成harbor的證書和key - 網(wǎng)絡(luò)端口
由于是在內(nèi)網(wǎng)中所以可以考慮關(guān)閉防火墻,但至少必須保證以下端口是開放的:
443:harbor門戶和核心api使用的接口,使用https協(xié)議
4443:連接到Harbor的Docker內(nèi)容信任服務(wù)
80:harbor門戶和核心api使用的接口,使用http協(xié)議 - 域名和hosts文件
最終將新建的虛擬機(jī)的域名設(shè)置為:harbor.tlh.com
-
添加域名映射(需要訪問(wèn)harbor的都需要配置)
echo "192.168.241.145 harbor.tlh.com" >> /etc/hosts
2.2 生成證書
-
創(chuàng)建文件夾,存放所有的生成文件
mkdir ssl cd ssl -
獲取證書授權(quán)
openssl genrsa -out ca.key 4096 # 設(shè)置證書的信息 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.tlh.com" \ -key ca.key \ -out ca.crt -
創(chuàng)建私鑰key
openssl genrsa -out harbor.tlh.com.key 4096 -
生成證書前面請(qǐng)求
openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.tlh.com" \ -key harbor.tlh.com.key \ -out harbor.tlh.com.csr -
生成證書
cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=harbor.tlh.com DNS.2=harbor.tlh DNS.3=harbor EOF # 生成證書 openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in harbor.tlh.com.csr \ -out harbor.tlh.com.crt
2.3 部署安裝
-
配置Harbor的證書和key
mkdir /data/cert cp harbor.tlh.com.crt /data/cert/ cp harbor.tlh.com.key /data/cert/ -
配置docker的證書、key和CA
Docker進(jìn)程解析.crt文件作為CA證書,將.cert文件作為客戶端證書。-
生成CA
openssl x509 -inform PEM -in harbor.tlh.com.crt -out harbor.tlh.com.cert -
復(fù)制文件:每個(gè)需要鏈接到Harbor的都需要進(jìn)行如下操作
mkdir -p /etc/docker/certs.d/harbor.tlh.com # 復(fù)制文件 cp harbor.tlh.com.cert /etc/docker/certs.d/harbor.tlh.com/ cp harbor.tlh.com.key /etc/docker/certs.d/harbor.tlh.com/ cp ca.crt /etc/docker/certs.d/harbor.tlh.com/
-
-
配置Harbor
下載在線安裝文件
通過(guò)這個(gè)鏈接https://github.com/goharbor/harbor/releases,下載需要安裝的在線安裝包,這里選擇:v1.9.3-
解壓
tar xvf harbor-online-installer-version.tgz -
修改配置文件
在解壓之后的文件夾中,修改harbor.yml文件,該文件中所有必填的數(shù)據(jù)都是沒有被注釋的,這里主要修改hostname和https的配置:hostname: harbor.tlh.com # https related config https: # https port for harbor, default is 443 port: 443 # The path of cert and key files for nginx,配置證書和私鑰的路徑 certificate: /data/cert/harbor.tlh.com.crt private_key: /data/cert/harbor.tlh.com.key # The default data volume,設(shè)置數(shù)據(jù)存儲(chǔ)的路徑 data_volume: /data
-
安裝
-
執(zhí)行準(zhǔn)備安裝腳本
./prepare -
執(zhí)行安裝
./install.sh -
可選插件
Notary:內(nèi)容信任,對(duì)push到倉(cāng)庫(kù)的數(shù)據(jù)進(jìn)行簽名
Clair:鏡像(appc和docker)缺陷靜態(tài)掃描工具
-
Chart倉(cāng)庫(kù)
# 攜帶安裝notary、Clair和chart ./install.sh --with-notary --with-clair --with-chartmuseum
-
3. 使用
-
瀏覽器訪問(wèn):https://harbor.tlh.com/,用戶名:admin 密碼:Harbor12345
創(chuàng)建用戶
進(jìn)入主界面之后,在用戶管理中新建一個(gè)用戶名為:jenkins 密碼為:Jenkins!23的用戶,作為docker客戶端登陸harbor使用的賬戶。-
創(chuàng)建項(xiàng)目
在項(xiàng)目管理界面創(chuàng)建項(xiàng)目名為:tlhhup的項(xiàng)目,容量設(shè)置為不限制。
添加用戶
將2中添加的用戶添加到該項(xiàng)目的成員中。-
推送鏡像
docker login reg.yourdomain.com docker push reg.yourdomain.com/myproject/myrepo:mytag
4. Jenkins中使用
新建一個(gè)id為harbor的憑證,具體方式查看上一篇文章的配置
-
修改tlhhup項(xiàng)目的配置,將docker倉(cāng)庫(kù)的地址修改為harbor的地址
stage('Build Docker Image'){ container('docker'){ sh ''' mkdir context cp target/tlhhup-1.0-SNAPSHOT.jar context cp doc/Dockerfile context ''' sh 'docker build -t harbor.tlh.com/tlhhup/jks:${BUILD_NUMBER} context' } } stage('Push Docker Image'){ container('docker'){ sh 'echo Push Docker Image' withCredentials([usernamePassword(credentialsId: 'harbor', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) { sh ''' docker login harbor.tlh.com -u ${dockerHubUser} -p ${dockerHubPassword} docker push harbor.tlh.com/tlhhup/jks:${BUILD_NUMBER} ''' } } } -
構(gòu)建
-
Jenkins結(jié)果
-
harbor結(jié)果
-



