針對私有映象倉庫的問題,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
PS:注意版本號
Harbor 部署配置
Harbor 目錄中兩個關鍵檔案是: harbor.yml.tml 和 install.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
會建立一個名為 harbor 的 Docker 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配置
-
映象拉取登入憑證
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
解決。
實在解決不了可以留言。