debian12 創建本地harbor鏡像庫

来源:https://www.cnblogs.com/brian-sun/p/18277288
-Advertisement-
Play Games

前言 harbor是一個docker/podman鏡像管理庫,可用於存儲私人鏡像。現將本人在debian12系統搭建harbor鏡像庫的過程記錄下來,留作後續參考。 可以參考github harbor項目給定的安裝教程,很詳細了:https://goharbor.io/docs/2.11.0/ins ...


前言


harbor是一個docker/podman鏡像管理庫,可用於存儲私人鏡像。現將本人在debian12系統搭建harbor鏡像庫的過程記錄下來,留作後續參考。

可以參考github harbor項目給定的安裝教程,很詳細了:https://goharbor.io/docs/2.11.0/install-config/configure-https/

本篇博客著重參考了博客園另一位作者的文章 私有鏡像倉庫harbor之手把手搭建步驟,在此基礎上做了一些補充。

正文


harbor 鏡像管理庫依賴於docker環境,並且會使用 docker-compose 的方式啟動,所以需要先安裝docker以及docker-compose,然後從github下載harbor離線安裝包安裝。由於是個人學習實驗使用,安裝環境是本地的debian12,安裝全程使用root用戶。

harbor安裝包使用github目前最新的版本:https://github.com/goharbor/harbor/releases/download/v2.9.5-rc1/harbor-offline-installer-v2.9.5-rc1.tgz

根據官網上的說法,harbor對於環境有一定要求:

- 硬體要求

The following table lists the minimum and recommended hardware configurations for deploying Harbor.

Resource Minimum Recommended
CPU 2 CPU 4 CPU
Mem 4 GB 8 GB
Disk 40 GB 160 GB

- 軟體要求

The following table lists the software versions that must be installed on the target host.

Software Version Description
Docker Engine Version 20.10.10-ce+ or higher For installation instructions, see Docker Engine documentation
Docker Compose docker-compose (v1.18.0+) or docker compose v2 (docker-compose-plugin) For installation instructions, see Docker Compose documentation
OpenSSL Latest is preferred Used to generate certificate and keys for Harbor

- 網路埠要求

Harbor requires that the following ports be open on the target host.

Port Protocol Description
443 HTTPS Harbor portal and core API accept HTTPS requests on this port. You can change this port in the configuration file.
4443 HTTPS Connections to the Docker Content Trust service for Harbor. You can change this port in the configuration file.
80 HTTP Harbor portal and core API accept HTTP requests on this port. You can change this port in the configuration file.

1. 安裝docker

apt update
apt install docker.io
docker --version
# Docker version 20.10.24+dfsg1, build 297e128

配置docker鏡像

cd /etc/docker/
touch daemon.json

編輯 daemon.json (如果這個不可用,需要自行尋找可用鏡像源)

{
    "registry-mirrors": ["https://docker.nastool.de"]
}

測試docker鏡像可用性 -- 可略過

docker search hello-world
# NAME                                   DESCRIPTION                                     # STARS     OFFICIAL   AUTOMATED
# hello-world                            Hello World! (an example of minimal Dockeriz…   2269      [OK]

docker pull hello-world
docker images |grep hello-world
# hello-world                     latest    d2c94e258dcb   14 months ago   13.3kB
docker run --rm --name=tst hello-world

# Hello from Docker!
# This message shows that your installation appears to be working correctly.
#
# To generate this message, Docker took the following steps:
#  1. The Docker client contacted the Docker daemon.
#  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
#     (amd64)
#  3. The Docker daemon created a new container from that image which runs the
#     executable that produces the output you are currently reading.
#  4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

# To try something more ambitious, you can run an Ubuntu container with:
#  $ docker run -it ubuntu bash

# Share images, automate workflows, and more with a free Docker ID:
#  https://hub.docker.com/

# For more examples and ideas, visit:
#  https://docs.docker.com/get-started/

2. 安裝docker-complose

apt install docker-compose
# docker-compose version 1.29.2, build unknown

3. 下載harbor安裝包

從github下載安裝包,安裝包比較大(621M),需要想辦法下載。

# 比如下載到/root/harbor/目錄
mkdir -p /root/harbor
cd /root/harbor

# 可以用aria2c下載
# apt install aria2c

# 從這個頁面找到最新安裝包或最適合的版本 https://github.com/goharbor/harbor/releases

# 下麵的鏈接是我用瀏覽器點擊下載後獲取到的下載鏈接,應該會變,需要實時獲取

aria2c "https://objects.githubusercontent.com/github-production-release-asset-2e65be/50613991/8905e864-0824-4b9c-87c1-44a9e0b4db4f?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240630%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240630T170549Z&X-Amz-Expires=300&X-Amz-Signature=484b6cdee5c9f515d800c41cbf3253d918b470b9d9401db224d2a1cfd36fc021&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=50613991&response-content-disposition=attachment%3B%20filename%3Dharbor-offline-installer-v2.9.5-rc1.tgz&response-content-type=application%2Foctet-stream"

4. 解壓縮 & 創建文件夾

cd /root/harbor
tar -zxvf ./harbor-offline-installer-v2.9.5-rc1.tgz -C /opt
cd /opt/harbor/
mkdir -p /opt/harbor/certs
mkdir -p /opt/harbor/data

5. 準備證書

harbor 安裝時內部使用了nginx, 從瀏覽器訪問網頁需要用到證書(https 單向認證)
更詳細介紹可以參考:https://goharbor.io/docs/2.11.0/install-config/configure-https/

cd /opt/harbor/certs

# 我把官網的製作證書的過程寫到了shell中
touch mkcerts.sh

mkcerts.sh

#!/bin/bash
# 你想要配置的功能變數名稱 -- 需要按需修改
domain=brian-harbor
# 功能變數名稱全稱
host=${domain}.com
# 證書私鑰 (docker-compose啟動時)需要的證書私鑰
key=${host}.key
# 證書申請文件 - 用於申請證書
csr=${host}.csr
# harbor (docker-compose啟動時)需要的證書
crt=${host}.crt
# docker 需要配置的證書,基於crt生成
cert=${host}.cert
# 部署harbor的主機名稱 -- 需要按需修改
ip=192.168.1.9


# ca 證書
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=MyPersonal Root CA" \
 -key ca.key \
 -out ca.crt

# cert 功能變數名稱證書
openssl genrsa -out ${key} 4096
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=${host}" \
    -key ${key} \
    -out ${csr}

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=${host}
DNS.2=${domain}
DNS.3=${ip}
EOF

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in ${csr} \
    -out ${crt}

openssl x509 -inform PEM -in ${crt} -out ${cert}
# 製作證書
chmod +x mkcerts.sh
./mkcerts.sh
ls
# brian-harbor.com.cert  brian-harbor.com.crt  brian-harbor.com.csr  brian-harbor.com.key  ca.crt  ca.key  ca.srl  mkcerts.sh  v3.ext

6. 準備環境

如果用的本地伺服器,沒有功能變數名稱,需要用修改/etc/hosts的方式添加功能變數名稱解析地址

vim /etc/hosts
# 添加一行
192.168.1.9 brian-harbor.com

給docker.service添加步驟5生成的證書,否則可能造成docker login時報錯證書未識別

cd /etc/docker
mkdir -p /etc/docker/certs.d
# 下麵的功能變數名稱文件夾要換成你自己的
mkdir -p /etc/docker/certs.d/brian-harbor.com/
# 這個未詳細測試
mkdir -p /etc/docker/certs.d/192.168.1.9/

# 將步驟5生成的證書放入上方新建的子文件夾
cp /opt/harbor/certs/brian-harbor.com.cert /etc/docker/certs.d/brian-harbor.com/
cp /opt/harbor/certs/brian-harbor.com.key /etc/docker/certs.d/brian-harbor.com/
cp /opt/harbor/certs/ca.crt /etc/docker/certs.d/brian-harbor.com/

#  將/etc/docker/certs.d/brian-harbor.com/內容 複製給 /etc/docker/certs.d/192.168.1.9/ 一份
cp /etc/docker/certs.d/brian-harbor.com/* /etc/docker/certs.d/192.168.1.9/

# 最終效果
.
├── certs.d
│   ├── 192.168.1.9
│   │   ├── brian-harbor.com.cert
│   │   ├── brian-harbor.com.key
│   │   └── ca.crt
│   └── brian-harbor.com
│       ├── brian-harbor.com.cert
│       ├── brian-harbor.com.key
│       └── ca.crt
├── daemon.json
└── key.json

重啟docker服務

systemctl restart docker

7. 配置harbor配置文件

cd /opt/harbor/
cp harbor.yml.tmpl harbor.yml

修改 harbor.yml (如果埠號80/443已經被其他服務占用,需要修改成其他的)

# ......
# 改成你自己的功能變數名稱
hostname: brian-harbor.com

# ......

http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /opt/harbor/certs/brian-harbor.com.crt
  private_key: /opt/harbor/certs/brian-harbor.com.key

# ......

# admin用戶對應的用戶名
harbor_admin_password: Harbor12345

# The default data volume
data_volume: /opt/harbor/data

安裝harbor

cd /opt/harbor
./prepare
./install.sh
# 如果運行過程報錯找不到/hostfs/opt/certs/xxx ,需要核對下/opt/certs/xxx 是否存在,然後再去檢查harbor.yml

# 安裝完畢,發現docker啟動了很多容器
docker-compose ps

 Name                     Command                  State                                          Ports
------------------------------------------------------------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up (healthy)
harbor-db           /docker-entrypoint.sh 13 14      Up (healthy)
harbor-jobservice   /harbor/entrypoint.sh            Up (healthy)
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal       nginx -g daemon off;             Up (healthy)
nginx               nginx -g daemon off;             Up (healthy)   0.0.0.0:80->8080/tcp,:::80->8080/tcp, 0.0.0.0:443->8443/tcp,:::443->8443/tcp
redis               redis-server /etc/redis.conf     Up (healthy)
registry            /home/harbor/entrypoint.sh       Up (healthy)
registryctl         /home/harbor/start.sh            Up (healthy)

# 停止並刪除容器和捲 docker-compose down -v
# 啟動容器 docker-compose up -d
# 重啟 docker-compose restart
# 查看狀態 docker-compose ps

打開瀏覽器,訪問 https://192.168.1.9, 瀏覽器會提示證書不可信,選擇跳過。

輸入admin/Harbor12345進入

8. 設備登陸測試

  • harbor本機登陸
docker login -u admin brian-harbor.com
# WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
# Configure a credential helper to remove this warning. See
# https://docs.docker.com/engine/reference/commandline/login/#credentials-store

# Login Succeeded
  • 另一臺設備登陸
# 準備另一臺設備,我用了一個ubuntu22虛擬機 + podman,podman 和 docker指令幾乎一摸一樣,以下的指令可以將podman換成docker使用

# 修改/etc/hosts
192.168.1.9 brian-harbor.com

# 登陸測試,我這裡很奇怪,可能強制要求信任對方功能變數名稱ca,需要指定ca證書路徑,否則會報錯
# 需要將 6. 準備環境 中做出來的ca.crt 拷貝到這個虛擬機中,我放在了 /root/harbor/ca.crt

podman login -u admin brian-harbor.com
Password: 
Error: authenticating creds for "brian-harbor.com": pinging container registry brian-harbor.com: Get "https://brian-harbor.com/v2/": x509: certificate signed by unknown authority

# 需要指定ca文件夾路徑
podman login --cert-dir /root/harbor/ -u admin brian-harbor.com
Login Succeeded!

# push 鏡像
podman push brian-harbor.com/library/redis:latest --cert-dir /home/brian/harbor/

# 帶上 --cert-dir 還是很彆扭的,這個問題還要進一步研究更好的解決方式
# 估計需要配置本機的可信任ca

參考文章


[1]. 私有鏡像倉庫harbor之手把手搭建步驟
[2]. https://goharbor.io/docs/2.11.0/install-config/configure-https/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 隨著 DEV24.1.3 的發佈,XAF Blazor 中的屬性編輯器(PropertyEditor)也進行了很大的改動,在使用體驗上也更接近 WinForm 了,由於進行了大量的封裝,理解上沒有 WinForm 直觀,所以本文通過對屬性編輯器的原理進行解析,並對比新舊版本中的變化,使大家能夠 ...
  • 由於.NET Framework 4.0 是比較古老的版本,只有New Relic 7.0以下的版本才會支持.NET Framework 4.0的引用程式。 Technical support for .NET Framework 4.0 or lower 你可以參考這個官方Install New ...
  • 功能說明 使用ListView時,希望可以在單元格顯示圖片或其他控制項,發現原生的ListView不支持,於是通過拓展,實現ListView可以顯示任意控制項的功能,效果如下: 實現方法 本來想著在單元格裡面實現控制項的自繪的,但是沒找到辦法,最後是通過在單元格的錶面顯示對應控制項的,浮於錶面達到目的。 實 ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式會偶發性的卡死一段時間,然後又好了,讓我幫忙看下怎麼回事?窗體類的程式解決起來相對來說比較簡單,讓朋友用procdump自動抓一個卡死時的dump,拿到dump之後,上 windbg 說話。 二:WinDbg 分析 1. 主線程在做什麼 要想 ...
  • 痞子衡嵌入式半月刊: 第 103 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回 ...
  • 導航 1 許可權匹配流程 2 五種身份變化 3 有效用戶/組 4 特權對 Shell 腳本無效 5 Sudo 與 SUID/SGID 的優先順序 6 SUID、SGID、Sticky 各自的功能 Linux最優秀的地方之一,就在於他的多人多工環境。而為了讓各個使用者具有較保密的檔案資料,因此檔案的許可權管 ...
  • 第六章 Kendryte K210固件燒錄 1)實驗平臺:正點原子DNK210開發板 2) 章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0 3)購買鏈接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套實驗源碼+手冊 ...
  • @目錄前言一、準備工作二、操作步驟2.1 修改redis.conf文件2.2 創建啟動腳本2.3 設置redis 腳本許可權2.4 設置開機啟動2.5 驗證總結 前言 請各大網友尊重本人原創知識分享,謹記本人博客:南國以南i、 提示:以下是本篇文章正文內容,下麵案例可供參考 一、準備工作 註意:準備已 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...