Docker 企業級鏡像倉庫 Harbor 的搭建與維護


一、什么是 Harbor

Harbor 是一個開源的雲本地 registry 倉庫,可以用於管理和儲存 Docker 鏡像。Harbor 支持在多個倉庫直接進行復制鏡像,提供用戶管理和訪問控制和活動審計。

Harbor 由以下服務組成(每個服務都由一個容器運行):

  • nginx
  • harbor-jobservice
  • harbor-portal
  • harbor-core
  • registryctl
  • harbor-db
  • redis
  • registry
  • harbor-log

本文搭建的 Harbor 是基於 1.8.0,因為我最近准備寫這個文檔的時候,就發現 Harbor 最新版本為 1.8.0 了,本着追尋潮流,引領時尚的做人原則,就選擇基於 1.8.0 來書寫這篇文檔,1.8.0 相對於之前的版本還是有比較多的更新的。

  • 支持 OpenID Connect
  • 支持機器人賬戶,可以將機器人賬戶設置只具有推送和拉取鏡像的權限。
  • 復制改進,擴展 Harbor-to-Harbor 的復制功能,增加了 Harbor --> Docker Hub 、Harbor---> Docker Registry 、Harbor---> Huawei Registry 的功能。
  • 支持定時清理任務,支持狀態檢查 API,增加了新的項目角色,不僅僅是開發人員和管理員,還有維護人員、訪客。
  • 引入 harbor.yml 替代 harbor.cfg,Docker Registry 升級到 2.7.1。

二、Harbor 安裝

官方安裝文檔(2019.0514): https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

官方文檔的安裝方法主要還是針對於 1.8.0 之前的版本,后續官方應該會對 1.8.0 版本進行更新文檔。暫時沒有針對新的版本的文檔。

Harbor 的安裝是基於 docker-compose ,通過構建多個容器來組成一個服務。

2.1、Harbor 安裝環境

Harbor 的硬件需求

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

軟件需求

Software Version Description
Python version 2.7 or higher Note that you may have to install Python on Linux distributions (Gentoo, Arch) that do not come with a Python interpreter installed by default
Docker engine version 17.03.0-ce+ or higher For installation instructions, please refer to: https://docs.docker.com/engine/installation/
Docker Compose version 1.18.0 or higher For installation instructions, please refer to: https://docs.docker.com/compose/install/
Openssl latest is preferred Generate certificate and keys for Harbor

端口需求

Port Protocol Description
443 HTTPS Harbor portal and core API will accept requests on this port for https protocol
4443 HTTPS Connections to the Docker Content Trust service for Harbor, only needed when Notary is enabled
80 HTTP Harbor portal and core API will accept requests on this port for http protocol

目前,Harbor 使用的數據庫僅支持 PostgreSQL 數據庫。

2.2、Harbor安裝

Harbor 有兩種安裝方法:

  • 在線安裝,在線安裝需要網絡,安裝包非常小。
  • 離線安裝,離線安裝,本地主機可以沒有網絡,安裝包會比較大。

我們這里選擇的是離線安裝,避免因國內網絡問題導致安裝耗時比較久。

安裝 docker-compose ,版本需要1.18.0+

curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

安裝 Harbor

# 獲取需要安裝的版本
https://github.com/goharbor/harbor/releases
# 下載
cd /opt/  &&  wget 下載版本鏈接
tar -xzf harbor-offline-installer*
cd harbor 
#  編輯配置文件 harbor.yml
vim  harbor.yml 
#  需要更改的參數
hostname: 192.168.15.170  # 綁定ip,不能使用127.0.0.1和localhost
http:  # 監聽端口,默認80,也就是我們 管理ui訪問的端口
  port: 80
harbor_admin_password: Harbor12345 # 設置管理員密碼
## 還可以設置啟動 https,並指定證書,和指定數據目錄

# 安裝 
./install.sh

默認安裝是不包含 Notary 和 Clair (用於漏洞掃描)。但是已經與他們集成了。我們可以使用

默認是使用 HTTP 協議,我們可以配置證書並使用 HTTPS 來訪問 Harbor。

2.3 配置HTTPS

說實話我開始是抵觸的,我不想去使用它,但是當我考慮到,我不可能暫停我所有已經運行的容器來修改配置,來解決 docker login的問題,所有我只能老老實實的來配置 HTTPS ,這個煩人的 HTTPS。

官方配置文檔: https://github.com/goharbor/harbor/blob/master/docs/configure_https.md

我們這里演示的是創建自己的 證書,實際生產環境中我們可以去阿里雲或者其他雲服務器廠商申請免費的 證書。

創建證書

# 創建存放證書的目錄
mkdir -p /data/cert/
cd   /data/cert/
# 創建自簽名證書key文件
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
    -subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=192.168.15.170" \
    -key ca.key \
    -out ca.crt #CN 替換為你的倉庫域名

修改配置

#配置 HTTPS 配置
https:
#   # https port for harbor, default is 443
   port: 443
#   # The path of cert and key files for nginx
   certificate: /data/cert/ca.crt
   private_key: /data/cert/ca.key

重新初始化 Harbor

# 暫停
docker-compose down -v
prepare  # 生成配置文件,根據 harbor.yml 配置生成docker-compose文件。
docker-compose up -d  # 后台啟動

客戶端配置

將 Harbor 生成的證書 /data/cert/ca.crt 復制到 客戶端的 /etc/docker/certs.d/倉庫域名/

然后重啟docker 。

docker  login  倉庫域名 

三、Harbor 的使用

3.1、登錄Harbor並使用

登錄網址 : ip,http://192.168.15.170

默認的用戶名和密碼是:

用戶名:admin
密碼: Harbor12345

登錄 Harbor 並創建一個私有項目 test 。

1.8.0版本使用界面圖

1.7.5版本使用界面圖

登錄界面

(不知道為啥上面有一坨綠色,難道是……,不可能的)。

本地登錄 並且上傳鏡像

docker  login 192.168.15.170

docker  tag  centos:latest   192.168.15.170/test/centos:latest  # tag 名稱= 倉庫地址/項目名稱/鏡像名稱:標記(版本號)
docker  push  192.168.15.170/test/centos:latest

下載鏡像

docker pull 192.168.15.170/test/centos:latest

3.2、注意事項

在進行登錄的過程中我們會遇到以下的問題,我們也給出了解決辦法。

# 登錄
docker  login 192.168.15.170
# 登錄報錯
[root@localhost harbor]# docker  login  192.168.15.170
Username: admin
Password: 
Error response from daemon: Get https://192.168.15.170/v2/: dial tcp 192.168.15.170:443: connect: connection refused

# 解決辦法 ,官方的安裝文檔也是有寫到這個問題
在 dockerd 啟動參數中加上  --insecure-registry=192.168.15.170 
編輯配置文件  /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock  --insecure-registry=192.168.15.170

四、Harbor 管理

4.1 啟動暫停

我們可以使用 docker-compose 來管理 Harbor 的生命周期,以下命令的運行環境目錄需要與 docker-compose.yml 是同一個目錄。

# 暫停 Harbor
docker-compose  stop
# 啟動 Harbor
docker-compose  start


# 更改 harbor.yml,1.8.0之前的版本配置文件是 harbor.cfg 
docker-compose  down -v 
vim  harbor.yml # 更改配置
prepare  # 生成配置文件,根據 harbor.yml 配置生成docker-compose文件。
docker-compose up -d

# 刪除 Harbor 的容器,將鏡像數據和 Harbor的數據庫文件保存在文件系統上。
docker-compose  down -v 

# 徹底地刪除 Harbor 的數據和鏡像
 rm -r /data/database
 rm -r /data/registry

默認情況下,Harbor 的數據保存在 /data/ 下,即使我們刪除或者重建 Harbor 數據不會發生改變。並且 Harbor 使用了 rsyslog 來進行收集每個容器的日志,默認情況下,這些日志文件儲存在主機的 /var/loh/harbor/

更改配置文件

Harbor 默認的監聽端口是 80(HTTP)和 443(HTTPS).

對於1.8.0版本

方法一 : 更改 harbor.yml 配置文件

在配置文件中有配置 監聽端口 和使用具體協議的位置,我們根據各自需求進行設置。

注意,我們這邊進行更改 docker-compose.yml 配置文件 來更改配置是無效的,因為當我們運行了 prepare docker-compose文件就會被重寫,所以更改 docker-compose.yml 是無效的。

對於1.8.0之前的版本

對於 HTTP 協議。

方法一 :更改 docker-compose.yml 配置文件

  proxy:
    image: goharbor/nginx-photon:v1.7.5
    container_name: nginx
    restart: always
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
      - NET_BIND_SERVICE
    volumes:
      - ./common/config/nginx:/etc/nginx:z
    networks:
      - harbor
    dns_search: .
    ports:
      - 80:80
      - 443:443
      - 4443:4443
    depends_on:
      - postgresql
      - registry
      - core
      - portal
      - log
    logging:
      driver: "syslog"
      options:
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "proxy"
#  將原有的內部監聽80端口替換為 8888
  proxy:
    image: goharbor/nginx-photon:v1.7.5
    container_name: nginx
    restart: always
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
      - NET_BIND_SERVICE
    volumes:
      - ./common/config/nginx:/etc/nginx:z
    networks:
      - harbor
    dns_search: .
    ports:
      - 8888:80
      - 443:443
      - 4443:4443
    depends_on:
      - postgresql
      - registry
      - core
      - portal
      - log
    logging:
      driver: "syslog"
      options:
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "proxy"

方法二 更改 harbor.cfg ,將端口添加到參數 hostname上。

hostname = 192.168.15.170:8888

對於HTTPS 協議

跟配置 HTTP 協議一致。

更改了配置之后,我們需要重新部署 Harbor.

#  以下命令在 docker-compose.yml 文件所在目錄中運行
./prepare
docker-compose  up -d

2020年3月14號

最近一個群友反饋的一問題,就是 docker 在push 鏡像到 harbor 的時候, 有報錯:

blob upload unknown

了解到這個哥們在 harbor 前面加了 Nginx.
他在 Nginx 配置里有 proxy_set_header Host $http_host 這個,我們把這個注釋后,reload 了一下 Nginx,就可以了。
這個問題初步判斷,是不是 harbor 會對 Host 的值進行驗證。這個后續再去探究。


免責聲明!

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



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