在上一篇文章中院领,Jenkins在項目構(gòu)建完成之后双絮,將最終生成的docker鏡像推送到阿里云上浴麻,但在有些情況下,比如公司政策或出于安全的考慮囤攀,并不希望將鏡像交由外部的網(wǎng)絡(luò)软免,只允許在公司內(nèi)網(wǎng)中訪問,那這時可以使用Harbor來解決這個問題焚挠。本文將通過部署Harbor來存儲Jenkins最終生成的docker鏡像膏萧。
1、Harbor簡介
Harbor是一個用于存儲和分發(fā)Docker鏡像的企業(yè)級Registry服務(wù)器蝌衔,通過添加一些企業(yè)必需的功能特性榛泛,例如安全、標(biāo)識和管理等噩斟,擴展了開源Docker Distribution曹锨。作為一個企業(yè)級私有Registry服務(wù)器,Harbor提供了更好的性能和安全剃允。提升用戶使用Registry構(gòu)建和運行環(huán)境傳輸鏡像的效率艘希。Harbor支持安裝在多個Registry節(jié)點的鏡像資源復(fù)制硼身,鏡像全部保存在私有Registry中, 確保數(shù)據(jù)和知識產(chǎn)權(quán)在公司內(nèi)部網(wǎng)絡(luò)中管控覆享。另外佳遂,Harbor也提供了高級的安全特性,諸如用戶管理撒顿,訪問控制和活動審計等丑罪。其擁有如下的特點:
- 基于角色的訪問控制:用戶與Docker鏡像倉庫通過“項目”進行組織管理,一個用戶可以對多個鏡像倉庫在同一命名空間(project)里有不同的權(quán)限凤壁。
- 鏡像復(fù)制:鏡像可以在多個Registry實例中復(fù)制(同步)吩屹。尤其適合于負(fù)載均衡,高可用拧抖,混合云和多云的場景煤搜。
- 圖形化用戶界面:用戶可以通過瀏覽器來瀏覽,檢索當(dāng)前Docker鏡像倉庫唧席,管理項目和命名空間擦盾。
- AD/LDAP支持:Harbor可以集成企業(yè)內(nèi)部已有的AD/LDAP,用于鑒權(quán)認(rèn)證管理淌哟。
- 審計管理:所有針對鏡像倉庫的操作都可以被記錄追溯迹卢,用于審計管理。
- 國際化:已擁有英文徒仓、中文腐碱、德文、日文和俄文的本地化版本掉弛。更多的語言會添加進來症见。
- RESTful API RESTful API:提供給管理員對于Harbor更多的操控, 使得與其它管理軟件集成變得更容易。
- 部署簡單:docker-compose和離線安裝殃饿。
2谋作、安裝
Harbor的安裝支持離線和在線安裝,同時也可以通過helm在k8s集群中進行安裝壁晒,這里采用在線安裝的方式瓷们。
2.1 準(zhǔn)備
- 硬件
新建一臺虛擬機业栅,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文件
最終將新建的虛擬機的域名設(shè)置為:harbor.tlh.com
-
添加域名映射(需要訪問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
-
生成證書前面請求
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進程解析.crt文件作為CA證書帮孔,將.cert文件作為客戶端證書雷滋。-
生成CA
openssl x509 -inform PEM -in harbor.tlh.com.crt -out harbor.tlh.com.cert
-
復(fù)制文件:每個需要鏈接到Harbor的都需要進行如下操作
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
下載在線安裝文件
通過這個鏈接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ù)存儲的路徑 data_volume: /data
-
安裝
-
執(zhí)行準(zhǔn)備安裝腳本
./prepare
-
執(zhí)行安裝
./install.sh
-
可選插件
Notary:內(nèi)容信任,對push到倉庫的數(shù)據(jù)進行簽名
Clair:鏡像(appc和docker)缺陷靜態(tài)掃描工具
-
Chart倉庫
# 攜帶安裝notary兔辅、Clair和chart ./install.sh --with-notary --with-clair --with-chartmuseum
-
3. 使用
-
瀏覽器訪問:https://harbor.tlh.com/腊敲,用戶名:admin 密碼:Harbor12345
創(chuàng)建用戶
進入主界面之后,在用戶管理中新建一個用戶名為:jenkins 密碼為:Jenkins!23的用戶维苔,作為docker客戶端登陸harbor使用的賬戶碰辅。-
創(chuàng)建項目
在項目管理界面創(chuàng)建項目名為:tlhhup的項目,容量設(shè)置為不限制介时。
添加用戶
將2中添加的用戶添加到該項目的成員中没宾。-
推送鏡像
docker login reg.yourdomain.com docker push reg.yourdomain.com/myproject/myrepo:mytag
4. Jenkins中使用
新建一個id為harbor的憑證,具體方式查看上一篇文章的配置
-
修改tlhhup項目的配置潮尝,將docker倉庫的地址修改為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é)果
-