程式設計師都在學的docker--搭建harbor私有倉庫與管理

wo有點煩發表於2020-09-27

一、 harbor概述

Harbor是VMware公司的開源級的企業級DockerRegistry(倉庫)專案,專案地址為 https://github.com/vmware/harbor.

Harbor的目標是幫助使用者迅速搭建一個企業級的DockerRegistry服務。

Harbor以docker公司開源的registry為基礎,提供了管理UI,基於角色的訪問控制(Role Based Access Control),AD/LDAP整合,以及審計日誌(Auditlogging)等企業使用者需求的功能,同時還原生支援中文。

Harbor的每個元件都是以Docker容器的形式構建的,使用docker-compose來對它進行部署。用於部署Harbor的docker-compose模板位於/usr/local/bin/harbor/docker-compose.yml(自定義)

1.1 harbor的特性

1、基於角色控制:使用者與Docker映象倉庫通過"專案"進行組織管理,一個使用者可以對多個映象倉庫在統一名稱空間(projec)裡有不同的許可權

2、圖形化使用者介面:使用者可以通過瀏覽器來瀏覽,檢索當前Docker映象倉庫,管理專案和名稱空間

3、審計管理:所有這怒地映象倉庫的錯都可以被記錄追溯,用於審計管理

4、基於映象的複製策略:映象可以在多個Harbor例項之間進行復制。

5、支援LDAP認證:Harbor的使用者授權可以使用已經存在的使用者。

6、映象刪除和垃圾回收:image可以被刪除並且回收image佔用的空間。

7、簡單的部署功能:harbor提供了online、offline安裝,此外還提供了virtualappliance安裝

8、harbor和docker registry的關係:harbor實質上是對docker registry做了封裝,擴充套件了自己的業務模板。

在這裡插入圖片描述

1. Proxy: Harbor的registry、UI、token services等元件,都處在一個反向代理後邊。該代理將來自瀏覽器、docker clients的請求轉發到後端服務上。
2. Registry: 負責儲存Docker映象,以及處理Docker push/pull請求。因為Harbor強制要求對映象的訪問做許可權控制, 在每一次push/pull請求時,Registry會強制要求客戶端從token service那裡獲得一個有效的token。
3. Core services: Harbor的核心功能,主要包括如下3個服務:
4. UI: 作為Registry Webhook, 以影像使用者介面的方式輔助使用者管理映象。
   1) WebHook是在registry中配置的一種機制, 當registry中映象發生改變時,就可以通知到Harbor的webhook endpoint。Harbor使用webhook來更新日誌、初始化同步job等。 
   2) Token service會根據該使用者在一個工程中的角色,為每一次的push/pull請求分配對應的token。假如相應的請求並沒有包含token的話,registry會將該請求重定向到token service。 
   3) Database 用於存放工程後設資料、使用者資料、角色資料、同步策略以及映象後設資料。
5. Job services: 主要用於映象複製,本地映象可以被同步到遠端Harbor例項上。
6. Log collector: 負責收集其他模組的日誌到一個地方

1.2 Harbor.cfg 配置檔案解析

Harbor.cfg 配置檔案中有兩類引數:所需引數和可選引數。
1)所需引數 這些引數需要在配置檔案 Harbor.cfg 中設定。

具體引數如下:

  • hostname:用於訪問使用者介面和 register 服務。它應該是目標機器的 IP 地址或完全限定的域名(FQDN)

例如 192.168.195.128 或 hub.kgc.cn。不要使用 localhost 或 127.0.0.1 為主機名。

  • ui_url_protocol:(http 或 https,預設為 http)用於訪問 UI 和令牌/通知服務的協議。如果公證處於啟用狀態,則此引數必須為 https。
  • max_job_workers:映象複製作業執行緒。
  • db_password:用於db_auth 的MySQL資料庫root 使用者的密碼。
  • customize_crt:該屬性可設定為開啟或關閉,預設開啟。開啟此屬性時,準備指令碼建立私鑰和根證照,用於生成/驗證登錄檔令牌。當由外部來源提供金鑰和根證照時,將此屬性設定為 off。
  • ssl_cert:SSL 證照的路徑,僅當協議設定為 https 時才應用。
  • ssl_cert_key:SSL 金鑰的路徑,僅當協議設定為 https 時才應用。
  • secretkey_path:用於在複製策略中加密或解密遠端 register 密碼的金鑰路徑。

(2)可選引數
這些引數對於更新是可選的,即使用者可以將其保留為預設值,並在啟動 Harbor 後在 Web UI 上進行更新。如果進入 Harbor.cfg,只會在第一次啟動 Harbor 時生效,隨後對這些引數 的更新,Harbor.cfg 將被忽略。

注意:如果選擇通過UI設定這些引數,請確保在啟動Harbour後立即執行此操作。具體來說,必須在註冊或在 Harbor 中建立任何新使用者之前設定所需的auth_mode。當系統中有使用者時(除了預設的 admin 使用者),auth_mode 不能被修改。具體引數如下:

  • Email:Harbor需要該引數才能向使用者傳送“密碼重置”電子郵件,並且只有在需要該功能時才需要。
    請注意,在預設情況下SSL連線時沒有啟用。如果SMTP伺服器需要SSL,但不支援STARTTLS,那麼應該通過設定啟用SSL email_ssl = TRUE。
  • harbour_admin_password:管理員的初始密碼,只在Harbour第一次啟動時生效。之後,此設定將被忽略,並且應 UI中設定管理員的密碼。
    請注意,預設的使用者名稱/密碼是 admin/Harbor12345。
  • auth_mode:使用的認證型別,預設情況下,它是 db_auth,即憑據儲存在資料庫中。對於LDAP身份驗證,請將其設定為 ldap_auth。
  • self_registration:啟用/禁用使用者註冊功能。禁用時,新使用者只能由 Admin 使用者建立,只有管理員使用者可以在 Harbour中建立新使用者。
    注意:當 auth_mode 設定為 ldap_auth 時,自注冊功能將始終處於禁用狀態,並且該標誌被忽略。
  • Token_expiration:由令牌服務建立的令牌的到期時間(分鐘),預設為 30 分鐘。
  • project_creation_restriction:用於控制哪些使用者有權建立專案的標誌。預設情況下, 每個人都可以建立一個專案。
    如果將其值設定為“adminonly”,那麼只有 admin 可以建立專案。
  • verify_remote_cert:開啟或關閉,預設開啟。此標誌決定了當Harbor與遠端 register 例項通訊時是否驗證 SSL/TLS 證照。將此屬性設定為 off 將繞過 SSL/TLS 驗證,這在遠端例項具有自簽名或不可信證照時經常使用。

預設情況下,Harbour 將映象儲存在本地檔案系統上。在生產環境中,可以考慮使用其他儲存後端而不是本地檔案系統。如 S3、Openstack Swif、Ceph 等。但需要更新 common/templates/registry/config.yml 檔案。

二、 部署Harbor私有倉庫

實驗目的

實現私有倉庫的搭建、映象的上傳與下載、Harbor私有倉庫的管理

實驗環境

VMware虛擬機器centos7兩臺,一臺作為私有倉庫伺服器,另一臺作為客戶端。

實驗引數

主機名IP地址所需軟體
harbor14.0.0.87docker-ce、harbor、docker-compose
client14.0.0.97docker-ce

實驗過程

1. 安裝Harbor

將docker-compose檔案拷貝到當前目錄下
[root@localhost ~]# chmod +x docker-compose 
[root@localhost ~]# mv docker-compose /usr/local/bin/
[root@localhost ~]# docker-compose -v     ##檢視docker-compose版本
docker-compose version 1.21.1, build 5a3f1a3
將軟體包拷貝到當前目錄下
[root@localhost ~]# ls
anaconda-ks.cfg                      initial-setup-ks.cfg  模板  圖片  下載  桌面
harbor-offline-installer-v1.2.2.tgz  公共                  視訊  文件  音樂
[root@localhost ~]# tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/   ##解壓到/usr/local/目錄下

2. 修改配置檔案

[root@localhost ~]# cd /usr/local/harbor/
[root@localhost harbor]# vim harbor.cfg

在這裡插入圖片描述
在這裡插入圖片描述

3. 開始執行安裝指令碼

[root@localhost harbor]# sh install.sh
...
省略部分內容
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-db          ... done
Creating harbor-adminserver ... done
Creating registry           ... done
Creating harbor-ui          ... done
Creating nginx              ... done
Creating harbor-jobservice  ... done

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

Now you should be able to visit the admin portal at http://14.0.0.87. 
For more details, please visit https://github.com/vmware/harbor .
[root@localhost harbor]# docker ps -a    ##檢視執行的容器
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                              NAMES
179db813fb24        vmware/harbor-jobservice:v1.2.2    "/harbor/harbor_jobs…"   45 seconds ago      Up 43 seconds                                                                          harbor-jobservice
f6031995c34b        vmware/nginx-photon:1.11.13        "nginx -g 'daemon of…"   45 seconds ago      Up 42 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
aa9ced711056        vmware/harbor-ui:v1.2.2            "/harbor/harbor_ui"      45 seconds ago      Up 44 seconds                                                                          harbor-ui
c779546373a1        vmware/harbor-adminserver:v1.2.2   "/harbor/harbor_admi…"   47 seconds ago      Up 45 seconds                                                                          harbor-adminserver
c3cf63d0f940        vmware/harbor-db:v1.2.2            "docker-entrypoint.s…"   47 seconds ago      Up 45 seconds       3306/tcp                                                           harbor-db
9c27195aeeb5        vmware/registry:2.6.2-photon       "/entrypoint.sh serv…"   47 seconds ago      Up 45 seconds       5000/tcp                                                           registry
0a591c89eb66        vmware/harbor-log:v1.2.2           "/bin/sh -c 'crond &…"   48 seconds ago      Up 46 seconds       127.0.0.1:1514->514/tcp                                            harbor-log

4. 登入Harbor

在這裡插入圖片描述

5. 新增專案

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

6. 上傳映象

上傳映象的步驟

  1. 登入
    docker login -u admin -p Harbor12345 http://127.0.0.1
  2. 下載映象進行測試
    docker pull cirros
  3. 映象打標籤
    docker tag cirros 127.0.0.1/myproject-dog/cirros:v1
  4. 上傳映象到Harbor
    docker push 127.0.0.1/myproject-dog/cirros:v1
[root@localhost harbor]# docker login -u admin -p Harbor12345 http://127.0.0.1    ##使用docker命令進行本地登入
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@localhost harbor]# docker pull nginx    ##下載nginx映象,這裡是從官網下載
[root@localhost harbor]# docker tag nginx:latest 127.0.0.1/dog/nginx:v1    ##給nginx映象打標籤
[root@localhost harbor]# docker push 127.0.0.1/dog/nginx     ##上傳nginx映象到Harbor倉庫
The push refers to repository [127.0.0.1/dog/nginx]
908cf8238301: Pushed 
eabfa4cd2d12: Pushed 
60c688e8765e: Pushed 
f431d0917d41: Pushed 
07cab4339852: Pushed 
v1: digest: sha256:794275d96b4ab96eeb954728a7bf11156570e8372ecd5ed0cbc7280313a27d19 size: 1362

在這裡插入圖片描述

在這裡插入圖片描述

7. 其他客戶機登入私庫

如果使用登入Harbor的命令直接登入Harbor,就會出現以下的報錯資訊

在新的客戶端伺服器14.0.0.97
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
[root@localhost ~]# docker login -u admin -p Harbor12345 http://14.0.0.87
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://14.0.0.87/v2/: dial tcp 14.0.0.87:443: connect: connection refused

可以使用以下的辦法進行解決
第一種:

[root@localhost ~]# vim /usr/lib/systemd/system/docker.service 
[root@localhost ~]# 

ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry  192.168.245.209 --containerd=/run/containerd/containerd.sock

[root@localhost ~]# systemctl daemon-reload 
[root@localhost ~]# systemctl restart docker

在這裡插入圖片描述

[root@docker ~]# vim /etc/docker/daemon.json
{
    "insecure-registries": ["14.0.0.87:5000"]
}

然後進行登入

[root@localhost ~]# docker login -u admin -p Harbor12345 http://14.0.0.87
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

8. 客戶機上傳映象

[root@localhost ~]# docker pull centos:7    ##下載映象
7: Pulling from library/centos
75f829a71a1c: Pull complete 
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@localhost ~]# docker tag centos:7 14.0.0.87/dog/centos:v1   ##打標籤
[root@localhost ~]# docker push 14.0.0.87/dog/centos:v1     ##上傳到私庫
The push refers to repository [14.0.0.87/dog/centos]  
613be09ab3c0: Pushed 
v1: digest: sha256:fe2347002c630d5d61bf2f28f21246ad1c21cc6fd343e70b4cf1e5102f8711a9 size: 529

在這裡插入圖片描述
在這裡插入圖片描述

9.下載映象

  1. 在harbor伺服器下載其他客戶機上傳的映象
[root@localhost harbor]# docker pull 127.0.0.1/dog/centos:v1     ##下載映象,用127.0.0.1是因為就在harbor伺服器本地下載
v1: Pulling from dog/centos
75f829a71a1c: Pull complete 
Digest: sha256:fe2347002c630d5d61bf2f28f21246ad1c21cc6fd343e70b4cf1e5102f8711a9
Status: Downloaded newer image for 127.0.0.1/dog/centos:v1
127.0.0.1/dog/centos:v1

在這裡插入圖片描述

10. 使用者管理

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在客戶端用新建的賬戶dogsheng登入

[root@localhost ~]# docker logout 14.0.0.87    ##首先退出之前的登入
Removing login credentials for 14.0.0.87
[root@localhost ~]# docker login 14.0.0.87     ##使用登入命令
Username: dogsheng      ##輸入登入使用者名稱
Password:               ##輸入登入密碼
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

當專案設為公開後,任何人都有此專案下映象的讀許可權。命令列使用者不需要“docker login”就可以拉取此專案下的映象。

11. Harbor的啟動與停止

如果需要修改Harbor的配置檔案harbor.cfg,因為Harbor是基於docker-compose服務編排的,我們可以使用docker-compose命令重啟Harbor。
啟動

[root@localhost harbor]# docker-compose up -d
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registry           ... done
Creating harbor-adminserver ... done
Creating harbor-db          ... done
Creating harbor-ui          ... done
Creating nginx              ... done
Creating harbor-jobservice  ... done

停止

[root@localhost harbor]# docker-compose down -v
Stopping harbor-jobservice  ... done
Stopping nginx              ... done
Stopping harbor-ui          ... done
Stopping harbor-adminserver ... done
Stopping harbor-db          ... done
Stopping registry           ... done
Stopping harbor-log         ... done
Removing harbor-jobservice  ... done
Removing nginx              ... done
Removing harbor-ui          ... done
Removing harbor-adminserver ... done
Removing harbor-db          ... done
Removing registry           ... done
Removing harbor-log         ... done
Removing network harbor_harbor

相關文章