針對私有映象倉庫的問題,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 下載
Harbor
在 Github 中 提供了兩種部署方式
- 離線安裝
- 線上安裝
兩種部署方式都以 Docker Compose
為基礎的部署配置,不同的是 離線安裝壓縮包內包括了部署使用的映象。
推薦本地下載離線版本,上傳到伺服器解壓部署。
sudo tar xf /tgz/harbor-offline-installer-v2.4.1.tgz
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223839-541856815.png)
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180222989-1780847567.png)
PS:注意版本號
Harbor 部署配置
Harbor 目錄中兩個關鍵檔案是: harbor.yml.tml 和 install.sh。
harbor.yml.tml 是配置檔案模板,需要將此檔案改為 harbor.yml,部署時會使用 harbor.yml 配置檔案。
install.sh 是執行檔案,執行此檔案就可以進行部署。
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223769-1678728992.png)
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](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180222974-903868178.png)
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223804-722646255.png)
重啟閘道器服務
docker exec -it gateway nginx -s reload
執行部署
此時,就可以執行 install.sh 檔案進行部署
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223912-116032674.png)
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180224121-1111958355.png)
部署完成後,Harbor
會建立一個名為 harbor 的 Docker Compose
並且會啟動 9 個容器服務。
讓人頭疼的是容器命名規則,並沒有新增 harbor 字首,對於強迫症來說真心難受。。。
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223008-519952051.png)
部署完成後,訪問 Harbor
,會跳轉到登入頁,使用 管理員(admin) 賬號登入。
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180224050-144509344.png)
Harbor 頁面
Harbor
的主頁面是 專案 模組。
專案 是一個映象組,一個 專案 內可以儲存多個映象。
Harbor
預設建立了一個名為 library 的公開專案。
可以根據實際情況建立自己的專案
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223980-1420953520.png)
在此建立名為一個 mwjz 的私有專案,用來儲存 deploy-web-demo 映象
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223020-1014888705.png)
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180224086-744332672.png)
PS: 其它模組可自行檢視
Harbor 持續整合
Harbor
映象 拉取、推送 路徑規則是: 主機名/專案/映象名稱
也就是 mwjz 專案 deploy-web-demo 映象拉取、推送的地址為: docker.mwjz.live/mwjz/deploy-web-demo
伺服器配置
更新 Docker Compose
web 專案 Docker Compose
檔案中拉取映象地址要改為 Harbor
倉庫地址。
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180224193-205299904.png)
登入 Harbor
Harbor
倉庫 mwjz 是一個私有專案,需要登入才允許 拉取、推送。
伺服器中測試拉取操作,不登入情況下會直接返回無許可權錯誤。
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223052-23653705.png)
使用 Docker
登入 Harbor
倉庫時,注意 必須使用 sudo
或者 root
使用者登入,否則其它使用者無法使用此登入憑證
注意:必須使用
sudo
或者root
使用者登入,否則其它使用者無法使用此登入憑證
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180224015-2031050478.png)
Harbor
倉庫登入成功後, Docker
會在 /root/.docker/config.json 檔案中新增當前倉庫的登入憑證。
Drone
持續整合需要使用到此登入憑證。
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180224158-1583731065.png)
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223084-716870316.png)
Drone 配置
Secret配置
-
映象拉取登入憑證
Drone
引擎中容器是一個純淨的執行環境,無法直接使用伺服器的登入憑證拉取私有倉庫映象。針對這個問題,
Drone
預定義了一個 image_pull_secrets 屬性,image_pull_secrets 會從Secret
讀取倉庫登入憑證,執行登入操作。也就是需要在
Secret
配置倉庫登入憑證資訊:docker_auth_config,屬性值就是 /root/.docker/config.json 檔案內容。PS: 注意,登入憑證必須使用
sudo
或root
使用者登入,否則不具有拉取許可權 -
映象推送賬號
將 docker_username、 docker_password 兩個
Secret
屬性值改為Harbor
倉庫的賬號密碼。
.drone.yml 配置
.drone.yml 檔案主要的改動點是 映象名稱 和 倉庫地址
-
build-image 步驟:
將 repo 屬性值設定為 docker.mwjz.live/mwjz/deploy-web-demo,
並新增 registry 屬性, 屬性值為 docker.mwjz.live(
Harbor
倉庫 hostname) -
deploy-project 步驟
將映象拉取地址修改為 docker.mwjz.live/mwjz/deploy-web-demo
-
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](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180224303-320482141.png)
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180224266-600208298.png)
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180223026-1901460581.png)
![私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor](https://img2022.cnblogs.com/blog/1147658/202202/1147658-20220213180224229-1409544617.png)