針對私有鏡像倉庫的問題,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 解決。
實在解決不了可以留言。
