〖Docker指南⑧〗Docker私有鏡像倉庫|阿裡雲|Registry|Harbor

  • 進階架構師學習路線

文章目錄

  • 一、Docker私有庫
    • 1.1 下載Docker Registry
    • 1.2 運行私有庫Registry
    • 1.3 制作自己的鏡像
    • 1.4 查看私服庫的鏡像
    • 1.5 修改tag
    • 1.6 開啟http方式推送鏡像
    • 1.7 推送鏡像
    • 1.8 查看私服庫的鏡像
    • 1.9 拉取鏡像
  • 二、本地鏡像發佈到阿裡雲
    • 2.1 本地鏡像發佈到阿裡雲流程
    • 2.2 鏡像的生成方法
    • 2.3 將本地鏡像推送到阿裡雲
  • 三、企業級私有倉庫harbor
    • 3.1 Harbor概念
    • 3.2 Harbor的特性
    • 3.3 Harbor的構成
    • 3.4 Harbor 部署
      • 3.4.1 環境準備
      • 3.4.2 部署 Docker-Compose 服務(192.168.80.11 )
      • 3.4.3 部署 Harbor 服務(192.168.80.11)
      • 3.4.4 修改harbor安裝的配置文件
      • 3.4.5 Harbor.cfg 配置文件中兩類參數:所需參數和可選參數
      • 3.4.6 啟動 Harbor
      • 3.4.7 創建一個新項目
      • 3.4.8 登錄 Harbor
      • 3.4.9 下載鏡像進行測試
    • 3.5 在其他客戶端上傳鏡像(192.168.80.12)
      • 3.5.1 登錄錯誤解決辦法
      • 3.5.2 再次登錄 Harbor
      • 3.5.3 鏡像測試
    • 3.6 維護管理Harbor
      • 3.6.1 通過 Harbor Web 創建項目
      • 3.6.2 創建 Harbor 用戶

一、Docker私有庫 1.1 下載Docker Registry

docker pull registry

1.2 運行私有庫Registry

相當於本地有個私有的Docker hub

docker run -d -p 5000:5000 -v /home/issavior/registry:/tmp/registry --privileged=true registry

默認情況下,倉庫被創建在容器的/var/lib/registry目錄下,建議自行用容器卷映射,方便於宿主機聯調

1.3 制作自己的鏡像

友情鏈接〖Docker指南③〗Docker鏡像的深度解析

1.4 查看私服庫的鏡像

curl http://172.20.10.13:5000/v2/_catalog

1.5 修改tag

docker tag issa/myubuntu:1.16 172.20.10.13:5000/issa/myubuntu:1.16

1.6 開啟http方式推送鏡像

cat /etc/docker/daemon.json

{  "registry-mirrors": ["https://n18bh8y7.mirror.aliyuncs.com"],  "insecure-registries": ["172.20.10.13:5000"]}

重啟docker,啟動registry

1.7 推送鏡像

docker push 172.20.10.13:5000/issa/myubuntu

1.8 查看私服庫的鏡像

curl http://172.20.10.13:5000/v2/_catalog

1.9 拉取鏡像

docker pull 172.20.10.13:5000/issa/myubuntu

二、本地鏡像發佈到阿裡雲 2.1 本地鏡像發佈到阿裡雲流程

2.2 鏡像的生成方法

  1. 前面的DockerFile:〖Docker指南⑤〗學習Dockerfile,看這一篇就夠瞭

  2. 從容器創建一個新的鏡像
    docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

    OPTIONS說明:

    • -a :提交的鏡像作者;
    • -m :提交時的說明文字;

2.3 將本地鏡像推送到阿裡雲

  1. 打開阿裡雲的容器鏡像服務

  2. 進入個人實例

  3. 創建命名空間

  4. 選擇命名空間

  5. 創建鏡像倉庫

  1. 按著命令完成操作即可

三、企業級私有倉庫harbor 3.1 Harbor概念

Harbor 是 VMware 公司開源的企業級 Docker Registry 項目,其目標是幫助用戶迅速搭建一個企業級的 Docker Registry 服務。

Harbor以 Docker 公司開源的 Registry 為基礎,提供瞭圖形管理 UI 、基於角色的訪問控制(Role Based AccessControl) 、AD/LDAP 集成、以及審計日志(Auditlogging) 等企業用戶需求的功能,同時還原生支持中文。

Harbor 的每個組件都是以 Docker 容器的形式構建的,使用 docker-compose 來對它進行部署。用於部署 Harbor 的 docker-compose 模板位於 harbor/docker-compose.yml。

3.2 Harbor的特性

基於角色控制:用戶和倉庫都是基於項目進行組織的,而用戶在項目中可以擁有不同的權限。
基於鏡像的復制策略:鏡像可以在多個Harbor實例之間進行復制(同步)。

支持 LDAP/AD:Harbor 可以集成企業內部已有的AD/LDAP(類似數據庫的一張表),用於對已經存在的用戶認證和管理。

鏡像刪除和垃圾回收:鏡像可以被刪除,也可以回收鏡像占用的空間。

圖形化用戶界面:用戶可以通過瀏覽器來瀏覽,搜索鏡像倉庫以及對項目進行管理。

審計管理:所有針對鏡像倉庫的操作都可以被記錄追溯,用於審計管理。

支持 RESTful API:RESTful API 提供給管理員對於 Harbor 更多的操控, 使得與其它管理軟件集成變得更容易。

Harbor和docker registry的關系:Harbor實質上是對docker registry做瞭封裝,擴展瞭自己的業務模板。

3.3 Harbor的構成

Harbor 在架構上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六個組件。

Proxy
Harbor 的 Registry、UI、Token 服務等組件,都處在 nginx 反向代理後邊。該代理將來自瀏覽器、docker clients 的請求轉發到後端不同的服務上。

Registry
負責儲存 Docker 鏡像,並處理 Docker push/pull 命令。由於要對用戶進行訪問控制,即不同用戶對 Docker 鏡像 有不同的讀寫權限,Registry 會指向一個 Token 服務,強制用戶的每次 Docker pull/push 請求都要攜帶一個合法的 Token, Registry 會通過公鑰對 Token 進行解密驗證。

Core services
Harbor的核心功能,主要提供以下3個服務:

  1. UI(harbor-ui): 提供圖形化界面,幫助用戶管理 Registry 上的鏡像(image), 並對用戶進行授權。
  2. WebHook:為瞭及時獲取Registry 上image 狀態變化的情況,在Registry 上配置 Webhook,把狀態變化傳遞給 UI 模塊。
  3. Token 服務:負責根據用戶權限給每個 Docker push/pull 命令簽發 Token。Docker 客戶端向 Registry 服務發起的請求, 如果不包含 Token,會被重定向到 Token 服務,獲得 Token 後再重新向 Registry 進行請求。

Database(harbor-db)
為core services提供數據庫服務,負責儲存用戶權限、審計日志、Docker 鏡像分組信息等數據。

Job services
主要用於鏡像復制,本地鏡像可以被同步到遠程 Harbor 實例上。

Log collector(harbor-log)
負責收集其他組件的日志到一個地方。

Harbor 的每個組件都是以 Docker 容器的形式構建的,因此,使用 Docker Compose 來對它進行部署。

總共分為7個容器運行,通過在docker-compose.yml所在目錄中執行 docker-compose ps 命令來查看, 名稱分別為:nginx、harbor-jobservice、harbor-ui、harbor-db、harbor-adminserver、registry、harbor-log。

其中 harbor-adminserver 主要是作為一個後端的配置數據管理,並沒有太多的其他功能。harbor-ui 所要操作的所有數據都通過 harbor-adminserver 這樣一個數據配置管理中心來完成。

3.4 Harbor 部署 3.4.1 環境準備

Harbor服務器192.168.80.11docker-ce、docker-compose、harbor-offline-v1.2.2client服務器192.168.80.12docker-ce

3.4.2 部署 Docker-Compose 服務(192.168.80.11 )

#下載或者上傳 Docker-Composecurl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-composedocker-compose -v

3.4.3 部署 Harbor 服務(192.168.80.11)

下載或上傳 Harbor 安裝程序wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgztar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/

如果下載不瞭的話,自行去github下載:https://github.com/goharbor/harbor/releases

3.4.4 修改harbor安裝的配置文件

註:新版本將.cfg改為.yml,原理都一樣

vim /usr/local/harbor/harbor.cfg--5行--修改,設置為Harbor服務器的IP地址或者域名hostname = 192.168.80.11--59行--指定管理員的初始密碼,默認的用戶名/密碼是admin/Harbor12345harbor_admin_password = Harbor12345

3.4.5 Harbor.cfg 配置文件中兩類參數:所需參數和可選參數

所需參數:這些參數需要在配置文件 Harbor.cfg 中設置。如果用戶更新它們並運行 install.sh 腳本重新安裝 Harbour, 參數將生效。具體參數如下:

  1. hostname:用於訪問用戶界面和 register 服務。它應該是目標機器的 IP 地址或完全限定的域名(FQDN),例如 192.168.80.11 或 hub.111.cn。不要使用 localhost 或 127.0.0.1 為主機名。
  2. ui_url_protocol:(http 或 https,默認為 http)用於訪問 UI 和令牌/通知服務的協議。如果共證處於啟用狀態,則此參數必須為 https。
  3. max_job_workers:鏡像復制作業線程。
  4. db_password:用於db_auth 的MySQL數據庫root 用戶的密碼。
  5. customize_crt:該屬性可設置為打開或關閉,默認打開。打開此屬性時,準備腳本創建私鑰和根證書,用於生成/驗證註冊表令牌。當由外部來源提供密鑰和根證書時,將此屬性設置為 off。
  6. ssl_cert:SSL 證書的路徑,僅當協議設置為 https 時才應用。
  7. secretkey_path:用於在復制策略中加密或解密遠程 register 密碼的密鑰路徑。

可選參數:這些參數對於更新是可選的,即用戶可以將其保留為默認值,並在啟動 Harbor 後在 Web UI 上進行更新。如果進入 Harbor.cfg,隻會在第一次啟動 Harbor 時生效,隨後對這些參數的更新,Harbor.cfg 將被忽略。

註意:如果選擇通過 UI 設置這些參數,請確保在啟動 Harbor 後立即執行此操作。具體來說,必須在註冊或在 Harbor 中創建任何新用戶之前設置所需的 auth_mode。當系統中有用戶時(除瞭默認的 admin 用戶), auth_mode 不能被修改。

具體參數如下:

  1. Email:Harbor 需要該參數才能向用戶發送“密碼重置”電子郵件,並且隻有在需要該功能時才啟用。請註意,在默認情況下 SSL 連接時沒有啟用。如果 SMTP 服務器需要 SSL,但不支持 STARTTLS,那麼應該通過設置啟用 SSL email_ssl = TRUE。
  2. harbour_admin_password:管理員的初始密碼,隻在 Harbour 第一次啟動時生效。之後, 此設置將被忽略,並且應在 UI 中設置管理員的密碼。請註意,默認的用戶名/密碼是admin/Harbor12345。
  3. auth_mode:使用的認證類型,默認情況下,它是 db_auth,即憑據存儲在數據庫中。對於LDAP身份驗證,請將其設置為 ldap_auth。
  4. self_registration:啟用/禁用用戶註冊功能。禁用時,新用戶隻能由 Admin 用戶創建,隻有管理員用戶可以在 Harbour 中創建新用戶。註意:當 auth_mode 設置為 ldap_auth 時,自註冊功能將始終處於禁用狀態,並且該標志被忽略。
  5. Token_expiration:由令牌服務創建的令牌的到期時間(分鐘),默認為 30 分鐘。
  6. project_creation_restriction:用於控制哪些用戶有權創建項目的標志。默認情況下,每個人都可以創建一個項目。如果將其值設置為“adminonly”,那麼隻有 admin 可以創建項目。
  7. verify_remote_cert:打開或關閉,默認打開。此標志決定瞭當Harbor與遠程 register 實例通信時是否驗證 SSL/TLS 證書。 將此屬性設置為 off 將繞過 SSL/TLS 驗證,這在遠程實例具有自簽名或不可信證書時經常使用。

另外,默認情況下,Harbour 將鏡像存儲在本地文件系統上。在生產環境中,可以考慮 使用其他存儲後端而不是本地文件系統,如 S3、Openstack Swif、Ceph 等對象存儲。但需要更新 common/templates/registry/config.yml 文件。

3.4.6 啟動 Harbor

cd /usr/local/harbor/./install.sh#查看 Harbor 啟動鏡像cd /usr/local/harbor/docker-compose ps

註釋掉https這些

3.4.7 創建一個新項目

  1. 瀏覽器訪問:http://192.168.80.11 登錄 Harbor WEB UI 界面,默認的管理員用戶名和密碼是 admin/Harbor12345
  2. 輸入用戶名和密碼登錄界面後可以創建一個新項目。點擊“+項目”按鈕
  3. 填寫項目名稱為“ossa”,點擊“確定”按鈕,創建新項目

3.4.8 登錄 Harbor

  1. docker login [-u admin -p Harbor12345] http://127.0.0.1

  2. 此時可使用 Docker 命令在本地通過 127.0.0.1 來登錄和推送鏡像。默認情況下,Registry 服務器在端口 80 上偵聽。

3.4.9 下載鏡像進行測試

docker pull alpine#將鏡像打標簽#格式:docker tag 鏡像:標簽  倉庫IP/項目名稱/鏡像名:標簽docker tag alpine 127.0.0.1/ossa/nginx:1.0#上傳鏡像到 Harbordocker push 127.0.0.1/ossa/nginx:1.0

3.5 在其他客戶端上傳鏡像(192.168.80.12)

以上操作都是在 Harbor 服務器本地操作。如果其他客戶端登錄到 Harbor,就會報http相關錯誤。

出現這問題的原因為Docker Registry 交互默認使用的是 HTTPS,但是搭建私有鏡像默認使用的是 HTTP 服務,所以與私有鏡像交互時出現以下錯誤。

docker login -u admin -p Harbor12345 http://192.168.80.11

3.5.1 登錄錯誤解決辦法

在 Docker 客戶端配置操作在 Docker server 啟動的時候,增加啟動參數,默認使用 HTTP 訪問。vim /usr/lib/systemd/system/docker.service--13行--修改ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.80.11 --containerd=/run/containerd/containerd.sock或ExecStart=/usr/bin/dockerd --insecure-registry 192.168.80.10重啟 Docker,再次登錄systemctl daemon-reloadsystemctl restart docker

3.5.2 再次登錄 Harbor

docker login -u admin -p Harbor12345 http://192.168.80.11

3.5.3 鏡像測試

#下載鏡像進行測試docker pull 192.168.80.10/ossa/myalpine:1.0#上傳鏡像進行測試docker pull cirrosdocker tag cirros:latest 192.168.80.11/ossa/myalpine:1.0docker push 192.168.80.11/ossa/myalpine:1.0#刷新 Harbor 的 Web 管理界面進行查看,會發現 myproject-aaa 項目裡面有兩個鏡像

3.6 維護管理Harbor 3.6.1 通過 Harbor Web 創建項目

在 Harbor 倉庫中,任何鏡像在被 push 到 regsitry 之前都必須有一個自己所屬的項目。

單擊“+項目”,填寫項目名稱,項目級別若設置為”私有”,則不勾選。如果設置為公共倉庫,則所有人對此項目下的鏡像擁有讀權限,命令行中不需要執行”Docker login”即可下載鏡像,鏡像操作與 Docker Hub 一致。

3.6.2 創建 Harbor 用戶

創建用戶並分配權限

  1. 在 Web 管理界面中單擊系統管理 -> 用戶管理 -> +用戶,
  2. 填寫用戶名為“issa”,郵箱為“[email protected]”,全名為“issavior”,密碼為“123456”,註釋為“管理員”(可省略)。

附:用戶創建成功後,單擊左側“…”按鈕可將上述創建的用戶設置為管理員角色或進行刪除操作,本例不作任何設置。

添加項目成員

單擊項目 -> ossa-> 成員 -> + 成員,填寫上述創建的用戶 lk 並分配角色為“開發人員”。

附:此時單擊左側“…”按鈕仍然可對成員角色進行變更或者刪除操作

在客戶端上使用普通賬戶操作鏡像

#刪除上述打標簽的本地鏡像docker rmi 192.168.80.11/ossa/myalpine:1.0#先退出當前用戶,然後使用上述創建的賬戶 liu 登錄docker logout 192.168.80.11docker login 192.168.80.11或docker login -u issa -p 123456 http://192.168.80.11#下載和上傳鏡像進行測試docker pull 192.168.80.11/ossa/myalpine:1.0docker tag alpine 192.168.80.11/ossa/myalpine:1.0docker push 192.168.80.11/ossa/myalpine:1.0#查看日志Web 界面日志,操作日志按時間順序記錄用戶相關操作

修改 Harbor.cfg 配置文件

要更改 Harbour的配置文件中的可選參數時,請先停止現有的 Harbour實例並更新 Harbor.cfg;然後運行 prepare 腳本來填充配置; 最後重新創建並啟動 Harbour 的實例。使用 docker-compose 管理 Harbor 時,必須在與 docker-compose.yml 相同的目錄中運行。

移除 Harbor 服務容器同時保留鏡像數據/數據庫,並進行遷移

#在Harbor服務器上操作cd /usr/local/harbordocker-compose down -v#把項目中的鏡像數據進行打包#持久數據,如鏡像,數據庫等在宿主機的/data/目錄下,日志在宿主機的/var/log/Harbor/目錄下ls /data/registry/docker/registry/v2/repositories/ossacd /data/registry/docker/registry/v2/repositories/ossatar zcvf ossa-registry.tar.gz ./*#可以將打包的數據文件移出數據目錄#如需重新部署,需要移除 Harbor 服務容器全部數據cd /usr/local/harbordocker-compose down -vrm -r /data/databaserm -r /data/registrymkidr -p /data/registry/docker/registry/v2/repositories/ossatar /opt/zxvf ossa-registry.tar.gz -C /data/registry/docker/registry/v2/repositories/ossa
本文來自網絡,不代表程式碼花園立場,如有侵權,請聯系管理員。https://www.codegarden.cn/article/28056/
返回顶部