企業級Docker Registry開源工具Harbor的介紹以及使用指南
#Harbor 的簡介以及基本架構 Harbor簡介
Harbor安裝和配置指導
Harbor 可以使用以下三種方式進行安裝部署:
- 線上安裝: 使用者可以直接從docker hub上下載harbor的官方映象。
- 離線安裝: 使用者需要下載原始碼包,並進行自己構建images。原始碼包比較大
- Virtual Appliance: 一般使用這種方式在第三方平臺搭建一個私有倉庫作為平臺的組建比如vsphere等,需要下載OVA 版本的Harbor.
官方下載頁面 請點選我 .
需要安裝Harbor's virtual appliance,請點選我.
本篇指導主要講解通過使用線上和離線方式去一步步安裝和配置Harbor.安裝的步驟基本上都是相同的。
如果使用者運行了老版本的harbor,可能需要遷移資料到新的資料庫佇列中,詳細的步驟請**點選我**
另外在kubernetes上面部署的步驟和看以下連結**harbor on kubernets **
Harbor依賴
Harbor 被作為一個docker容器部署在服務區上,因此,他能夠被部署在任何linux發行版本。目標主機上需要安裝python,docker,以及docker-compose工具。
- Python 需要 2.7+. 需要注意的是,最好安裝對應linux髮型版本的python。
- Docker engine 需要1.10+ 目前比較新的版本1.12. docker安裝
- Docker Compose 需要 1.6.0+.
Harbor安裝與配置
安裝步驟為以下幾個部分:
- 下載安裝包
- 修改相關配置 harbor.cfg;
- 執行 install.sh 去安裝和啟動harbor;
1.下載安裝包
點選連結下載二進位制包 Harbor下載 . 選擇一個線上或者離線包進行下載. 使用 tar 命令解壓下載的原始碼包
線上包安裝:
$ tar xvf harbor-online-installer-<version>.tgz
離線包安裝:
$ tar xvf harbor-offline-installer-<version>.tgz
2.配置 Harbor
配置引數被放在檔案 harbor.cfg 中. 詳細引數講解 至少得配置 hostname 引數
- hostname: 配置目標主機的主機名, 被用來訪問Harbor ui 和映象倉庫的,可以配置為ip地址和全域名,比如
192.168.1.10
orreg.yourdomain.com
. 不要使用localhost
or127.0.0.1
為主機名 - ui_url_protocol: (http or https. 預設協議為 http) 該協議被用來訪問 the UI and the token/notification 服務. 預設是 http. 想要設定https協議,請看連結 配置Harbor支援https協議.
- Email settings: 配置Harbor來發送郵件,當然改配置並不是必須的 .注意:預設的ssl連結沒有被啟用,如果SMTP需要ssl支援,可以設定以下引數以支援。
- email_ssl = true * email_server = smtp.mydomain.com * email_server_port = 25 * email_username = [email protected] * email_password = abc * email_from = admin <[email protected]> * email_ssl = false
- harbor_admin_password: 設定管理員內部密碼,該密碼緊緊在第一次啟動Harbor的時候生效.在之後這個設定被忽略,管理員的密碼將在UI中重新設定。 預設的使用者名稱和密碼如下: admin/Harbor12345 .
- auth_mode: 被用來認證的方式,預設使用的是 db_auth,該認證會被肢解儲存到資料庫中。 如果需要設定LDAP方式認證需要使用ldap_auth.
- ldap_url: LDAP認證方式的URL (e.g.
ldaps://ldap.mydomain.com
). 當 auth_mode 被設定為ldap_auth 的時候。 - ldap_searchdn: 連結LDAP/AD服務的使用者域(e.g.
uid=admin,ou=people,dc=mydomain,dc=com
). - ldap_search_pwd: 為上面設定的使用者域設定密碼 ldap_searchdn.
- ldap_basedn: 基礎域為方便尋找一個使用者e.g.
ou=people,dc=mydomain,dc=com
. 僅當 auth_mode is 設定為ldap_auth的時候才使用 - ldap_filter:使用者搜尋過濾
(objectClass=person)
. - ldap_uid: 該引數被用來匹配一個LDAP搜尋的使用者,可以使uid,cn,email或者其他的方式。
- ldap_scope: 使用者搜尋範圍, 1-LDAP_SCOPE_BASE, 2-LDAP_SCOPE_ONELEVEL, 3-LDAP_SCOPE_SUBTREE. Default is 3.
- db_password: mysql資料庫root使用者密碼 db_auth.
- self_registration: (on or off. Default is on) 啟用和關閉使用者註冊功能.當被關閉,新使用者職能通過admin使用者去建立。 _注意: 當 auth_mode 被設定為 ldap_auth, self-registration 會被一直關閉,該引數也會被忽略。
- use_compressed_js: (on or off. 預設為 on) 生產中使用,建議將該引數設定為 on. 在部署模式中將引數設定為off 以至於js 檔案能夠被分開去修改.
- max_job_workers: (預設為 3) 設定在任務服務中最大的工作副本, 每一個image副本任務,會有一個worker從倉庫中將所有的tag同步到遠端。增大這個值回允許更多當前的副本任務,然而因為每個worker都會去消耗一定的網路/cpu/io等資源,必須根據系統的資源進行合理設定該值。
- secret_key: 該值為加解密在副本策略中遠端倉庫的密碼,長度為16位字元。生產中必需修改該值. NOTE: After changing this key, previously encrypted password of a policy can not be decrypted.
- token_expiration: token過期時間,預設30分鐘
- verify_remote_cert: (on or off. 預設 on) 該引數決定了當harbor盒遠端的registry例項互動的時候是否使用SSL/TLS .設定為off 的時候,一般遠端的registry會採用自簽名或者未受信任的證書。
- customize_crt: (on or off. 預設為on) 當設定為on的時候,會使用指令碼去建立私鑰和root證書去認證registry的token
- 以下引數:crt_country, crt_state, crt_location, crt_organization, crt_organizationalunit, crt_commonname, crt_email 被用來省城key。設定為off的時候,key和root證書可以被應用在外部的源中。為Harbor token服務自定義證書
3. 配置後端儲存 (可選的)
預設,Harbor會儲存映象檔案到本地檔案系統。在生產環境中應該考慮使用一些後端儲存去代替本地檔案系統,比如S3,openstack swift或者ceph等。可以在檔案templates/registry/config.yml
去選擇更新儲存方式。比如你想使用Openstack Swift作為你的儲存後端,對應的配置會如下:
storage:
swift:
username: admin
password: ADMIN_PASS
authurl: http://keystone_addr:35357/v3/auth
tenant: admin
domain: default
region: regionOne
container: docker_images
注意: 關於docker registry在儲存後端的詳細資訊可以檢視相應連結 Registry 配置詳情 .
4.完成Harbor的安裝並進行啟動Harbor
一旦 harbord.cfg 和儲存後端被配置完成就可以使用install.sh
指令碼進行安裝和啟動Harbor服務。 需要注意的是,執行該操作可能會花費一些,因為需要從docker hub上去下載一些Harbor相關依賴的images檔案。
$ sudo ./install.sh
如果上面指令碼執行完成之後,一切工作正常,你就可以在瀏覽器上輸入配置檔案harbor.cfg中配置的hostname並且使用配置的admin使用者來訪問Harbor服務。 http://reg.yourdomain.com 預設的管理員使用者名稱密碼: username/password:admin/Harbor12345 .
使用admin使用者登入進去後首先建立一個專案,比如myproject
. 接下來使用者就可以使用docker login reg.yourdomain.com
登入並進行push映象。(預設的registry服務監聽的80埠):
sh
$ docker login reg.yourdomain.com
$ docker push reg.yourdomain.com/myproject/myrepo:mytag
重要提示: 預設安裝的Harbor使用的是 HTTP 協議,因此,當用戶在使用的時候,需要在docker daemon的配置檔案中增加以下引數 --insecure-registry reg.yourdomain.com
並且重啟docker.
更多使用Harbor的詳情資訊,請點我**Harbor使用指南** .
5.配置Harbor以支援HTTPs訪問
Harbor不會使用任何認證進行執行,預設使用http來提供服務。這種方式對於部署或者測試環境會相應的簡單一些,但是在生產環境中不建議那樣做。為了啟用HTTPS的支援,請看下面的連結 配置Harbor以支援https.
管理 Harbor的生命週期
你可以使用docker-compose去管理Harbor的整個生命週期。以下是相應的管理命令,需要注意的是docker-compose必須得在有docker-compose.yml檔案的目錄下執行:
停止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
啟動Harbor服務:
$ 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
如果需要修改Harbor的配置,首先需要停掉正在執行的 Harbor例項,更新harbor.cfg檔案,再次執行install.sh
$ sudo docker-compose down
$ vim harbor.cfg
$ sudo install.sh
刪除Harbor容器,儲存映象檔案和Harbor的資料庫檔案:
$ 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
刪除Harbor的資料庫資訊和映象檔案(一般為了純淨安裝):
$ rm -r /data/database
$ rm -r /data/registry
持久化資料和日誌檔案
預設情況下,regirstry的資料被持久化到目標主機的/data/
目錄。當Harbor的容器唄刪除或者重新建立的時候,資料不會有任何改變。 另外,Harbor使用rsyslog去收集每個容器的日誌,預設的,政協日誌檔案被儲存在目標主機的/var/log/harbor/
目錄以便進行troubleshooting
配置Harbor監聽自定義埠
預設情況下,Harbor監聽80和443(需要配置)來作為admin使用者登入的入口,當然也可以自定義該埠。
Http協議
1.修改 docker-compose.yml 檔案 替換ui中的埠對映, e.g. 8888:80.
proxy:
image: library/nginx:1.11.5
restart: always
volumes:
- ./config/nginx:/etc/nginx
ports:
- 8888: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 , 在引數 "$ui_url"之後增加自定義埠":8888".
auth:
token:
issuer: registry-token-issuer
realm: $ui_url:8888/service/token
rootcertbundle: /etc/registry/root.crt
service: token-service
3.執行install.sh更新並啟動harbor.
$ sudo docker-compose down
$ sudo install.sh
HTTPS 協議
1.啟用Https協議指南 guide. 2.修改 docker-compose.yml配置檔案
修改compose檔案中的443埠對映,比如: 4443:443.
proxy:
image: library/nginx:1.11.5
restart: always
volumes:
- ./config/nginx:/etc/nginx
ports:
- 80:80
- 4443:443
depends_on:
- mysql
- registry
- ui
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"
3.修改模版檔案 templates/registry/config.yml 在"$ui_url"之後增加自定義埠,比如":4443"
auth:
token:
issuer: registry-token-issuer
realm: $ui_url:4443/service/token
rootcertbundle: /etc/registry/root.crt
service: token-service
4.執行 install.sh 更新啟動 Harbor.
$ sudo docker-compose down
$ sudo install.sh
故障排查
- 當harbor不正常工作的時候,可以使用一下命令檢視正在執行的容器資訊:
$ sudo docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------
harbor_jobservice_1 /harbor/harbor_jobservice Up
harbor_log_1 /bin/sh -c crond && rsyslo ... Up 0.0.0.0:1514->514/tcp
harbor_mysql_1 /entrypoint.sh mysqld Up 3306/tcp
harbor_proxy_1 nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
harbor_registry_1 /entrypoint.sh serve /etc/ ... Up 5000/tcp
harbor_ui_1 /harbor/harbor_ui Up
如果有容器處於非up狀態,可以檢查容器日誌/var/log/harbor
2.對harbor進行彈性負載均衡nginx反響代理的時候可以檢視以下檔案,
make/config/nginx/nginx.conf
中的相關配置 location /
, location /v2/
location /service/
.
proxy_set_header X-Forwarded-Proto $scheme;