私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

莫問今朝乄發表於2022-02-24
提示:本系列筆記全部存在於 Github, 可以直接在 Github 檢視全部筆記

針對私有映象倉庫的問題,Docker 官方提供了搭建倉庫服務的映象服務:registry,使用此映象就可以部署私有倉庫。

但官方提供的這個服務特別輕量化,甚至連 UI 管理頁面都沒有, 這也就帶來了較高的管理維護成本。

針對這個問題開源社群有不少為 registry 提供 UI管理 的專案,也有基於 registry,二次開發的專案

其中基於 registry 二次開發的代表專案是 Harbor, 也是企業級中比較常用的解決方案之一

Harbor

Harbor 概述

Harbor 專案是以 registry 為基礎的映象倉庫,另外提供了管理 UI, 基於角色的訪問控制(Role Based Access Control),AD/LDAP 整合、以及審計日誌(Audit logging) 等企業使用者需求的功能,同時還原生支援中文。

可以說 Harbor 提供了完備的管理系統以彌補 registry 的不足。

在資源佔用方面 Harbor 也比較小。

Harbor 部署

Harbor 下載

HarborGithub 中 提供了兩種部署方式

  1. 離線安裝
  2. 線上安裝

兩種部署方式都以 Docker Compose 為基礎的部署配置,不同的是 離線安裝壓縮包內包括了部署使用的映象。

推薦本地下載離線版本,上傳到伺服器解壓部署。

sudo tar xf /tgz/harbor-offline-installer-v2.4.1.tgz

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor 私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

PS:注意版本號

Harbor 部署配置

Harbor 目錄中兩個關鍵檔案是: harbor.yml.tmlinstall.sh

harbor.yml.tml 是配置檔案模板,需要將此檔案改為 harbor.yml,部署時會使用 harbor.yml 配置檔案。

install.sh 是執行檔案,執行此檔案就可以進行部署。

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

harbor.yml 配置檔案中預設了許多屬性,可以對需要的屬性進行修改。

在此只列出了更改後的屬性。

# 設定訪問地址,可以使用ip、域名,不可以設定為127.0.0.1或localhost。
# 訪問地址
hostname: docker.mwjz.live

# HTTP 訪問協議設定
http:
  # http訪問埠號
  port: 8433

# 禁用HTTPS協議訪問
#https:
# https port for harbor, default is 443
#  port: 443
# The path of cert and key files for nginx
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path

# admin 使用者密碼
harbor_admin_password: XXXXXXX

# 資料庫設定
database:
  # 資料庫密碼
  password: XXXXXX

# Harbor資料掛載目錄
data_volume: /volumes/harbor

Harbor 應用的頁面訪問、 拉取推送 等操作 都是使用配置檔案中 hostname 屬性值, 所以在此一步到位設定了 閘道器代理

PS:Harbor 推薦使用 HTTPS 協議,在此使用了閘道器,所以只設定了 HTTP 協議

配置閘道器

閘道器 只需要配置 Nginx 屬性即可。

server {
    #SSL 訪問埠號為 443
    listen 443 ssl http2;
    #填寫繫結證照的域名
    server_name docker.mwjz.live;
    #上傳大小限制
    client_max_body_size 3000M;
    #日誌
    error_log /var/log/nginx/docker/error.log;
    access_log /var/log/nginx/docker/access.log;
    #證照檔案
    ssl_certificate /etc/nginx/conf.d/ssl/docker/docker.mwjz.live_bundle.crt;
    #證照金鑰檔案
    ssl_certificate_key /etc/nginx/conf.d/ssl/docker/docker.mwjz.live.key;

    ssl_ciphers SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!3DES:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass http://10.0.24.12:8433;
    }
}

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor 私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

重啟閘道器服務

docker exec -it gateway nginx -s reload

執行部署

此時,就可以執行 install.sh 檔案進行部署

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor 私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

部署完成後,Harbor 會建立一個名為 harborDocker Compose

並且會啟動 9 個容器服務。

讓人頭疼的是容器命名規則,並沒有新增 harbor 字首,對於強迫症來說真心難受。。。

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

部署完成後,訪問 Harbor ,會跳轉到登入頁,使用 管理員(admin) 賬號登入。

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

Harbor 頁面

Harbor 的主頁面是 專案 模組。

專案 是一個映象組,一個 專案 內可以儲存多個映象。

Harbor 預設建立了一個名為 library 的公開專案。

可以根據實際情況建立自己的專案

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

在此建立名為一個 mwjz 的私有專案,用來儲存 deploy-web-demo 映象

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor 私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

PS: 其它模組可自行檢視

Harbor 持續整合

Harbor 映象 拉取、推送 路徑規則是: 主機名/專案/映象名稱

也就是 mwjz 專案 deploy-web-demo 映象拉取、推送的地址為: docker.mwjz.live/mwjz/deploy-web-demo

伺服器配置

更新 Docker Compose

web 專案 Docker Compose 檔案中拉取映象地址要改為 Harbor 倉庫地址。

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

登入 Harbor

Harbor 倉庫 mwjz 是一個私有專案,需要登入才允許 拉取、推送。

伺服器中測試拉取操作,不登入情況下會直接返回無許可權錯誤。

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

使用 Docker 登入 Harbor 倉庫時,注意 必須使用 sudo 或者 root 使用者登入,否則其它使用者無法使用此登入憑證

注意:必須使用 sudo 或者 root 使用者登入,否則其它使用者無法使用此登入憑證

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

Harbor 倉庫登入成功後, Docker 會在 /root/.docker/config.json 檔案中新增當前倉庫的登入憑證。

Drone 持續整合需要使用到此登入憑證。

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor 私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

Drone 配置

Secret配置

  1. 映象拉取登入憑證

    Drone 引擎中容器是一個純淨的執行環境,無法直接使用伺服器的登入憑證拉取私有倉庫映象。

    針對這個問題, Drone 預定義了一個 image_pull_secrets 屬性,image_pull_secrets 會從 Secret 讀取倉庫登入憑證,執行登入操作。

    也就是需要在 Secret 配置倉庫登入憑證資訊:docker_auth_config,屬性值就是 /root/.docker/config.json 檔案內容。

    私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

    PS: 注意,登入憑證必須使用 sudoroot 使用者登入,否則不具有拉取許可權

  2. 映象推送賬號

    docker_usernamedocker_password 兩個 Secret 屬性值改為 Harbor 倉庫的賬號密碼。

.drone.yml 配置

.drone.yml 檔案主要的改動點是 映象名稱 和 倉庫地址

  1. build-image 步驟:

    repo 屬性值設定為 docker.mwjz.live/mwjz/deploy-web-demo

    並新增 registry 屬性, 屬性值為 docker.mwjz.live(Harbor 倉庫 hostname)

  2. deploy-project 步驟

    將映象拉取地址修改為 docker.mwjz.live/mwjz/deploy-web-demo

  3. deploy 管道:

    需要在 deploy 管道中設定 私有倉庫登入憑證金鑰屬性:image_pull_secrets

kind: pipeline          # 定義一個管道
type: docker            # 定義管道型別
name: build              # 定義管道名稱

steps:
- name: build-image     # 步驟名稱
    image: plugins/docker # 使用映象
    depends_on: [build-tags, build-project] # 依賴步驟
    settings:             # 當前設定
      username:           # 賬號名稱
        from_secret: docker_username
      password:           # 賬號密碼
        from_secret: docker_password
      dockerfile: deploy/Dockerfile # Dockerfile地址, 注意是相對地址
      registry: docker.mwjz.live  # 私有映象倉庫地址
      repo: docker.mwjz.live/mwjz/deploy-web-demo # 映象名稱

---

kind: pipeline
type: docker
name: deploy


image_pull_secrets: # 私有映象拉取憑證金鑰
  - docker_auth_config

steps:

  - name: deploy-project
    image: appleboy/drone-ssh
    settings:
      host:
        from_secret: server_host
      user:
        from_secret: server_username
      password:
        from_secret: server_password
      port: 22
      # insecure: false  如果拉取的映象地址使用的是http協議,則將此屬性設定為true
      command_timeout: 3m
      script:
        - echo ====開始部署=======
        - docker pull docker.mwjz.live/mwjz/deploy-web-demo:latest
        - docker-compose -p web down
        - docker volume rm web-nginx
        - docker-compose -f /yml/docker-compose/web.yml -p web up -d
        - docker rmi $(docker images | grep deploy-web-demo | grep none | awk  '{print $3}')
        - echo ====部署成功=======

執行測試

全部準備完成後, 可以修改專案版本號,進行測試構建。

構建時可能還會有其它問題,但一般都是小問題,可以檢查配置或查詢 Google 解決。

實在解決不了可以留言。

私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor 私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor 私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor 私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor

相關文章