巧用Docker鏡像倉庫Harbor部署私有Mirror服務

2021-02-23 亨利筆記


題圖攝於舊金山

本文作者付廣平,UnitedStack有雲存儲工程師,北京郵電大學碩士,從事大數據和雲計算相關工作,2016年畢業後加入UnitedStack大數據&容器組,負責Docker、Magnum和Sahara相關工作,Openstack、Docker社區活躍者。

作者別出心裁地使用Harbor搭建了私有Mirror服務,加速外部Docker鏡像的下載。編者對原文做了少量修改。

Harbor是VMware公司最近開源的企業級Docker Registry項目(https://github.com/vmware/harbor) 。其目標是幫助用戶迅速搭建一個企業級的Docker registry服務。它提供了管理UI, 基於角色的訪問控制(Role Based Access Control),AD/LDAP集成、以及審計日誌(Audit logging) 等企業用戶需求的功能,同時還原生支持中文。Harbor的每個組件都是以Docker容器的形式構建的,使用Docker Compose來對它進行部署。

Harbor使用Docker-compose部署,後續所有的配置以及部署均在

$HARBOR_HOME/Deploy/

目錄下完成,因此若無特別說明,工作目錄都在該目錄下。

首先需要進行簡單的配置,配置文件為harbor.cfg,配置項如下:

設置完畢後,配置文件為:


運行./prepare腳本更新配置。完成配置後,就可以使用docker-compose快速部署Harbor:

docker-compose up -d

安裝完成後,訪問Web UI,地址:http://bind_addr,即配置的hostname地址,埠為80。如圖:

Web UI

安裝完成後,打開Web UI,點擊登錄,默認帳戶admin/Harbor12345,登錄成功後進入項目管理界面:用戶可以點擊「我的項目」進行項目管理,比如新建項目、用戶以及權限管理等。點擊項目名稱,進入該項目下的鏡像管理界面,可以查看、檢索鏡像。

Docker client

以上是UI界面的使用,接下來介紹如何使用docker client進行鏡像的管理,由於Harbor只支持Registry V2 API,因此Docker client版本必須>= 1.6.0。

由於我們配置認證服務使用的是http,Docker認為是不安全的,要使用我們部署的鏡像倉庫,需要配置本地docker,修改配置文件(/etc/default/docker)為:

DOCKER_OPTS="$DOCKER_OPTS --insecure-registry 42.62.x.x"

其中42.62.x.x是我們部署Harbor的地址,即hostname配置項值。配置完後需要重啟docker服務。

驗證能否登錄:

docker login 42.62.x.x

登錄成功後顯示如下:接下來我們上傳一個鏡像,以ubuntu鏡像為例,首先從docker hub拉取ubuntu鏡像:

docker pull ubuntu:14.04

然後為該鏡像打上新的標籤,標籤格式為:Harbor地址/項目名/鏡像名稱:鏡像標籤,如:

docker tag ubuntu:14.04 \
42.62.x.x/library/ubuntu:14.04

push我們的鏡像到Harbor倉庫中:

docker push ubuntu:14.04 \

 42.62.x.x/library/ubuntu:14.04

push成功後,我們就可以從Harbor倉庫中使用docker pull拉取我們的鏡像了,注意如果是私有項目,必須先使用docker login登錄:

docker pull 42.62.x.x/library/ubuntu:14.04

 

Mirror是Docker Registry的一種特殊類型,它起到了類似代理伺服器的緩存角色,在用戶和Docker Hub之間做Image的緩存。 

其基本工作原理是,當用戶pull一個鏡像時,若鏡像在mirror 伺服器存在,則直接從mirror伺服器拉取,否則若不存在該鏡像,則由mirror server自動代理往dockerhub(可配置)中拉取鏡像,並緩存到mirror伺服器中,當客戶再次拉取這個鏡像時,直接從mirror server中拉取,不需要再次從docker hub中拉取。

Harbor目前不支持pull cache功能,已提交Github issue #120。不過我們只需要手動修改下配置即可完成,具體配置可參考官方Registry as a pull through cache.

我們在運行./prepare之前修改config/registry/config.yml文件,追加以下配置:

proxy:  remoteurl: https://registry-1.docker.io

如果需要訪問私有倉庫,需要填寫Docker Hub的用戶名和密碼:

proxy:  remoteurl: https://registry-1.docker.io  username: [username]  password: [password]

然後重新啟動Harbor服務:

# 注意不要執行./prepare
docker-compose stopdocker-compose rm -fdocker-compose up -d

除了設置Harbor(或者registry),還需要配置本地docker服務,指定--registry-mirror參數,修改docker配置文件(/etc/default/docker):

DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://42.62.x.x --insecure-registry 42.62.x.x"

注意替換42.62.x.x為你的registry地址。

注意:修改了docker配置文件,必須重啟docker服務才能生效。

Harbor由於引進了認證功能,因此push操作時,必須保證project存在,比如push krystism/ffmpeg,必須保證Harbor創建了krystism project,否則會失敗。為了能夠正常push/pull dockerhub的官方鏡像,務必創建library project,如圖:假設本地不存在python鏡像:

我們第一次pull python後,Harbor發現不存在該鏡像,於是自己作為代理往Docker Hub裡拉取,拉取後保存到本地,可以通過Web UI查看。客戶端再次拉取python鏡像時,由於Harbor已經存在該鏡像,因此不需要再往Docker Hub拉取,速度大幅度提高! 

Harbor支持兩種認證方式,默認為本地存儲,即帳號信息存儲在mysql下,上文已經具體介紹。接下來介紹另外一種認證方式LDAP,只需要修改配置文件即可。需要提供ldap url以及ldap basedn參數,並且設置auth_mode為ldap_auth。


快速部署LDAP服務

為了測試方便,我們使用Docker啟動一個LDAP伺服器,啟動腳本如下:

#!/bin/bash
NAME=ldap_serverdocker rm -f $NAME 2>/dev/nulldocker run --env LDAP_ORGANISATION="Unitedstack Inc." \
--env LDAP_DOMAIN="ustack.com" \--env LDAP_ADMIN_PASSWORD="admin_password" \
-v `pwd`/containers/openldap/data:/var/lib/ldap \
-v `pwd`/containers/openldap/slapd.d:/etc/ldap/slapd.d \
--detach --name $NAME  osixia/openldap:1.1.2

創建新用戶,首先需要定義ldif文件,new_user.ldif:

dn: uid=test,dc=ustack,dc=com

uid: test

cn: test

sn: 3

objectClass: top

objectClass: posixAccount

objectClass: inetOrgPerson

loginShell: /bin/bash

homeDirectory: /home/test

uidNumber: 1001

gidNumber: 1001

userPassword: 1q2w3e4r

mail: test@example.com

gecos: test

通過以下腳本創建新用戶,其中ldap_server為LDAP服務容器名稱。

docker cp new_user.ldif ldap_server:/docker exec ldap_server ldapadd -x \
-D "cn=admin,dc=ustack,dc=com" \
-w admin_password \
-f /new_user.ldif -ZZ

查看用戶是否創建成功:

docker exec ldap_server ldapsearch -x -h localhost \
-b dc=ustack,dc=com -D "cn=admin,dc=ustack,dc=com" \
-w admin_password

檢查test用戶是否存在,若存在,則說明創建成功,否則需要使用docker logs查看日誌。

配置Harbor使用LDAP認證

修改harbor.cfg文件關於LDAP配置項,如下:

auth_mode = ldap_auth
ldap_url = ldap://42.62.x.x
ldap_basedn = uid=%s,dc=ustack,dc=com

然後重新部署Harbor:

./preparedocker-compose stopdocker-compose rm -fdocker-compose up -d

測試是否能夠使用test用戶登錄:

docker login -u test -p 1q2w3e4r \
-e test@example.com 42.62.x.x

Harbor項目:https://github.com/vmware/harbor

官方配置mirror registry文檔:https://github.com/docker/distribution/blob/master/docs/mirror.md

Daocloud關於mirror的博客:http://blog.daocloud.io/daocloud-mirror-free/

openLDAP部署:https://github.com/osixia/docker-openldap

歡迎大家使用Harbor Registry和反饋意見,可到GitHub上的Issues區和我們互動。也可以關注公眾號:「亨利筆記」,在後臺發信息"入群",加入Harbor開源項目用戶群交流。


長按二維碼關注

亨利筆記

相關焦點

  • Harbor企業級私有Docker鏡像倉庫部署
    Harbor介紹與安裝部署,並實現通過http和https協議【自籤發SSL證書】訪問,客戶端如何通過Harbor鏡像倉庫實現鏡像的上傳
  • 進階 | 使用 Docker Harbor 部署私有倉庫
    除了把鏡像上傳到 Docker Hub 私有庫和用 Registry 搭建私有鏡像倉庫外,我們還可以用 Docker Harbor 部署私有倉庫
  • 基於 Harbor 搭建 Docker 私有鏡像倉庫
    Harbor 的每個組件都是以 Docker 容器的形式構建的,使用 Docker Compose 來對它進行部署。//查看docker運行情況docker -v //查看版本信息修改 Docker 配置文件 /etc/default/docker 如下:DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io" //換成國內的鏡像加速源,不然拉取鏡像簡直龜速,不想在吐槽了
  • 企業級Docker鏡像倉庫Harbor部署與使用
    這時單臺Docker主機上鏡像已無法滿足,項目越來越多,鏡像就越來越多,都放到一臺Docker主機上是不行的,我們需要一個像Git倉庫一樣系統來統一管理鏡像。這裡介紹的是一個企業級鏡像倉庫Harbor,將作為我們容器雲平臺的鏡像倉庫中心。Habor是由VMWare公司開源的容器鏡像倉庫。
  • Harbor鏡像倉庫(含clair鏡像掃描) - 完整部署記錄
    編輯docker 配置文件編輯docker 配置文件[root@k8s-harbor01 src][root@k8s-harbor01 src]{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"], "insecure-registries": ["docker02
  • 企業級Docker倉庫-Harbor
    Harbor支持安裝在多個Registry節點的鏡像資源複製,鏡像全部保存在私有Registry中, 確保數據和智慧財產權在公司內部網絡中管控。另外,Harbor也提供了高級的安全特性,諸如用戶管理,訪問控制和活動審計等。
  • Docker高級篇之Harbor鏡像私服-雲原生核心
    本文給大家介紹下Docker中的常用的鏡像私服倉庫,DockerHub,阿里雲倉庫和Harbor鏡像私服倉庫。>登錄阿里雲,進入到鏡像服務,創建命名空間在這裡插入圖片描述將鏡像推送到阿里雲鏡像倉庫$ docker login --username=dpb2****83842 registry.cn-hangzhou.aliyuncs.com$ docker
  • 容器鏡像倉庫之選:企業級容器registry Harbor實踐(上)
    我們發現了它的一些不足如下:用戶與鑑權Docker Registry V2可以基於htpasswd文件進行簡單的用戶管理,但是維護不便,也沒有對外的API可供集成。缺少日誌與審記Docker Registry沒有日誌收集能力,也缺少審記。
  • Harbor2.0快速部署,不怕存儲大爆炸
    默認是用docker-compose部署的當然也可以部署到kubernetes中,本文安裝在docker-compose上,所有需要安裝docker和docker-compose#安裝docker[root@192-168-0-110 ~]#yum install yum-utils [root@192-168-0-110 ~]#yum-config-manager
  • ​Kubernetes 集群倉庫 harbor Helm3 部署
    3、登錄 Harbor 倉庫只有登錄成功後才能將鏡像推送到鏡像倉庫,所以配置完證書後嘗試登錄,測試是否能夠登錄成功:如果提示 ca 證書錯誤,則重建檢測證書配置是否有誤。這裡為了測試推送鏡像,先下載一個用於測試的 helloworld 小鏡像,然後推送到 hub.mydlq.club 倉庫:# 拉取 Helloworld 鏡像docker pull hello-world:latest# 將下載的鏡像使用 tag 命令改變鏡像名
  • Docker和Harbor的使用
    Harbor:Docker容器應用的開發和運行離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,但是從安全和效率等方面考慮,部署私有環境內的Registry也是非常必要的。重啟docker。
  • 生產級harbor可用的搭建
    Harbor簡介Harbor是一個用於存儲和分發Docker鏡像的企業級Registry伺服器,通過添加一些企業必需的功能特性,例如安全、標識和管理等,擴展了開源Docker Distribution。作為一個企業級私有Registry伺服器,Harbor提供了更好的性能和安全。
  • Harbor部署-Docker Compose方式
    提供的證書進行驗證;client auth表示可以用該CA對client提供的證書進行驗證;expiry也表示過期時間,如果不寫以default中的為準。證書信息)[root@K8S-HARBOR cert]# cfssl certinfo -cert harbor.pem查看CSR(證書籤名請求)信息[root@K8S-HARBOR cert]# cfssl certinfo -csr harbor.csr部署Harbor不建議在
  • 運維(8) Harbor部署和docker推送/拉取鏡像
    一、前言本文將基於docker和docker-compose環境簡單部署Harbor,並通過docker推送/拉取鏡像操作Docker version 20.10.8, build 3967b7ddocker-compose version 1.29.2, build 5becea4c二、部署Harbor# 進入自己的安裝目錄
  • 企業級Docker Registry——Harbor實踐
    功能特點雲原生倉庫: 憑藉對容器鏡像和 Helmcharts 的支持,Harbor可以作為容器運行時和業務流程平臺等雲原生環境的倉庫 基於角色的訪問控制:用戶和存儲庫通過「項目」進行組織,並且用戶可以對項目下的鏡像或Helm charts具有不同的權限。
  • 如何在騰訊雲TKE上搭建Harbor倉庫
    相比起Docker Hub、Registry提供的簡單存儲功能,Harbor的出現可以說是解決企業級別對於鏡像倉庫的功能需求。這裡還有個有趣的說法,harbor是港灣的意思,把容器比喻成貨櫃,貨櫃放在港灣,生動又形象。
  • Docker - 私有倉庫Registry
    私有倉庫: 在本地(區域網)搭建的一個類似公共倉庫的東西,我們可以將鏡像提交到私有倉庫中,供區域網內的其它人拉取使用。
  • Docker Registry 遷移至 Harbor(4種方法)
    harbor 也是採用了 Docker Distribution (docker registry)作為後端鏡像存儲服務,在 harbor 2.0 之前的版本,鏡像相關的功能大部分是由 Docker Distribution 來處理,鏡像和 OCI 等製品的元數據是 harbor 組件從 docker registry 中提取出來的;harbor 在 2.0 版本之後,鏡像等 OCI 製品相關的元數據由
  • 4 種方法將 Docker Registry 遷移至 Harbor
    harbor 也是採用了 Docker Distribution (docker registry)作為後端鏡像存儲服務,在 harbor 2.0 之前的版本,鏡像相關的功能大部分是由 Docker Distribution 來處理,鏡像和 OCI 等製品的元數據是 harbor 組件從 docker registry 中提取出來的;harbor 在 2.0 版本之後,鏡像等 OCI 製品相關的元數據由
  • docker和nvidia-docker的安裝及工程的部署
    6.創建私有docker鏡像倉庫docker pull registry cd /usr/local/mkdir docker_registry cd docker_registrytouch config.yml