【Harbor學習筆記】-教你快速搭建Docker私有倉庫

Docker容器應用的開發和運行離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,可是從安全和效率等方面考慮,部署咱們私有環境內的Registry也是很是必要的。Harbor 是由VMware公司開源的企業級的Docker Registry管理項目,它包括權限管理(RBAC)、LDAP、日誌審覈、管理界面、自我註冊、鏡像複製和中文支持等功能。前端

Harbor 的全部組件都在 Dcoker 中部署,因此 Harbor 可以使用 Docker Compose 快速部署。node

注: 因爲 Harbor 是基於 Docker Registry V2 版本,因此 docker 版本必須 > = 1.10.0 docker-compose >= 1.6.0mysql

Harbor的目標是幫助用戶迅速搭建一個企業級的Docker registry服務。它以Docker公司開源的registry爲基礎,額外提供了以下功能:linux

  • 基於角色的訪問控制(Role Based Access Control)
  • 基於策略的鏡像複製(Policy based image replication)
  • 鏡像的漏洞掃描(Vulnerability Scanning)
  • AD/LDAP集成(LDAP/AD support)
  • 鏡像的刪除和空間清理(Image deletion & garbage collection)
  • 友好的管理UI(Graphical user portal)
  • 審計日誌(Audit logging)
  • RESTful API
  • 部署簡單(Easy deployment)

架構圖

Harbor的每一個組件都是以Docker容器的形式構建的,可使用Docker Compose來進行部署。若是環境中使用了kubernetes,Harbor也提供了kubernetes的配置文件。nginx

Harbor大概須要如下幾個容器組成:ui(Harbor的核心服務)、log(運行着rsyslog的容器,進行日誌收集)、mysql(由官方mysql鏡像構成的數據庫容器)、Nginx(使用Nginx作反向代理)、registry(官方的Docker registry)、adminserver(Harbor的配置數據管理器)、jobservice(Harbor的任務管理服務)、redis(用於存儲session)。git

Harbor是一個用於存儲和分發Docker鏡像的企業級Registry服務器,總體架構仍是很清晰的。下面借用了網上的架構圖:github

Harbor依賴的外部組件

  • -> Nginx(即Proxy代理層): Nginx前端代理,主要用於分發前端頁面ui訪問和鏡像上傳和下載流量; Harbor的registry,UI,token等服務,經過一個前置的反向代理統一接收瀏覽器、Docker客戶端的請求,並將請求轉發給後端不一樣的服務。web

  • -> Registry v2: 鏡像倉庫,負責存儲鏡像文件; Docker官方鏡像倉庫, 負責儲存Docker鏡像,並處理docker push/pull命令。因爲咱們要對用戶進行訪問控制,即不一樣用戶對Docker image有不一樣的讀寫權限,Registry會指向一個token服務,強制用戶的每次docker pull/push請求都要攜帶一個合法的token, Registry會經過公鑰對token進行解密驗證。redis

  • -> Database(MySQL或Postgresql):爲core services提供數據庫服務,負責儲存用戶權限、審計日誌、Docker image分組信息等數據。sql

Harbor自有組件

  • -> Core services(Admin Server): 這是Harbor的核心功能,主要提供如下服務:

    *   \-> UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 並對用戶進行受權。
    *   \-> webhook:爲了及時獲取registry 上image狀態變化的狀況, 在Registry上配置webhook,把狀態變化傳遞給UI模塊。
    *   \-> Auth服務:負責根據用戶權限給每一個docker push/pull命令簽發token. Docker 客戶端向Regiøstry服務發起的請求,若是不包含token,會被重定向到這裏,得到token後再從新向Registry進行請求。
    *   \-> API: 提供Harbor RESTful API
  • -> Replication Job Service:提供多個 Harbor 實例之間的鏡像同步功能。
  • -> Log collector:爲了幫助監控Harbor運行,負責收集其餘組件的log,供往後進行分析。

核心組件

  • Proxy:一個nginx的前端代理,代理Harbor的registry,UI, token等服務。-經過深藍色先標識

  • db:負責儲存用戶權限、審計日誌、Dockerimage分組信息等數據。

  • UI:提供圖形化界面,幫助用戶管理registry上的鏡像, 並對用戶進行受權。

  • jobsevice:jobsevice是負責鏡像複製工做的,他和registry通訊,從一個registry pull鏡像而後push到另外一個registry,並記錄job\_log。經過紫色線標識

  • Adminserver:是系統的配置管理中心附帶檢查存儲用量,ui和jobserver啓動時候回須要加載adminserver的配置。經過灰色線標識;

  • Registry:鏡像倉庫,負責存儲鏡像文件。當鏡像上傳完畢後經過hook通知ui建立repository,上圖經過紅色線標識,固然registry的token認證也是經過ui組件完成。經過紅色線標識

  • Log:爲了幫助監控Harbor運行,負責收集其餘組件的log,供往後進行分析。過docker的log-driver把日誌彙總到一塊兒,經過淺藍色線條標識

    [![](/img/bVcReF4)](https://gitee.com/owen2016/pic-hub/raw/master/pics/20201215235702.png)

安裝

1. 下載離線安裝包

  • Harbor以容器的形式進行部署, 所以能夠被部署到任何支持Docker的Linux發行版, 要使用Harbor,須要安裝docker和docker-compose編排工具

  • 訪問harbor release page,下載Harbor軟件tgz壓縮包

  • 或執行以下命令 wget https://storage.googleapis.com/harbor-releases/release-2.0.0/harbor-offline-installer-latest.tgz

  • 解壓tgz壓縮包

    `tar xvf harbor-offline-installer-<version>.tgz`

2. 配置 harbor.cfg (harbor.yml)

注: 新版本是.yaml文件,以前版本是.conf 或者 .cfg文件

  • 解壓後文件在當前目錄下的harbor/目錄下

    ```
    `cd harbor/`
    `vim harbor.cfg`
    `harbor_admin_password = Harbor12345`
    
    ```

3. 啓動 Harbor

  • 配置完後,執行安裝腳本 ./install.sh

    ```
    `#會拉取好幾個鏡像下來,及檢查環境`
    `Note: docker version: 1.12.5`
    `Note: docker-compose version: 1.9.0`
    `[Step 0]: checking installation environment ...`
    `....`
    `[Step 1]: loading Harbor images ...`
    `....`
    `[Step 2]: preparing environment ...`
    `....`
    `[Step 3]: checking existing instance of Harbor ...`
    `....`
    `[Step 4]: starting Harbor ...`
    `✔ ----Harbor has been installed and started successfully.----`
    `...`
    `For more details, please visit https://github.com/vmware/harbor .`
    
    ```
    
    安裝完成後,會發現解壓目錄harbor下面多了一個docker-compose.yml文件,裏面包含了harbor依賴的鏡像和對應容器建立的信息
  • 執行 docker-compose ps (執行docker-compose需在包含docker-compose.yml的目錄) , 確保 container 的狀態都是up (healthy).

  • 若是安裝一切順利,經過以前在harbor.cfg配置的hostname便可以訪問到前端了.

安裝配置問題

Harbor安裝 以後,須要用docker-compose ps 命令去查看狀態,保證全部docker 容器都是 healthy, 不然 極可能login harbor 失敗

若是那個service 啓動不正常,就去查看/var/log/harbor/ 下對應的log

`owen@swarm-node-107:/disk/harbor_v2.0.0$ ls /var/log/harbor/ -lht`
`總用量 22M`
`-rw-r--r-- 1 10000 10000 3.5M 12月 15 23:03 registryctl.log`
`-rw-r--r-- 1 10000 10000 5.4M 12月 15 23:02 core.log`
`-rw-r--r-- 1 10000 10000 4.4M 12月 15 23:02 portal.log`
`-rw-r--r-- 1 10000 10000 4.9M 12月 15 23:02 registry.log`
`-rw-r--r-- 1 10000 10000 1.2M 12月 15 23:02 proxy.log`
`-rw-r--r-- 1 10000 10000 392K 12月 15 23:00 redis.log`
`-rw-r--r-- 1 10000 10000 1.6M 12月 15 23:00 jobservice.log`
`-rw-r--r-- 1 10000 10000  53K 12月 14 21:42 postgresql.log`
`-rw-r--r-- 1 10000 10000  65K 7月   7 23:35 clair.log`
`-rw-r--r-- 1 10000 10000 1.2K 7月   5 11:43 clair-adapter.log`
`-rw-r--r-- 1 10000 10000 1.4K 7月   5 11:38 chartmuseum.log`

修改harbor的運行配置,須要以下步驟:

`# 中止 harbor`
 `docker-compose down -v`
`# 修改配置`
 `vim harbor.cfg`
`# 執行./prepare已更新配置到docker-compose.yml文件`
 `./prepare`
`# 啓動 harbor`
 `docker-compose up -d`

問題-1 服務啓動異常

ubuntu@172-20-16-51:/opt/harbor$ docker login 192.20.16.51
Username: admin
Password:
Error response from daemon: login attempt to http://192.20.16.51/v2/ failed with status: 502 Bad Gateway

Harbor-db service 不能正常啓動,最後查看postgresql.log 發現下面 message.

`| initdb: directory "/var/lib/postgresql/data" exists but is not empty`
 `| If you want to create a new database system, either remove or empty`
 `| the directory "/var/lib/postgresql/data" or run initdb`
 `| with an argument other than "/var/lib/postgresql/data".`

由於當時/data/datebase 目錄下,確實不是empty, 手動改了docker-compose.yml ,而後 docker-compose up -d 從新啓動容器,服務正常

`postgresql:`
 `image: goharbor/harbor-db:v2.0.0`
 `container_name: harbor-db`
 `restart: always`
 `cap_drop:`
 `- ALL`
 `cap_add:`
 `- CHOWN`
 `- DAC_OVERRIDE`
 `- SETGID`
 `- SETUID`
 `volumes:`
 `- /data/database:/var/lib/postgresql/data:z`

問題-2- dial tcp xxx.xxx.xxx.xxx:443: connect: connection refused

`# docker login 192.20.16.51:80`
`Username: admin`
`Password:`
`Error response from daemon: Get https://192.20.16.51:80/v2/: http: server gave HTTP response to HTTPS client`
`或者`
`Error response from daemon: Get https://192.168.31.107/v2/: dial tcp 192.168.31.107:443: connect: connection refused`

docker1.3.2版本開始默認docker registry使用的是https,·Harbor默認安裝使用的是HTTP協議·,因此當執行用docker login、pull、push等命令操做非https的docker regsitry的時就會報錯。

臨時解決辦法:須要在每一臺harbor客戶端機器都要設置"insecure-registries" (完全解決須要啓動Harbor HTTPS證書)

  • 若是系統是MacOS,則能夠點擊「Preference」裏面的「Advanced」在「Insecure Registry」里加上hostname (e.g. docker.bksx.com),重啓Docker客戶端就能夠了。

  • 若是系統是Ubuntu,則修改配置文件/lib/systemd/system/docker.service,修改[Service]下ExecStart參數,增長–insecure-registry hostname (e.g. docker.bksx.com)

  • 若是系統是Centos,能夠修改配置/etc/sysconfig/docker,將OPTIONS增長 –insecure-registry hostname (e.g. docker.bksx.com)

若是是新版本的docker在/etc/sysconfig/ 沒有docker這個配置文件的狀況下。

`#在daemon.json中添加如下參數`
`[root@localhost harbor]# cat /etc/docker/daemon.json`
`{`
 `"insecure-registries": [`
 `"hostname"`
 `]`
`}`

注意:該文件必須符合 json 規範,不然 Docker 將不能啓動。另外hostname 必須與harbor.cfg 裏的hostname 一致。

添加完了後從新啓動 docker:systemctl daemon-reload && systemctl enable docker && systemctl restart docker

登陸後,帳號信息都保存到本機的~/.docker/config.json

`owen@swarm-manager-105:~/gitee/vnote_notebooks$ docker login 192.168.31.107`
`Username: admin`
`Password:` 
`WARNING! Your password will be stored unencrypted in /home/owen/.docker/config.json.`
`Configure a credential helper to remove this warning. See`
`https://docs.docker.com/engine/reference/commandline/login/#credentials-store`
`Login Succeeded`
`owen@swarm-manager-105:~/gitee/vnote_notebooks$ cat ~/.docker/config.json` 
`{`
 `"auths": {`
 `"192.168.31.107": {`
 `"auth": "YWRtaW46SGFyYm9yMTIzNDU="`
 `}`
 `},`
 `"HttpHeaders": {`
 `"User-Agent": "Docker-Client/19.03.14 (linux)"`
 `}`

問題-3 防止容器進程沒有權限讀取生成的配置

相關文章
相關標籤/搜索