參考文檔:
- harbor介紹:https://github.com/vmware/harbor
- harbor安裝&使用指導:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
- docker-compose安裝指導:https://docs.docker.com/compose/install/
- docker-compose版本:https://github.com/docker/compose/releases/
一.環境
1. os
Server:CentOS-7-x86_64-1611(CentOS 7.3)
IP:10.11.51.71
2. docker
Docker: version 1.12.6, build 78d1802
Docker-compose:version 1.16.1, build 6d1ac21
3. harbor(截止20171026)
Harbor: version 1.2.2
二.部署harbor服務
1. 部署docker-compose
#docker服務已提前部署,可參考:https://docs.docker.com/engine/installation/linux/docker-ce/centos/ #如果使用curl或wget下載較慢,可以通過其他渠道提前下載后上傳到服務器 [root@harbor ~]# curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose #賦權 [root@harbor ~]# chmod +x /usr/local/bin/docker-compose #驗證docker-compose是否部署成功 [root@harbor ~]# docker-compose --version

2. 下載harbor
#這里下載的是離線安裝文件,在線安裝文件為" harbor-online-installer-v1.2.2.tgz" [root@harbor ~]# cd /usr/local/src/ [root@harbor src]# wget https://github.com/vmware/harbor/releases/download/v1.2.2/harbor-offline-installer-v1.2.2.tgz [root@harbor src]# tar -zxvf harbor-offline-installer-v1.2.2.tgz
3. 配置harbor.cfg
[root@harbor src]# cd harbor #解壓目錄下的harbor.cfg文件即配置文件,詳細的配置項可見參考文檔:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md#configuring-harbor [root@harbor harbor]# vim harbor.cfg #設置訪問地址,可用ip,域名,不能使用127.0.0.1或localhost hostname = 10.11.51.71 #默認使用http協議訪問UI與token/notification服務;如果采用https,需要將nginx ssl設置為on,可參考:https://github.com/vmware/harbor/blob/master/docs/configure_https.md ui_url_protocol = http #mysql數據庫root用戶默認密碼root123. db_password = root123 #image復制並發量 max_job_workers = 3 #是否為token生成證書,默認為on customize_crt = on #nginx cert與key文件的路徑, 只有采用https協議是才有意義 ssl_cert = /data/cert/server.crt ssl_cert_key = /data/cert/server.key #The path of secretkey storage secretkey_path = /data #Admiral's url, comment this attribute, or set its value to NA when Harbor is standalone admiral_url = NA #未啟用calir服務,但解壓目錄下的”./prepare”文件中要檢查以下相關參數配置,不能注釋,否則環境准備檢查不能通過,報”ConfigParser.NoOptionError: No option u'clair_db_password' in section: u'configuration' ”相關錯誤;或者在”./prepare”中注釋相關檢查與定義,但需要注意,文件中的關聯太多,推薦修改“harbor.cfg”文件即可 clair_db_password = password #以下配置為option配置,只在首次啟動生效,可以登陸UI后修改 #email相關配置,均為默認配置 email_identity = email_server = smtp.mydomain.com email_server_port = 25 email_username = sample_admin@mydomain.com email_password = abc email_from = admin <sample_admin@mydomain.com> email_ssl = false #UI登陸默認密碼 harbor_admin_password = Harbor12345 ##By default the auth mode is db_auth, i.e. the credentials are stored in a local database. #Set it to ldap_auth if you want to verify a user's credentials against an LDAP server. #默認認證db_auth為本地認證,支持ladp認證 auth_mode = db_auth #ladp相關設置,雖然未采用ldap認證,但解壓目錄下的”./prepare”文件中要檢查以下相關參數配置,不能注釋,否則環境准備檢查不能通過,報”ConfigParser.NoOptionError: No option u'ldap_timeout' in section: u'configuration' ”相關錯誤;或者在”./prepare”中注釋相關檢查與定義,但需要注意,文件中的關聯太多,推薦修改“harbor.cfg”文件即可 ldap_url = ldaps://ldap.mydomain.com # ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com # ldap_search_pwd = password ldap_basedn = ou=people,dc=mydomain,dc=com # ldap_filter = (objectClass=person) ldap_uid = uid ldap_scope = 3 ldap_timeout = 5 #默認開啟自注冊 self_registration = on #token有效時間,默認30minutes token_expiration = 30 #創建項目權限控制,默認是"everyone"(所有人),可設置為"adminonly"(管理員) project_creation_restriction = everyone #與遠程registry通信時是否采用驗證ssl verify_remote_cert = on
4. 配置后端存儲(optional)
默認情況下,harbor存儲images在本地文件系統,但生產環境中會有更穩定的后端存儲代替本地文件系統。
此時需要更新harbor解壓目錄下"common/templates/registry/config.yml"文件的"storage"字段。具體修改見參考文檔:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md#configuring-storage-backend-optional
5. 安裝harbor服務
harbor服務由以下容器組件提供:
harbor-log:運行rsyslogd的日志服務,通過log-drive的形式收集其余容器的日志,映射在宿主機的/var/log/harbor/目錄;
registry:docker官方registry,負責保存鏡像;
harbor-db:harbor的數據庫,保存系統的job及項目、人員權限管理;
harbor-adminserver:harbor系統管理接口,可以修改系統配置以及獲取系統信息;
harbor_ui:harbor ui,核心服務;
harbor_jobservice:harbor的job管理模塊,主要是為了鏡像倉庫之前同步使用;
nginx:反向代理,負責流量轉發與安全驗證,對外提供的流量都是從nginx中轉,它將流量分發到后端的ui與正在docker鏡像存儲的docker registry。
#harbor解壓目錄下"install.sh"腳本會根據同目錄下的"docker-compose.yml"的定義下載鏡像並啟動服務; #鏡像下載較耗時,可提前下載備用,以免發生部署過程中鏡像不能pull的尷尬 [root@harbor harbor]# ./install.sh

#查看鏡像,另有Notary與Clair(漏洞掃描)相關的鏡像,harbor集成了這兩個服務,但默認不安裝;如果需要安裝,執行" ./install.sh --with-notary --with-calir" [root@harbor harbor]# docker images

#查看容器,可以看到沒有Notary與Clair相關服務;也可使用"docker ps"; #"docker-compose ps"需要在"docker-compose.yml"文件所在目錄執行相關操作 [root@harbor harbor]# docker-compose ps

6. 訪問harbor ui
瀏覽器訪問:http://10.11.51.71(注意iptables提前放行相關端口)。

默認用戶名/密碼:admin/Harbor12345
登陸后可見左側的模塊:項目/日志/系統管理(含用戶管理、復制管理、配置管理);右上角賬戶下有功能模塊:用戶設置/修改密碼;
非系統管理員賬號登陸時,只能看到有權限的項目與日志,其余模塊不可見。

三.簡單使用
1. 在web ui創建項目
web ui homepage—>+項目,按規范填寫項目名稱,這里級別設置"私有",即不勾選(勾選后會變為"公開");如果設置為公共倉庫,則所有人對此項目下的鏡像擁有讀權限,命令行中不需要執行"docker login"即可下載鏡像,鏡像操作與docker hub一致。


2. 為項目添加鏡像
1)登陸本地私有registry
#需要修改registry支持http登陸,默認采用https,詳見最后的問題章節 [root@harbor ~]# docker login 10.11.51.71

2)為鏡像打tag
#隨意選取1個本地鏡像打上私有registry的tag; #tag格式為:domain(ip)/project/image:version [root@harbor ~]# docker tag photon:1.0 10.11.51.71/harbor_1/photon:1.0 [root@harbor ~]# docker images

3)push鏡像到私有registry
#隨意選取1個本地鏡像打上私有registry的tag [root@harbor ~]# docker push 10.11.51.71/harbor_1/photon:1.0

上傳完畢后可登陸web ui,進入相應項目查看,如下:

3. 添加項目成員
1)創建用戶並分配權限
web ui homepage—>系統管理—>用戶管理—>+用戶

可將用戶設置為管理員,或進行刪除操作。

2)添加項目成員
web ui homepage—>項目—>harbor_1—>成員—>+成員,填寫新建的賬號並給定角色

可對成員角色進行變更或者刪除成員。

3)一般用戶賬號進行鏡像操作
#刪除本地鏡像 [root@harbor ~]# docker rmi 10.11.51.71/harbor_1/photon:1.0 Untagged: 10.11.51.71/harbor_1/photon:1.0 Untagged: 10.11.51.71/harbor_1/photon@sha256:30daf1dc09787f9d886fb3f554237ca9ba656d84590703e700f8ab740b342693 #使用一般用戶賬號登陸本地私有registry [root@harbor ~]# docker logout 10.11.51.71 Remove login credentials for 10.11.51.71 [root@harbor ~]# docker login 10.11.51.71 Username: user1 Password: Login Succeeded #下載鏡像 [root@harbor ~]# docker pull 10.11.51.71/harbor_1/photon:1.0 1.0: Pulling from harbor_1/photon Digest: sha256:30daf1dc09787f9d886fb3f554237ca9ba656d84590703e700f8ab740b342693 Status: Downloaded newer image for 10.11.51.71/harbor_1/photon:1.0

4. 同步復制(僅介紹步驟)
同步復制需要2個harbor服務,如果將10.11.51.71做主節點,則新服務器可做復制節點。
web ui homepage—>項目—>harbor_1—>復制—>+復制規則,url是目標節點的地址,用戶名/密碼使用admin賬號,勾選啟用則開始同步image。

5. 查看日志(項目中也可查看日志)
web ui homepage—>日志,操作日志按時間順序記錄。

四.管理harbor生命周期
1. 常規操作
#"docker-compose"可以對harbor服務整個生命周期進行管理; #必須在"docker-compose.yml"文件所在目錄執行相關操作 [root@harbor ~]# cd /usr/local/src/harbor [root@harbor harbor]# docker-compose stop | start | restart
2. 修改harbor.cfg的操作
#停止服務 [root@harbor ~]# cd /usr/local/src/harbor [root@harbor harbor]# docker-compose down -v #修改harbor.cfg文件 [root@harbor harbor]# vim harbor.cfg #運行prepare腳本更新配置 [root@harbor harbor]# ./prepare #重啟服務 [root@harbor harbor]# docker-compose up -d
3. 移除harbor服務容器同時保留鏡像數據/數據庫
[root@harbor harbor]# docker-compose down -v
4. 移除harbor服務容器全部數據(重新部署時采用)
#持久數據,如鏡像,數據庫等在宿主機的/data/目錄下; #日志在宿主機的/var/log/harbor/目錄下 [root@harbor harbor]# rm -r /data/database [root@harbor harbor]# rm -r /data/registry
五.Harbor mirror registry
Mirror是registry的一種特殊類型,起到類似代理服務器的緩存作用,在docker hub與client之間做鏡像的緩存。
基本工作原理:client pull 1個鏡像時,若鏡像在mirror服務器存在,則直接從mirror服務器拉取;若不存在則由mirror服務器自動代理從docker hub(可配置)中拉取鏡像,並緩存到mirror服務器中;當client再次拉取這個鏡像時,直接從mirror服務器中拉取,不需要再次從docker hub中拉取。
1. 配置mirror server
#修改在解壓目錄中”common/templates/registry/config.yml”,在最后追加“proxy”字段; #在運行“./prepare”之前做追加操作 [root@harbor ~]# cd /usr/local/src/harbor [root@harbor harbor]# vim common/config/registry/config.yml proxy: remoteurl: https://registry-1.docker.io #如果訪問私有倉庫,需要帶上docker hub(指定的倉庫)的賬號/密碼 #username: [username] #password: [password]
2. 重啟harbor服務
#不執行“./prepare” [root@harbor ~]# cd /usr/local/src/harbor [root@harbor harbor]# docker-compose stop [root@harbor harbor]# docker-compose rm -f [root@harbor harbor]# docker-compose up -d

3. 修改客戶端docker啟動參數
#修改docker啟動文件”[service]”字段 [root@test ~]# vim /usr/lib/systemd/system/docker.service [Service] EnvironmentFile=/etc/sysconfig/docker ExecStart=/usr/bin/dockerd $OPTIONS #定義啟動參數,添加“--registry-mirror”與“--insecure-registry”參數 [root@test ~]# vim /etc/sysconfig/docker OPTIONS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --registry-mirror=http://10.11.51.71 --insecure-registry 10.11.51.71" #重啟docker服務 [root@test ~]# systemctl restart docker
4. 驗證
1)client拉取鏡像
#在client服務器拉取鏡像,108Mb的nginx鏡像用時36min左右; #雖然宿主機有做加速處理,但做harbor registry的容器沒有加速,所以時間較長 [root@test ~]# date ; docker pull nginx ; date

#在client刪除nginx鏡像,再拉取1次,時間縮短到11min,證明mirror緩存生效; #效果依然不理想,但的確是生效了 [root@test ~]# docker rmi nginx [root@test ~]# date ; docker pull nginx ; date
#如下從mirror registry拉取鏡像的操作會很高效,同樣的nginx鏡像,實測在30second左右; #即使在沒有緩存的情況下效果也不錯,但此時日志中顯示操作用戶名不再是anonymous,而是前面已經登陸的賬號user1(登陸的是私有registry); #且下載的鏡像REPOSITORY也是”10.11.51.71/library/nginx”全稱的形式,而不是docker hub默認的只有鏡像名稱 [root@test ~]# docker pull 10.11.51.71/library/nginx
2)查看日志
web ui homepage—>日志,操作的是公共鏡像,所以用戶為anonymous,項目是默認的library。

3)查看harbor registry
#在harbor服務器查看 [root@harbor ~]# ll /data/registry/docker/registry/v2/repositories/library/

4)查看項目
web ui homepage—>項目—>library—>鏡像倉庫,操作的是公共鏡像,項目是默認的library。
另外發現在項目中查看緩存有延遲現象,即已生效的緩存不會立即在web ui中顯示。

六.問題
1. 本地登陸registry報錯
[root@harbor ~]# docker login 10.11.51.71 Username: admin Password: Error response from daemon: Get https://10.11.51.71/v1/users/: dial tcp 10.11.51.71:443: getsockopt: connection refused

原因:docker login/pull/push等對registry的操作默認啟用https,但這里harbor設置的是采用http。
解決方案:修改docker服務啟動參數,在/etc/sysconfig/docker文件中的OPTIONS中增加"--insecure-registry 10.11.51.71" (centos7中默認沒有/etc/sysconfig/docker文件,可以手工添加,同步修改啟動文件/usr/lib/systemd/system/docker.service調用此參數文件)
