小貼士
Harbor是由VMware團隊為企業(yè)用戶設(shè)計的Registry?Server開源項目,用戶可以利用Harbor搭建自己的私有鏡像倉庫。在我們睿云智合(Wise2C)企業(yè)級容器云解決方案中默認使用Harbor做為私有鏡像倉庫,目前已在國內(nèi)多家金融行業(yè)企業(yè)生產(chǎn)環(huán)境使用。即使你是harbor小白,也可以從本文快速從認識Harbor到利用Harbor搭建自己的企業(yè)級registry server。
Harbor特性
? 基于角色控制
用戶和倉庫都是基于項目進行組織的, 而用戶基于項目可以擁有不同的權(quán)限。
? 基于鏡像的復(fù)制策略
鏡像可以在多個Harbor實例之間進行復(fù)制。
? 支持LDAP
Harbor的用戶授權(quán)可以使用已經(jīng)存在LDAP用戶。
? 鏡像刪除?& 垃圾回收
Image可以被刪除并且回收Image占用的空間。
? 用戶UI
用戶可以輕松的瀏覽、搜索鏡像倉庫以及對項目進行管理。
? 鏡像刪除?& 垃圾回收
絕大部分的用戶操作API, 方便用戶對系統(tǒng)進行擴展。
? 輕松的部署功能
Harbor提供了online、offline安裝,除此之外還提供了virtual appliance安裝。
Harbor和docker registry關(guān)系
Harbor實質(zhì)上是對docker registry做了封裝,擴展了自己的業(yè)務(wù)模塊.下面展示一下docker registry和Harbor的架構(gòu)圖用以說明。
Harbor認證過程
1、docker daemon從docker registry拉取鏡像。
2、如果docker registry需要進行授權(quán)時,registry將會返回401 Unauthorized響應(yīng),同時在響應(yīng)中包含了docker client如何進行認證的信息。
3、docker client根據(jù)registry返回的信息,向auth server發(fā)送請求獲取認證token。
4、auth server則根據(jù)自己的業(yè)務(wù)實現(xiàn)去驗證提交的用戶信息是否存符合業(yè)務(wù)要求。
5、用戶數(shù)據(jù)倉庫返回用戶的相關(guān)信息。
6、auth server將會根據(jù)查詢的用戶信息,生成token令牌,以及當(dāng)前用戶所具有的相關(guān)權(quán)限信息?。上述就是完整的授權(quán)過程.當(dāng)用戶完成上述過程以后便可以執(zhí)行相關(guān)的pull push操作。認證信息會每次都帶在請求頭中。
Harbor整體架構(gòu)
Harbor認證流程
A、首先,請求被代理容器監(jiān)聽攔截,并跳轉(zhuǎn)到指定的認證服務(wù)器。
B、?如果認證服務(wù)器配置了權(quán)限認證,則會返回401。通知docker client在特定的請求中需要帶上一個合法的token。而認證的邏輯地址則指向架構(gòu)圖中的core services。
C、?當(dāng)docker client接受到錯誤code。client就會發(fā)送認證請求(帶有用戶名和密碼)到core services進行basic auth認證。
D、?當(dāng)C的請求發(fā)送給ngnix以后,ngnix會根據(jù)配置的認證地址將帶有用戶名和密碼的請求發(fā)送到core serivces。
E、?core services獲取用戶名和密碼以后對用戶信息進行認證(自己的數(shù)據(jù)庫或者介入LDAP都可以)。成功以后,返回認證成功的信息。
從上面的docker registry 和?Harbor的架構(gòu)圖、流程圖可以看出Harbor的擴展部分為core services。這部分實現(xiàn)了用戶的認證, 添加了UI模塊已經(jīng)webhook。
Harbor安裝
Harbor安裝有三種方式,這里以online的方式為例,另外兩種有興趣的童鞋可以參考Harbor的官方文檔。
Harbor的安裝
1、下載安裝包
2、配置harbor.cfg文件
3、執(zhí)行install.sh腳本安裝并啟動Harbor
用戶可以到release頁下載相關(guān)文件,解壓tar xvf harbor-online-installer-<version>.tgz。
?Harbor配置
- hostname 運行Harbor的主機地址(域名或者IP地址
不能是localhost or 127.0.0.1。
- ui_url_protocol url協(xié)議(http或者htpps)
https配置可以參考?Configuring Harbor with ? ? ?HTTPS Access。
- Email設(shè)定
配置的郵件可以用戶Harbor進行密碼重置處理。
e.g:
email_server =smtp.mydomain.com
email_server_port = 25
email_username=ample_admin@mydomain.com
email_password = abc
email_from = admin sample_admin@mydomain.com
email_ssl = false
- harbor_admin_password
admin初始化密碼。
- auth_mode
認證方式,默認為db_auth。也可以使用ldap_auth 由于參數(shù)太多就不一一列舉了
- Harbor安裝手冊講的很清楚。
Storage配置
默認情況下,Harbor是把鏡像存儲在本地文件系統(tǒng)中的。但是在生成環(huán)境中你可能會考慮到使用其他的存儲方案來代替本地存儲。比如S3、Openstack Swift、Ceph等等。那么這個時候你就需要更改templates/registry/config.yml中的存儲配置部分。例如:
storage:
swift:
username: admin
password: ADMIN_PASS
authurl: http://keystone_addr:35357/v3/auth
tenant: admin
domain: default
region: regionOne
container: docker_images
詳細配置可以參考Registry Configuration Reference
完成安裝并啟動
sudo ./install.sh
登錄并創(chuàng)建自己的首個倉庫試試(初始用戶名/密碼?admin/Harbor12345)
$docker login reg.yourdomain.com
$dockerpushreg.yourdomain.com/myproject/myrepo:mytag
Harbor的生命周期管理?你可以使用docker-compose來管理Harbor的生命周期,下面列舉一些有用的常用的命令。
Stop Harbor:
$ sudo docker-compose stop
Stopping harbor_proxy_1 … done
Stopping harbor_ui_1 … done
Stopping harbor_registry_1 … done
Stopping harbor_mysql_1 … done
Stopping harbor_log_1 … done
Stopping harbor_jobservice_1 … done
Restart Harbor after stopping:
$ sudo docker-compose start
Starting harbor_log_1
Starting harbor_mysql_1
Starting harbor_registry_1
Starting harbor_ui_1
Starting harbor_proxy_1
Starting harbor_jobservice_1
移除docker container 但是保留相關(guān)鏡像文件
sudo docker-compose rm
Going to remove harbor_proxy_1, harbor_ui_1, harbor_registry_1, harbor_mysql_1, harbor_log_1, harbor_jobservice_1
Are you sure? [yN] y
Removing harbor_proxy_1 … done
Removing harbor_ui_1 … done
Removing harbor_registry_1 … done
Removing harbor_mysql_1 … done
Removing harbor_log_1 … done
Removing harbor_jobservice_1 … done
詳細信息可以參考Docker Compose command-line reference
- 持久化data和日志文件默認情況下data是被存儲在Harbor host機的/data目錄.不管harbor container是刪除還是重新創(chuàng)建這里的數(shù)據(jù)都是一致存在的。另外harbor的日志文件默認情況下是存在/var/log/harbor/目錄下的。
- 自定義ngnix監(jiān)聽端口修改docker-compose.yml文件。
1、替換80端口為任意存在未被占用的端口?e.g 8899
proxy:
image: library/nginx:1.11.5
restart: always
volumes:
– ./config/nginx:/etc/nginx
ports:
– 8899:80
– 443:443
depends_on:
– mysql
– registry
– ui
– log
logging:
driver: “syslog”
options:
syslog-address: “tcp://127.0.0.1:1514”
tag: “proxy”
2、修改templates/registry/config.yml文件
auth:
token:
issuer: registry-token-issuer
realm: $ui_url:8899/service/token
rootcertbundle: /etc/registry/root.crt
service: token-service
3、運行install.sh來更新并啟動Harbor
$ sudo docker-compose down
$ sudo install.sh
HTTPS 協(xié)議的修改和自定義監(jiān)聽端口修改一樣的操作
有興趣的童鞋如果想深入研究的話還可以參考下面的鏈接
- Harbor API Specs by Swagger
- Internationalization Guide
- Python SDK
- Harbor CLI
- Configuring Harbor as a local registry mirror