基于Harbor搭建docker registry

基于Harbor搭建docker registry

環(huán)境

本文記錄一下在Centos7.3操作系統(tǒng)上,基于Harbor來(lái)搭建docker registry。當(dāng)前環(huán)境為:

# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)

# uname -a
Linux bogon 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
# docker --version
Docker version 17.12.1-ce, build 7390fc6
# docker-compose --version
docker-compose version 1.20.1, build 5d8c71b

1. Harbor簡(jiǎn)介

Harbor工程是一個(gè)企業(yè)級(jí)的鏡像服務(wù)器,用于存儲(chǔ)和分發(fā)Docker鏡像。Harbor擴(kuò)展了開(kāi)源軟件Docker Distribution,添加了如security、identitymanagement等功能。作為一個(gè)企業(yè)級(jí)的私有鏡像倉(cāng)庫(kù),Harbor提供了更好的性能和安全性。Harbor支持建立多個(gè)registries,并提供這些倉(cāng)庫(kù)間鏡像的復(fù)制能力。Harbor也提供了更加先進(jìn)的安全特性,比如用戶(hù)管理、訪(fǎng)問(wèn)控制、活動(dòng)審計(jì)。

Harbor特性:

  • 基于角色的訪(fǎng)問(wèn)控制: usersrepositories都是以projects的方式組織的。在一個(gè)project下面,每一個(gè)用戶(hù)對(duì)鏡像有不同的全向。

  • 基于策略的鏡像復(fù)制: 在多個(gè)registry之間鏡像可以同步,并且在出現(xiàn)錯(cuò)誤的時(shí)候可以進(jìn)行自動(dòng)重試。在負(fù)載均衡、高可用性、多數(shù)據(jù)中心和異構(gòu)云環(huán)境下都表現(xiàn)出色。

  • 脆弱性?huà)呙?Vulnerability Scanning): Harbor會(huì)周期性的掃描鏡像,然后警告用戶(hù)相應(yīng)的脆弱性

  • LDAP/AD支持: Harbor可以和已存在的企業(yè)版LDAP/AD系統(tǒng)集成,以提供用戶(hù)認(rèn)證和管理

  • 鏡像刪除 & 垃圾回收: Images可以被刪除,然后回收它們所占用的空間

  • 可信任(Notary): 可以確保鏡像的真實(shí)性

  • 用戶(hù)界面(Graphical user portal): 用戶(hù)可以人容易的瀏覽、搜索倉(cāng)庫(kù)和管理工程

  • 審計(jì)(Auditing): 所有對(duì)倉(cāng)庫(kù)的操作都會(huì)被跟蹤記錄

  • RESTful API: 對(duì)于大部分的管理操作都提供了RESTful API, 很容易和外部系統(tǒng)進(jìn)行集成

  • 易部署: 提供了離線(xiàn)和在線(xiàn)安裝

2. Harbor的安裝

這里介紹的是通過(guò)Harbor安裝文件的方式來(lái)安裝Harbor。在Linux操作系統(tǒng)上至少需要如下環(huán)境:

2.1 下載Harbor離線(xiàn)安裝包

Harbor Release頁(yè)面下載對(duì)應(yīng)的離線(xiàn)安裝包,目前我們下載最新版本v1.4.0:

# mkdir /opt/harbor-inst
# cd /opt/harbor-inst

# wget https://storage.googleapis.com/harbor-releases/release-1.4.0/harbor-offline-installer-v1.4.0.tgz

2.2 目標(biāo)主機(jī)相關(guān)配置推薦

Harbor部署完后會(huì)運(yùn)行多個(gè)Docker containers,因此可以部署在任何支持docker的Linux發(fā)布版本上。部署的目標(biāo)主機(jī)需要安裝Python, DockerDocker Compose。

硬件環(huán)境:

Resource Capacity Description
CPU minimal 2 CPU 4 CPU is prefered
Mem minimal 4GB 8GB is preffered
Disk minimal 40GB 160GB is preffered

軟件環(huán)境

Software Version Description
Python version 2.7 or higher 注意: 在有一些Linux發(fā)布版本(Gentoo、Arch)默認(rèn)沒(méi)有安裝Python,此時(shí)你必須手動(dòng)安裝
Docker Engine version 1.10 or higher 具體安裝手冊(cè),請(qǐng)參看相關(guān)文檔:https://docs.docker.com/engine/installation/
Docker Compose version 1.6.0 or higher 具體安裝手冊(cè),請(qǐng)參看相關(guān)文檔:https://docs.docker.com/compose/install/
Openssl latest is preffered 用于為Harbor產(chǎn)生證書(shū)和秘鑰

網(wǎng)絡(luò)端口

Port Protocol Description
443 HTTPS 在https協(xié)議下,Harbor UI與API將會(huì)在本端口上接收請(qǐng)求
4443 HTTPS Harbor的Docker Content Trust service將會(huì)連接到本端口,只在Notary啟用時(shí)使用
80 HTTP 在http協(xié)議下,Harbor UI與API將會(huì)在本端口上接收請(qǐng)求

我們當(dāng)前的硬件環(huán)境:

//物理CPU個(gè)數(shù)
# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1

//每個(gè)CPU核數(shù)
# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores       : 4

//邏輯CPU個(gè)數(shù)
# cat /proc/cpuinfo  | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

# cat /proc/meminfo | grep MemTotal
MemTotal:       10058704 kB

#  fdisk -l | grep Disk
Disk /dev/sda: 85.9 GB, 85899345920 bytes, 167772160 sectors
Disk label type: dos
Disk identifier: 0x000c3eb0

我們當(dāng)前軟件環(huán)境

# python --version
Python 2.7.5

# docker --version
Docker version 17.12.1-ce, build 7390fc6

# docker-compose --version
docker-compose version 1.20.1, build 5d8c71b

# openssl version -v
OpenSSL 1.0.2k-fips  26 Jan 2017

2.3 安裝步驟

安裝Harbor一般遵循如下步驟:

  • 下載Harbor installer

  • 配置harbor.cfg

  • 運(yùn)行install.sh腳本進(jìn)行安裝并啟動(dòng)harbor

2.3.1 解壓harbor安裝包

我們?cè)谏厦嫦螺d了harbor安裝包,這里解壓:

# pwd
/opt/harbor-inst

# ls
harbor-offline-installer-v1.4.0.tgz

# tar -zxvf harbor-offline-installer-v1.4.0.tgz 
# cd harbor

2.3.2 配置Harbor

Harbor配置參數(shù)處于harbor.cfg文件中。在harbor.cfg配置文件中,有兩大類(lèi)參數(shù): 必填參數(shù)可選參數(shù)

  • required parameters: 這些參數(shù)在配置文件中必須填寫(xiě)。在更新harbor.cfg配置文件后,調(diào)用install.sh重新安裝Harbor,這些參數(shù)就會(huì)起作用

  • optional parameters: 這些參數(shù)在更新時(shí)是可選的。例如, 用戶(hù)可以先讓這些參數(shù)取默認(rèn)值,然后在Harbor啟動(dòng)后在Web UI上來(lái)進(jìn)行修改。假如這些參數(shù)在harbor.cfg中也進(jìn)行了配置,那么只在第一次啟動(dòng)harbor有效。后續(xù)再對(duì)harbor.cfg進(jìn)行更新將會(huì)被忽略。

Note: 假如你選擇通過(guò)Web UI的方式來(lái)更改這些參數(shù),確保在Harbor啟動(dòng)之后馬上進(jìn)行更改。通常,你必須在注冊(cè)或創(chuàng)建新的用戶(hù)之前設(shè)置auth_mode。
當(dāng)Harbor系統(tǒng)中有用戶(hù)之后(出admin管理用戶(hù)外),auth_mode是不能被修改的

如下所描述的參數(shù),你至少需要更改hostname屬性:

Required parameters:

  • hostname: 目標(biāo)主機(jī)的hostname名稱(chēng),被用于訪(fǎng)問(wèn)WebUI和registry服務(wù)。其可以被設(shè)置為IP地址,或者你目標(biāo)機(jī)器的全限定域名。例如: 192.168.1.10或者reg.yourdomain.com。注意不要將hostname設(shè)置為localhost或者127.0.0.1, registry服務(wù)需要能夠被外網(wǎng)訪(fǎng)問(wèn)的到。

  • ui_url_protocol: 可以設(shè)置為http或者h(yuǎn)ttps,默認(rèn)值為http。該協(xié)議被用于訪(fǎng)問(wèn)Web UI和token/notification服務(wù)。假如Notary被使能的話(huà),則必須設(shè)置為https。默認(rèn)情況下采用http協(xié)議,要想設(shè)置為https,請(qǐng)參看Configuring Harbor with HTTPS Access

  • db_password: 當(dāng)auth采用db_auth方式時(shí),用于設(shè)置MySQL數(shù)據(jù)庫(kù)的密碼。請(qǐng)?jiān)谌魏螌?shí)際生產(chǎn)環(huán)境中,修改此密碼

  • max_job_workers: 用于設(shè)置job service中replicationworker的最大數(shù)(默認(rèn)為3)。對(duì)于每一個(gè)image replication任務(wù),一個(gè)worker會(huì)同步repository中所有tags到遠(yuǎn)程目標(biāo)地址。增大本字段的值,允許在一個(gè)系統(tǒng)中有更多的并發(fā)復(fù)制進(jìn)程。然而,每個(gè)replication worker都會(huì)消耗一定數(shù)量的network/CPU/IO資源,請(qǐng)基于你當(dāng)前的硬件環(huán)境選擇一個(gè)合適的值。

  • customize_crt: 可以被設(shè)置為on或者off,默認(rèn)值為on。當(dāng)本屬性設(shè)置為on時(shí),prepare腳本會(huì)創(chuàng)建一個(gè)private keyroot certificate,以用于registry token的驗(yàn)證。假如本屬性被設(shè)置為off的話(huà),你可以自己手動(dòng)來(lái)產(chǎn)生private keyroot certificate。請(qǐng)參看:Customize Key and Certificate of Harbor Token Service

  • ssl_cert: SSL certificate路徑,當(dāng)協(xié)議被設(shè)置為https時(shí)使用

  • ssl_cert_key: SSL key路徑,當(dāng)協(xié)議被設(shè)置為https時(shí)使用

  • secretkey_path: 用于加密和機(jī)密遠(yuǎn)程registry密碼的key路徑

  • log_rotate_count: 用于設(shè)置日志在回滾多少次之后被刪除。假如被設(shè)置為0,則日志不會(huì)被回滾,而是會(huì)被直接刪除

  • log_rotate_size: 用于設(shè)置日志在多大時(shí)會(huì)進(jìn)行回滾,單位可以是K/M/G,分別表示KB/MB/GB。

Optional parameters:

  • Email settings: 這些信息主要是為了重置Harbor密碼時(shí)使用,通常情況下我們并不需要。

  • harbor_admin_password: 用于設(shè)置管理員初始密碼。該密碼只在Harbor第一次啟動(dòng)時(shí)有效。啟動(dòng)之后該密碼將會(huì)被忽略,Administrator的密碼應(yīng)該在UI中進(jìn)行設(shè)置。注意,默認(rèn)的用戶(hù)名/密碼為admin/Harbor12345

  • auth_mode: 用戶(hù)認(rèn)證的類(lèi)型,默認(rèn)情況下為db_auth,這種情況下用戶(hù)名密碼被存放在數(shù)據(jù)庫(kù)中。如果要使用LDAP認(rèn)證的話(huà),請(qǐng)將此字段設(shè)置為ldap_auth。

IMPORTANT: 當(dāng)要從一個(gè)已存在的Harbor實(shí)例升級(jí)的時(shí)候,你必須確保在harbor.cfg中配置的auth_mode是相同的,否則在更新后可能會(huì)造成用戶(hù)不能正常登錄
  • ldap_url: LDAP端點(diǎn)的URL(例如:ldaps://ldap.mydomain.com)。只在auth_mode被設(shè)置為ldap_auth時(shí)使用

  • ldap_searchdnldap_search_pwd、ldap_basedn、ldap_filterldap_uid、ldap_scope

  • self_registration: 可選值為on/off,默認(rèn)為on。本選項(xiàng)用于使能或禁止注冊(cè)成為本系統(tǒng)的賬戶(hù)。當(dāng)被禁止時(shí),新用戶(hù)只能由admin用戶(hù)來(lái)創(chuàng)建,在Harbor中只有admin用戶(hù)可以創(chuàng)建新用戶(hù)。注意: 當(dāng)auth_mode被設(shè)置為ldap_auth時(shí),self-registration功能總是會(huì)被禁止,并且此選項(xiàng)會(huì)被忽略。

  • token_expiration: token創(chuàng)建多長(zhǎng)時(shí)間之后會(huì)過(guò)期,默認(rèn)是30min

  • project_creation_restriction: 本flag用于控制哪些用戶(hù)有權(quán)限來(lái)創(chuàng)建projects。默認(rèn)情況下,任何用戶(hù)都可以創(chuàng)建project,假如設(shè)置為adminonly,則只有admin用戶(hù)可以創(chuàng)建project。

2.3.3 配置存儲(chǔ)后端(可選)

默認(rèn)情況下,Harbor存儲(chǔ)鏡像到本地文件系統(tǒng)。在實(shí)際的生產(chǎn)環(huán)境下,你可以采用其他的存儲(chǔ)后端來(lái)代替本地文件系統(tǒng),例如可以采用S3、OpenStack Swift、Ceph等。而這你需要修改的文件是common/templates/registry/config.ymlstorage字段。例如,假如你需要配置存儲(chǔ)后端為Openstack swift,則storage段類(lèi)似如下:

storage:
  swift:
    username: admin
    password: ADMIN_PASS
    authurl: http://keystone_addr:35357/v3/auth
    tenant: admin
    domain: default
    region: regionOne
    container: docker_images

想要了解詳細(xì)的后端存儲(chǔ)配置,請(qǐng)參看Registry Configuration Reference

2.4 完成安裝并啟動(dòng)Harbor

一旦harbor.cfg及存儲(chǔ)后端(可選)完成配置,使用install.sh腳本完成安裝并啟動(dòng)Harbor。

1) 默認(rèn)安裝(without Notary/Clair)

Harbor已經(jīng)集成了Notary/Clair(用于vulnerability scanning)。然而,默認(rèn)的安裝并不包含Notary/Clair:

<pre style="margin-block-start: 0px; margin-block-end: 0px; margin: 0.5em 0px; padding: 0.5em 18.6094px; border: 1px solid rgb(204, 204, 204); outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 0.9em; vertical-align: baseline; background: rgb(47, 43, 43); color: rgb(166, 226, 46); line-height: 1.5; border-radius: 0.35em; overflow-wrap: break-word; overflow: auto;"># sudo ./install.sh
</pre>

假如一切工作正常的話(huà),你可以打開(kāi)一個(gè)用戶(hù)界面,然后訪(fǎng)問(wèn)后臺(tái)管理頁(yè)面http://reg.yourdomain.com/(注意這里請(qǐng)將reg.yourdomain.com替換為你在harbor.cfg中配置的hostname字段的值),默認(rèn)的后臺(tái)管理username/password為admin/Harbor12345

登錄admin管理頁(yè)面,然后創(chuàng)建一個(gè)新的工程,例如myproject,你可以使用docker命令來(lái)登錄并push鏡像(默認(rèn)情況下,registry server監(jiān)聽(tīng)在80端口上):

# docker login reg.yourdomain.com
# docker push reg.yourdomain.com/myproject/myrepo:mytag

IMPORTANT: 默認(rèn)情況下安裝Harbor,使用的是http協(xié)議。這樣你必須為docker daemon添加--insecure-registry,并重啟docker daemon服務(wù)

2) Installation with Notary

要安裝帶Notary服務(wù)的Harbor,你可以在運(yùn)行install.sh腳本時(shí)添加一個(gè)參數(shù):

# sudo ./install.sh --with-notary

NOTE: 要讓Harbor支持Notary服務(wù)的話(huà),ui_url_protocol必須配置為https。要配置https,請(qǐng)參考另外的章節(jié)

要了解更多關(guān)于NotaryDocker Content Trust相關(guān)信息,請(qǐng)參看docker相關(guān)文檔:Docker Content Trust

3) Installation with Clair

要安裝帶Clair服務(wù)的Harbor,你可以在運(yùn)行install.sh腳本時(shí)添加一個(gè)參數(shù):

# sudo ./install.sh --with-clair

要想了解更多Clair相關(guān)信息,請(qǐng)參看Clair文檔

注意: 假如要同時(shí)支持Notary與Clair,你必須在同一個(gè)命令中同時(shí)指定這兩個(gè)參數(shù):

# sudo ./install.sh --with-notary --with-clair

欲了解更多Harbor的使用,請(qǐng)參看User Guide of Harbor

3. 配置Harbor以支持https訪(fǎng)問(wèn)

Harbor本身在發(fā)布時(shí)并不提供任何證書(shū),默認(rèn)情況下,其使用http來(lái)提供相應(yīng)服務(wù)。這使得Harbor可以相對(duì)容易來(lái)建立及運(yùn)行,特別是在開(kāi)發(fā)及測(cè)試環(huán)境中,這很重要。然而在實(shí)際的生產(chǎn)環(huán)境中,并不建議采用http。要使能https,請(qǐng)參看Configuring Harbor with HTTPS Access

4. Harbor生命周期管理

你可以使用docker-compose來(lái)管理Harbor的生命周期,下面列出一些常用的命令(說(shuō)明必須在docker-compose.yml文件所在目錄運(yùn)行):

1) 停止Harbor

# sudo docker-compose stop
Stopping nginx ... done
Stopping harbor-jobservice ... done
Stopping harbor-ui ... done
Stopping harbor-db ... done
Stopping registry ... done
Stopping harbor-log ... done

2) 在Harbor停止后,重啟Harbor

# sudo docker-compose start
Starting log ... done
Starting ui ... done
Starting mysql ... done
Starting jobservice ... done
Starting registry ... done
Starting proxy ... done

3) 如果要改變Harbor的配置,首先要停止當(dāng)前已存在的Harbor實(shí)例,然后更新harbor.cfg。然后再運(yùn)行prepare腳本更新配置文件,最后再重新創(chuàng)建并啟動(dòng)Harbor實(shí)例

# sudo docker-compose down -v
# vim harbor.cfg
# sudo prepare
# sudo docker-compose up -d

4) 移除Harbor容器,但保留文件系統(tǒng)上的image data及Harbor數(shù)據(jù)庫(kù)

# sudo docker-compose down -v

5) 移除Harbor數(shù)據(jù)庫(kù)及image data(用于干凈環(huán)境下Harbor重裝)

# rm -rf /data/database
# rm -rf /data/registry

4.1 Harbor with Notary生命周期管理

當(dāng)Harbor被安裝支持Notary服務(wù)時(shí),需要給docker-compose提供一個(gè)額外的模板文件docker-compose.notary.yml。docker-compose管理Harbor生命周期的命令:

# sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml [ up|down|ps|stop|start ]

例如,假如你想要改變harbor.cfg配置文件,并重新部署帶Notary服務(wù)的Harbor,那么你可以用如下的命令:

# sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml down -v
# vim harbor.cfg
# sudo prepare --with-notary
# sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml up -d

4.2 Harbor with Clair生命周期管理

當(dāng)Harbor被安裝支持Clair服務(wù)時(shí),需要給docker-compose提供一個(gè)額外的模板文件docker-compose.clair.yml。docker-compose管理Clair生命周期的命令:

#  sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.clair.yml [ up|down|ps|stop|start ]

例如,假如你想要改變harbor.cfg配置文件,并重新部署帶Clair服務(wù)的Harbor,那么你可以用如下的命令:

# sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.clair.yml down -v
# vim harbor.cfg
# sudo prepare --with-clair
# sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.clair.yml up -d

4.3 Harbor with Notary and Clair生命周期管理

假如你安裝了同時(shí)支持Notary及Clair服務(wù)的Harbor,你應(yīng)該在docker-compose命令中包含兩個(gè)組件:

# sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml -f ./docker-compose.clair.yml down -v
# vim harbor.cfg
# sudo prepare --with-notary --with-clair
# sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml -f ./docker-compose.clair.yml up -d

請(qǐng)參看Docker Compose command-line reference以了解更多docker-compose的用法。

5. 持久化數(shù)據(jù)及日志文件

默認(rèn)情況下,registry的數(shù)據(jù)會(huì)被持久化到主機(jī)的/data/目錄。即使在容器被移除或者重新創(chuàng)建的情況下,這些數(shù)據(jù)都會(huì)維持不變。

另外,Harbor使用rsyslog來(lái)收集每一個(gè)容器的日志。默認(rèn)情況下,這些日志文件都被存儲(chǔ)在/var/log/harbor目錄下,我們可以使用這些日志來(lái)處理一些相關(guān)問(wèn)題。

6. 定制化Harbor監(jiān)聽(tīng)端口

默認(rèn)情況下,Harbor會(huì)監(jiān)聽(tīng)80端口(http)和443端口(假如配置了https),以此來(lái)處理Harbor的后臺(tái)管理操作及支持docker的相關(guān)命令。你也可以對(duì)這些端口進(jìn)行相應(yīng)的定制。

6.1 定制http協(xié)議端口

1) 修改docker-compose.yml文件

替換第一個(gè)80端口為一個(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) 修改harbor.cfg文件,添加端口到hostname參數(shù)

hostname = 192.168.0.2:8888

3) 重新部署Harbor

請(qǐng)參看前面”Harbor生命周期管理”相關(guān)章節(jié)。

6.2 定制https協(xié)議端口

1) 在Harbor中使能HTTPS

請(qǐng)參看相關(guān)章節(jié)。

2) 修改docker-compose.yml文件

將第一個(gè)443端口替換為一個(gè)定制化指定端口,例如8888:80:

proxy:
    image: library/nginx:1.11.5
    restart: always
    volumes:
      - ./config/nginx:/etc/nginx
    ports:
      - 80:80
      - 8888:443
    depends_on:
      - mysql
      - registry
      - ui
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "proxy"

3) 修改harbor.cfg文件,添加端口到hostname參數(shù)

hostname = 192.168.0.2:8888

4) 重新部署Harbor

請(qǐng)參看前面”Harbor生命周期管理”相關(guān)章節(jié)。

7. 性能調(diào)優(yōu)

默認(rèn)情況下,Harbor會(huì)限制Clair容器的的CPU使用率為15000來(lái)避免其占用所有的CPU資源。這是在docker-compose.clair.yml文件中進(jìn)行配置的。你可以根據(jù)你的硬件配置進(jìn)行相應(yīng)的修改。

8. Troubleshooting

1) 當(dāng)Harbor不能正常工作時(shí),通過(guò)運(yùn)行如下的命令來(lái)找出是否所有的容器都處于UP狀態(tài)

# sudo docker-compose ps
        Name                     Command               State                    Ports                   
  -----------------------------------------------------------------------------------------------------
  harbor-db           docker-entrypoint.sh mysqld      Up      3306/tcp                                 
  harbor-jobservice   /harbor/harbor_jobservice        Up                                               
  harbor-log          /bin/sh -c crond && rsyslo ...   Up      127.0.0.1:1514->514/tcp                    
  harbor-ui           /harbor/harbor_ui                Up                                               
  nginx               nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp 
  registry            /entrypoint.sh serve /etc/ ...   Up      5000/tcp 

假如有一個(gè)container不是處于UP狀態(tài),請(qǐng)檢查/var/log/harbor目錄下該容器的日志。例如,假如harbor-ui沒(méi)有運(yùn)行的話(huà),你可以查詢(xún)ui.log日志文件。

  1. 當(dāng)在一個(gè)Nginx代代理或ELB(elastic load balancing)后端建立Harbor時(shí),請(qǐng)?jiān)?code>common/templates/nginx/nginx.http.conf文件中查詢(xún)?nèi)缦滦校?/li>

proxy_set_header X-Forwarded-Proto $scheme;

假如代理中已經(jīng)有類(lèi)似于location /, location /v2/ 與 location /service/的設(shè)置,請(qǐng)將其從所在section移除,然后根據(jù)上面Harbor生命周期管理相關(guān)章節(jié)重新部署Harbor。

9. 部署示例

前面我們已經(jīng)下載并解壓好了harbor,這里我們進(jìn)入解壓好的根目錄:

# cd /opt/harbor-inst/harbor
# ls
common  docker-compose.clair.yml  docker-compose.notary.yml  docker-compose.yml  ha  harbor.cfg  harbor.v1.4.0.tar.gz  install.sh  LICENSE  NOTICE  prepare

我們當(dāng)前ip地址為192.168.69.128, 用netstat查看80、443等端口也沒(méi)有被占用。

1) 修改harbor.cfg的hostname字段

<pre style="margin-block-start: 0px; margin-block-end: 0px; margin: 0.5em 0px; padding: 0.5em 18.6094px; border: 1px solid rgb(204, 204, 204); outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 0.9em; vertical-align: baseline; background: rgb(47, 43, 43); color: rgb(166, 226, 46); line-height: 1.5; border-radius: 0.35em; overflow-wrap: break-word; overflow: auto;">hostname = 192.168.69.128
</pre>

2) 執(zhí)行install.sh腳本

# ./install.sh 

[Step 0]: checking installation environment ...

Note: docker version: 17.12.1

Note: docker-compose version: 1.20.1

[Step 1]: loading Harbor images ...
651f69aef02c: Loading layer [==================================================>]  135.8MB/135.8MB
40a1aad64343: Loading layer [==================================================>]  23.24MB/23.24MB
3fe2713e4072: Loading layer [==================================================>]  12.16MB/12.16MB
ba3a1eb0e375: Loading layer [==================================================>]   17.3MB/17.3MB
447427ec5e1a: Loading layer [==================================================>]  15.87kB/15.87kB
4ccb4026663c: Loading layer [==================================================>]  3.072kB/3.072kB
16faa95946a1: Loading layer [==================================================>]  29.46MB/29.46MB
Loaded image: vmware/notary-server-photon:v0.5.1-v1.4.0
fa7ba9fd42c9: Loading layer [==================================================>]  10.95MB/10.95MB
4e400f9ae23e: Loading layer [==================================================>]   17.3MB/17.3MB
2802fb27c88b: Loading layer [==================================================>]  15.87kB/15.87kB
e6367a4e1e1e: Loading layer [==================================================>]  3.072kB/3.072kB
8ece8dfcdd98: Loading layer [==================================================>]  28.24MB/28.24MB
Loaded image: vmware/notary-signer-photon:v0.5.1-v1.4.0
a7dd1a8afcaf: Loading layer [==================================================>]  396.7MB/396.7MB
05adebbe496f: Loading layer [==================================================>]  9.216kB/9.216kB
86eb534949fa: Loading layer [==================================================>]  9.216kB/9.216kB
d7f127c69380: Loading layer [==================================================>]   7.68kB/7.68kB
5ac1c4dc5ee9: Loading layer [==================================================>]  1.536kB/1.536kB
d0bec56b5b1a: Loading layer [==================================================>]  9.728kB/9.728kB
4bbe83860556: Loading layer [==================================================>]   2.56kB/2.56kB
e526f9e6769f: Loading layer [==================================================>]  3.072kB/3.072kB
Loaded image: vmware/harbor-db:v1.4.0
1cff102bbda2: Loading layer [==================================================>]  154.1MB/154.1MB
04c9f3e07de1: Loading layer [==================================================>]  10.75MB/10.75MB
7b6c7bf54f5c: Loading layer [==================================================>]  2.048kB/2.048kB
42f8acdb7fe3: Loading layer [==================================================>]  48.13kB/48.13kB
5b6299d0a1df: Loading layer [==================================================>]   10.8MB/10.8MB
Loaded image: vmware/clair-photon:v2.0.1-v1.4.0
6534131f457c: Loading layer [==================================================>]  94.76MB/94.76MB
73f582101e4b: Loading layer [==================================================>]  6.656kB/6.656kB
86d847823c48: Loading layer [==================================================>]  6.656kB/6.656kB
Loaded image: vmware/postgresql-photon:v1.4.0
5cd250d5a352: Loading layer [==================================================>]  23.24MB/23.24MB
ad3fd52b54f3: Loading layer [==================================================>]  14.99MB/14.99MB
13b1e24cc368: Loading layer [==================================================>]  14.99MB/14.99MB
Loaded image: vmware/harbor-adminserver:v1.4.0
c26c69706710: Loading layer [==================================================>]  23.24MB/23.24MB
223f6fe02cc8: Loading layer [==================================================>]  23.45MB/23.45MB
1fc843c8698a: Loading layer [==================================================>]  7.168kB/7.168kB
e09293610ee7: Loading layer [==================================================>]  10.39MB/10.39MB
d59f9780b1d8: Loading layer [==================================================>]  23.44MB/23.44MB
Loaded image: vmware/harbor-ui:v1.4.0
dd4753242e59: Loading layer [==================================================>]  73.07MB/73.07MB
95aed61ca251: Loading layer [==================================================>]  3.584kB/3.584kB
1864f9818562: Loading layer [==================================================>]  3.072kB/3.072kB
da2a19f80b81: Loading layer [==================================================>]  4.096kB/4.096kB
058531639e75: Loading layer [==================================================>]  3.584kB/3.584kB
a84e69fb619b: Loading layer [==================================================>]  10.24kB/10.24kB
Loaded image: vmware/harbor-log:v1.4.0
b1056051f246: Loading layer [==================================================>]  23.24MB/23.24MB
07678065e08b: Loading layer [==================================================>]  19.19MB/19.19MB
a2d9bdb8f5fb: Loading layer [==================================================>]  19.19MB/19.19MB
Loaded image: vmware/harbor-jobservice:v1.4.0
7f58ce57cd5e: Loading layer [==================================================>]  4.805MB/4.805MB
Loaded image: vmware/nginx-photon:v1.4.0
4c8965978b77: Loading layer [==================================================>]  23.24MB/23.24MB
1466c942edde: Loading layer [==================================================>]  2.048kB/2.048kB
ac5c17331735: Loading layer [==================================================>]  2.048kB/2.048kB
86824c7c466a: Loading layer [==================================================>]  2.048kB/2.048kB
fd3bd0e70d67: Loading layer [==================================================>]   22.8MB/22.8MB
b02195d77636: Loading layer [==================================================>]   22.8MB/22.8MB
Loaded image: vmware/registry-photon:v2.6.2-v1.4.0
Loaded image: vmware/photon:1.0
Loaded image: vmware/mariadb-photon:v1.4.0
454c81edbd3b: Loading layer [==================================================>]  135.2MB/135.2MB
e99db1275091: Loading layer [==================================================>]  395.4MB/395.4MB
051e4ee23882: Loading layer [==================================================>]  9.216kB/9.216kB
6cca4437b6f6: Loading layer [==================================================>]  9.216kB/9.216kB
1d48fc08c8bc: Loading layer [==================================================>]   7.68kB/7.68kB
0419724fd942: Loading layer [==================================================>]  1.536kB/1.536kB
526b2156bd7a: Loading layer [==================================================>]  637.8MB/637.8MB
9ebf6900ecbd: Loading layer [==================================================>]  78.34kB/78.34kB
Loaded image: vmware/harbor-db-migrator:1.4

[Step 2]: preparing environment ...
Generated and saved secret to file: /data/secretkey
Generated configuration file: ./common/config/nginx/nginx.conf
Generated configuration file: ./common/config/adminserver/env
Generated configuration file: ./common/config/ui/env
Generated configuration file: ./common/config/registry/config.yml
Generated configuration file: ./common/config/db/env
Generated configuration file: ./common/config/jobservice/env
Generated configuration file: ./common/config/log/logrotate.conf
Generated configuration file: ./common/config/jobservice/app.conf
Generated configuration file: ./common/config/ui/app.conf
Generated certificate, key file: ./common/config/ui/private_key.pem, cert file: ./common/config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.

[Step 3]: checking existing instance of Harbor ...

[Step 4]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-adminserver ... done
Creating harbor-db          ... done
Creating registry           ... done
Creating harbor-ui          ... done
Creating harbor-jobservice  ... done
Creating nginx              ... done

? ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://192.168.69.128\. 
For more details, please visit https://github.com/vmware/harbor .

3) 查詢(xún)Harbor運(yùn)行狀態(tài)

# docker ps
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS                            PORTS                                                              NAMES
10b95448f80f        vmware/nginx-photon:v1.4.0             "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds                      0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
64893e6ba9d3        vmware/harbor-jobservice:v1.4.0        "/harbor/start.sh"       5 seconds ago       Up 4 seconds (health: starting)                                                                      harbor-jobservice
62220b07e57f        vmware/harbor-ui:v1.4.0                "/harbor/start.sh"       5 seconds ago       Up 5 seconds (health: starting)                                                                      harbor-ui
ce166d26724e        vmware/harbor-db:v1.4.0                "/usr/local/bin/dock…"   7 seconds ago       Up 6 seconds (health: starting)   3306/tcp                                                           harbor-db
a62d8f460c35        vmware/registry-photon:v2.6.2-v1.4.0   "/entrypoint.sh serv…"   7 seconds ago       Up 5 seconds (health: starting)   5000/tcp                                                           registry
5e5e4bcee123        vmware/harbor-adminserver:v1.4.0       "/harbor/start.sh"       7 seconds ago       Up 6 seconds (health: starting)                                                                      harbor-adminserver
cb6dbc564382        vmware/harbor-log:v1.4.0               "/bin/sh -c /usr/loc…"   7 seconds ago       Up 6 seconds (health: starting)   127.0.0.1:1514->10514/tcp                                          harbor-log

4) 訪(fǎng)問(wèn)

首先我們用curl命令訪(fǎng)問(wèn)一下:

# curl -X GET http://192.168.69.128 -k -IL
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 09 Apr 2018 02:43:20 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 810
Connection: keep-alive
Set-Cookie: beegosessionID=1720767232a3cdcb58a54cd13eead058; Path=/; HttpOnly

然后我們?cè)儆脼g覽器訪(fǎng)問(wèn)。

5) 向Harbor push/pull鏡像

  • 停止Harbor
# docker-compose stop
Stopping nginx              ... done
Stopping harbor-jobservice  ... done
Stopping harbor-ui          ... done
Stopping harbor-db          ... done
Stopping registry           ... 
Stopping registry           ... done
Stopping harbor-adminserver ... done
Stopping harbor-log         ... done
  • 修改dockerd啟動(dòng)腳本

這里修改/lib/systemd/system/docker.service文件,將ExecStart修改為:

ExecStart=/usr/bin/dockerd \
        --insecure-registry=192.168.69.128 \
        -H tcp://0.0.0.0:2375 \
        -H unix://var/run/docker.sock \
        -H tcp://0.0.0.0:7654

上面添加了--insecure-registry選項(xiàng)。然后執(zhí)行再執(zhí)行如下命令重啟dockerd:

# systemctl daemon-reload

# systemctl restart docker

6) 重啟Harbor

# docker-compose start
Starting log         ... done
Starting registry    ... done
Starting mysql       ... done
Starting adminserver ... done
Starting ui          ... done
Starting jobservice  ... done
Starting proxy       ... done
# docker ps
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS                            PORTS                                                              NAMES
10b95448f80f        vmware/nginx-photon:v1.4.0             "nginx -g 'daemon of…"   21 minutes ago      Up Less than a second             0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
64893e6ba9d3        vmware/harbor-jobservice:v1.4.0        "/harbor/start.sh"       21 minutes ago      Up 4 seconds (health: starting)                                                                      harbor-jobservice
62220b07e57f        vmware/harbor-ui:v1.4.0                "/harbor/start.sh"       21 minutes ago      Up 4 seconds (health: starting)                                                                      harbor-ui
ce166d26724e        vmware/harbor-db:v1.4.0                "/usr/local/bin/dock…"   21 minutes ago      Up 57 seconds (healthy)           3306/tcp                                                           harbor-db
a62d8f460c35        vmware/registry-photon:v2.6.2-v1.4.0   "/entrypoint.sh serv…"   21 minutes ago      Up 57 seconds (healthy)           5000/tcp                                                           registry
5e5e4bcee123        vmware/harbor-adminserver:v1.4.0       "/harbor/start.sh"       21 minutes ago      Up 4 seconds (health: starting)                                                                      harbor-adminserver
cb6dbc564382        vmware/harbor-log:v1.4.0               "/bin/sh -c /usr/loc…"   21 minutes ago      Up 57 seconds (healthy)           127.0.0.1:1514->10514/tcp                                          harbor-log

7) 往Harbor中push/pull鏡像

  • 登錄
# docker login 192.168.69.128
Username: admin
Password: 
Login Succeeded
  • 重新為鏡像打tag
# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
test-image                    latest              fe9c46d12863        7 days ago          195MB
friendlyhello                 latest              f2ae8dec6267        9 days ago          150MB
redis                         alpine              c27f56585938        3 weeks ago         27.7MB

//這里我們用Harbor中的默認(rèn)庫(kù)
# docker tag redis:alpine 192.168.69.128/library/redis:alpine
# docker images | grep redis
192.168.69.128/library/redis          alpine              c27f56585938        3 weeks ago         27.7MB
redis                         alpine              c27f56585938        3 weeks ago         27.7MB
  • 上傳鏡像到Harbor
# docker push 192.168.69.128/library/redis:alpine
The push refers to repository [192.168.69.128/library/redis]
f6b9463783dc: Pushed 
222a85888a99: Pushed 
1925395eabdd: Pushed 
c3d278563734: Pushed 
ad9247fe8c63: Pushed 
cd7100a72410: Pushed 
alpine: digest: sha256:9d017f829df3d0800f2a2582c710143767f6dda4df584b708260e73b1a1b6db3 size: 1568

然后我們登錄網(wǎng)站,可以看到鏡像上傳成功。(注: 這里Harbor默認(rèn)采用Www-Authenticate: Bearer認(rèn)證)

  • 下載鏡像
//這里我們先把原來(lái)本地的鏡像刪除
# docker rmi 192.168.69.128/library/redis:alpine

//從Harbor鏡像庫(kù)拉取鏡像
# docker pull 192.168.69.128/library/redis:alpine
alpine: Pulling from library/redis
Digest: sha256:9d017f829df3d0800f2a2582c710143767f6dda4df584b708260e73b1a1b6db3
Status: Downloaded newer image for 192.168.69.128/library/redis:alpine

[參考]

  1. harbor官網(wǎng)

  2. Centos7上Docker倉(cāng)庫(kù)Harbor的搭建

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容