Docker 企業級映象倉庫 Harbor 的搭建與維護

自由早晚亂餘生發表於2019-05-15

一、什麼是 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版本使用介面圖

Docker 企業級映象倉庫 Harbor 的搭建與維護

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

相關文章