一、 實(shí)驗(yàn)背景
docker中要使用鏡像,一般會(huì)從本地、docker Hup公共倉(cāng)庫和其它第三方公共倉(cāng)庫中下載鏡像,一般出于安全和外網(wǎng)(墻)資源下載速率的原因考慮企業(yè)級(jí)上不會(huì)輕易使用。
那么有沒有一種辦法可以存儲(chǔ)自己的鏡像又有安全認(rèn)證的倉(cāng)庫呢??
?企業(yè)級(jí)環(huán)境中基于Harbor搭建自己的安全認(rèn)證倉(cāng)庫。
Harbor是VMware公司最近開源的企業(yè)級(jí)Docker Registry項(xiàng)目, 其目標(biāo)是幫助用戶迅速搭建一個(gè)企業(yè)級(jí)的Docker registry服務(wù)。
*提供了管理UI
*基于角色的訪問控制(Role Based Access Control)
*AD/LDAP集成
*審計(jì)日志(Audit logging)
*原生支持中文
二、 相關(guān)介紹
Harbor在架構(gòu)上主要由五個(gè)組件構(gòu)成:
*Proxy:Harbor的registry, UI, token等服務(wù),通過一個(gè)前置的反向代理統(tǒng)一接收瀏覽器、Docker客戶端的請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)給后端不同的服務(wù)。
*Registry: 負(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)證。
*Core services: 這是Harbor的核心功能,主要提供以下服務(wù):
*UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 并對(duì)用戶進(jìn)行授權(quán)。
*webhook:為了及時(shí)獲取registry 上image狀態(tài)變化的情況, 在Registry上配置webhook,把狀態(tài)變化傳遞給UI模塊。
*token 服務(wù):負(fù)責(zé)根據(jù)用戶權(quán)限給每個(gè)docker push/pull命令簽發(fā)token. Docker 客戶端向Registry服務(wù)發(fā)起的請(qǐng)求,如果不包含token,會(huì)被重定向到這里,獲得token后再重新向Registry進(jìn)行請(qǐng)求。
*Database:為core services提供數(shù)據(jù)庫服務(wù),負(fù)責(zé)儲(chǔ)存用戶權(quán)限、審計(jì)日志、Docker image分組信息等數(shù)據(jù)。
*Log collector:為了幫助監(jiān)控Harbor運(yùn)行,負(fù)責(zé)收集其他組件的log,供日后進(jìn)行分析。
各個(gè)組件之間的關(guān)系如下圖所示:

Harbor的每個(gè)組件都是以Docker容器的形式構(gòu)建的,所以使用Docker Compose來對(duì)它進(jìn)行部署。
用于部署Harbor的Docker Compose 模板位于 /Deployer/docker-compose.yml. 打開這個(gè)模板文件,會(huì)發(fā)現(xiàn)Harbor由5個(gè)容器組成:
*proxy: 由Nginx 服務(wù)器構(gòu)成的反向代理。
*registry:由Docker官方的開源registry 鏡像構(gòu)成的容器實(shí)例。
*ui: 即架構(gòu)中的core services, 構(gòu)成此容器的代碼是Harbor項(xiàng)目的主體。
*mysql: 由官方MySql鏡像構(gòu)成的數(shù)據(jù)庫容器。
*log: 運(yùn)行著rsyslogd的容器,通過log-driver的形式收集其他容器的日志。
這幾個(gè)容器通過Docker link的形式連接在一起,這樣,在容器之間可以通過容器名字互相訪問。對(duì)終端用戶而言,只需要暴露proxy (即Nginx)的服務(wù)端口。
Harbor的認(rèn)證流程

A、首先,請(qǐng)求被代理容器監(jiān)聽攔截,并跳轉(zhuǎn)到指定的認(rèn)證服務(wù)器。
B、如果認(rèn)證服務(wù)器配置了權(quán)限認(rèn)證,則會(huì)返回401。通知dockerclient在特定的請(qǐng)求中需要帶上一個(gè)合法的token。而認(rèn)證的邏輯地址則指向架構(gòu)圖中的core services。
C、 當(dāng)docker client接受到錯(cuò)誤code。client就會(huì)發(fā)送認(rèn)證請(qǐng)求(帶有用戶名和密碼)到coreservices進(jìn)行basic auth認(rèn)證。
D、 當(dāng)C的請(qǐng)求發(fā)送給ngnix以后,ngnix會(huì)根據(jù)配置的認(rèn)證地址將帶有用戶名和密碼的請(qǐng)求發(fā)送到core serivces。
E、 coreservices獲取用戶名和密碼以后對(duì)用戶信息進(jìn)行認(rèn)證(自己的數(shù)據(jù)庫或者介入LDAP都可以)。成功以后,返回認(rèn)證成功的信息。
Harbor的安裝方式
*在線online安裝 ?--> 由于國(guó)內(nèi)墻和網(wǎng)速率的原因,體驗(yàn)不好
*離線offline安裝 ?--> 下載包較大 [ 包含了相關(guān)依賴鏡像 ],從官網(wǎng)下載效果不理想
三、實(shí)驗(yàn)準(zhǔn)備
操作系統(tǒng): CentOS7.3 Minimal
HarborServer:192.168.1.102
Client(docker):192.168.1.109
harbor-offline-installer-v1.1.1.tgz
百度云:https://pan.baidu.com/s/1o7LC2d8
Harbor 主機(jī)
IP:192.168.1.102
Hostname:www.michael.com
# cat /etc/hosts
192.168.1.102 www.michael.com
docker主機(jī)(用來實(shí)驗(yàn)向Harbor registry拉取和推送鏡像)
IP:192.168.1.109
四、搭建CA,創(chuàng)建相關(guān)證書
在Harbor 主機(jī):
1.搭建CA,實(shí)現(xiàn)加密傳輸
安裝openssl相關(guān)包
# yum?-y?install pcre pcre-devel zlib-devel openssl openssl-devel
2.創(chuàng)建證書
創(chuàng)建證書存放目錄
# mkdir -p /data/cert
# cd /data/cert/
3.創(chuàng)建 CA 根證書
#openssl req? -newkey rsa:4096 \
> -nodes -sha256 -keyout ca.key -x509 -days 365 \
> -out ca.crt -subj "/C=CN/L=Shenzhen/O=Harbor/CN=www.harbor.com"
# ?ls
ca.crt ? ?ca.key
4.生成證書簽名, 設(shè)置訪問域名為 www.michael.com
openssl req -newkey rsa:4096 \
> -nodes -sha256 -keyout www.michael.com.key \
> -out www.michael.com.csr -subj "/C=CN/L=Shenzhen/O=XXX/CN=www.michael.com"
# ls
ca.crt? ca.key?www.michael.com.csr? www.michael.com.key
5.生成主機(jī)的證書
# openssl x509 -req -days 365 -in www.michael.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.michael.com.crt
Signature ok
subject=/C=CN/L=Shenzhen/O=XXX/CN=www.michael.com
Getting CA Private Key
# ls
ca.crt??
ca.key??
ca.srl?
www.michael.com.crt
www.michael.com.key
www.michael.com.csr??
五、Harbor安裝部署
在Harbor 主機(jī):
1.安裝docker?
# yum ?-y install docker?
# systemctl start ?docker.service
# systemctl enable docker.service
2.安裝 docker-compose
# ?yum -y ?install python-setuptools
# easy_install pip?
# ?pip?install?docker-compose
# ?pip?install backports.ssl_match_hostname
3.將 harbor-offline-installer-v1.1.1.tgz 上傳至 /root
# tar zxf? harbor-offline-installer-v1.1.1.tgz
# cd harbor
4.修改habor配置文件 ? harbor.cfg?
# vim? harbor.cfg
hostname= www.michael.com ? ? ? # 指定私有倉(cāng)庫的主機(jī)名,可以是IP地址,也可以是域名
ui_url_protocol?=?https ? ? ? ? ? ? ? ? ? #?用戶訪問私倉(cāng)時(shí)使用的協(xié)議,默認(rèn)時(shí)http,配置成https
db_password?=?root123 ? ? ? ? ? ? ? ? #?指定mysql數(shù)據(jù)庫管理員密碼
harbor_admin_password:Harbor12345 ? ? ? ? ? ? ?#?harbor的管理員賬戶密碼
ssl_cert?=/data/cert/www.michael.com.crt ? ? ? ? ? ? ?#?設(shè)置證書文件路徑
ssl_cert_key?=/data/cert/www.michael.com.key ? ? ?#?設(shè)置證書密鑰文件路徑
5.執(zhí)行自帶腳本一鍵安裝
# ./install.sh


6.WEB訪問
https://192.168.1.102
https://www.michael.com

默認(rèn)用戶名:admin
默認(rèn)密碼:Harbor12345?
?[可通過安裝前 harbor.cfg 配置文件修改?harbor_admin_password?指定 ]

*通過 admin 賬戶登陸創(chuàng)建 test 用戶?
*退出 admin 賬戶登陸 test 用戶
*創(chuàng)建 test 項(xiàng)目, 訪問級(jí)別選擇公開

六、客戶端(docker機(jī))測(cè)試
在 docker機(jī):
1.安裝docker
# yum -y isntall docker
2.創(chuàng)建倉(cāng)庫證書存放目錄
# mkdir /etc/docker/certs.d/www.michael.com
3.從harbor服務(wù)器獲取證書至倉(cāng)庫證書目錄
# scp root@192.168.1.102:/data/cert/ca.crt /etc/docker/certs.d/www.michael.com/ca.crt
# update-ca-trust
# systemctl restart docker
4.添加 192.168.1.102(www.michael.com)域名解析
# vim ? /etc/hosts
192.168.1.102 www.michael.com
5. 用戶登陸
# docker login? www.michael.com? -u admin ?-p? "XXX"
# docker login ?www.michael.com ?-u test ? ? ?-p ? "XXX"

# docker pull ubuntu:14.04
# docker tag ubuntu:17.04? www.michael.com/test/ubuntu:17.04
# docker push www.michael.com/test/ubuntu:17.04


關(guān)于倉(cāng)庫、用戶的 push 和pull權(quán)限控制,請(qǐng)上官網(wǎng)查看相關(guān)教程
七、關(guān)于停止和啟動(dòng) Harbor(修改配置文件需重啟)
在 Harbor 機(jī):



# docker-compose? -f? /root/harbor/docker-compose.yml ?down
# ?docker-compose? -f? /root/harbor/docker-compose.yml ?up ?-d
八、參考
企業(yè)級(jí)Registry開源項(xiàng)目Harbor
http://dockone.io/article/1179;
http://www.cnblogs.com/jicki/p/5737369.html
http://www.jiagoumi.com/work/1221.html
Docker實(shí)踐:使用Harbor搭建Docker私有倉(cāng)庫
http://www.jiagoumi.com/work/1221.html
http://www.jiagoumi.com/category/work
企業(yè)級(jí)Docker Registry開源工具Harbor的介紹以及使用指南
https://my.oschina.net/xxbAndy/blog/786712
Docker Harbor registry(http)私有倉(cāng)庫搭建
http://lisea.blog.51cto.com/5491873/1934750
Docker Harbor registry(https)安全認(rèn)證搭建
https://github.com/vmware/harbor
https://github.com/vmware/harbor/blob/master/docs/installation_guide.md