CentOS7.3部署鏡像倉庫Harbor


參考文檔:

  1. harbor介紹:https://github.com/vmware/harbor
  2. harbor安裝&使用指導:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
  3. docker-compose安裝指導:https://docs.docker.com/compose/install/
  4. 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調用此參數文件)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM