私有化輕量級持續集成部署方案--06-私有鏡像倉庫-Harbor


提示:本系列筆記全部存在於 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

PS:注意版本號

Harbor 部署配置

Harbor 目錄中兩個關鍵文件是: harbor.yml.tmlinstall.sh

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

install.sh 是執行文件,執行此文件就可以進行部署。

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;
    }
}

重啟網關服務

docker exec -it gateway nginx -s reload

執行部署

此時,就可以執行 install.sh 文件進行部署

部署完成后,Harbor 會創建一個名為 harborDocker Compose

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

讓人頭疼的是容器命名規則,並沒有添加 harbor 前綴,對於強迫症來說真心難受。。。

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

Harbor 頁面

Harbor 的主頁面是 項目 模塊。

項目 是一個鏡像組,一個 項目 內可以存儲多個鏡像。

Harbor 默認創建了一個名為 library 的公開項目。

可以根據實際情況創建自己的項目

在此創建名為一個 mwjz 的私有項目,用來存儲 deploy-web-demo 鏡像

PS: 其它模塊可自行查看

Harbor 持續集成

Harbor 鏡像 拉取、推送 路徑規則是: 主機名/項目/鏡像名稱

也就是 mwjz 項目 deploy-web-demo 鏡像拉取、推送的地址為: docker.mwjz.live/mwjz/deploy-web-demo

服務器配置

更新 Docker Compose

web 項目 Docker Compose 文件中拉取鏡像地址要改為 Harbor 倉庫地址。

登錄 Harbor

Harbor 倉庫 mwjz 是一個私有項目,需要登錄才允許 拉取、推送。

服務器中測試拉取操作,不登錄情況下會直接返回無權限錯誤。

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

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

Harbor 倉庫登錄成功后, Docker 會在 /root/.docker/config.json 文件中添加當前倉庫的登錄憑證。

Drone 持續集成需要使用到此登錄憑證。

Drone 配置

Secret配置

  1. 鏡像拉取登錄憑證

    Drone 引擎中容器是一個純凈的運行環境,無法直接使用服務器的登錄憑證拉取私有倉庫鏡像。

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

    也就是需要在 Secret 配置倉庫登錄憑證信息:docker_auth_config,屬性值就是 /root/.docker/config.json 文件內容。

    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 解決。

實在解決不了可以留言。


免責聲明!

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



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