利用 Harbor 搭建企業級私有鏡像倉庫

背景

docker中要使用鏡像,通常會從本地、docker Hup公共倉庫和其它第三方公共倉庫中下載鏡像,通常出於安全和外網(牆)資源下載速率的緣由考慮企業級上不會輕易使用。那麼有沒有一種辦法能夠存儲本身的鏡像又有安全認證的倉庫呢?node

—-> 企業級環境中基於Harbor搭建本身的安全認證倉庫。mysql

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

安裝Harborgit

harbor須要安裝docker和docker-compose才能使用,安裝docker的步驟可參考以前的舊文:Docker容器技術入門(一)github

安裝docker-dompose

docker-dompose安裝步驟以下:web

下載最新版的docker-compose文件sql

$ curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

添加可執行權限docker

$ chmod +x /usr/local/bin/docker-compose

驗證版本數據庫

$ docker-compose -v
docker-compose version 1.23.2, build 1110ad01

獲取Harbor軟件包json

https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.1.tgz

解壓

tar -xf harbor-offline-installer-v1.7.1.tgz -C /usr/local/

編輯配置文件

$ cd /usr/local/harbor

$ vim harbor.cfg
hostname = reg.for-k8s.com
# 本機外網IP或域名,該地址供用戶經過UI進行訪問,不要使用127.0.0.1
ui_url_protocol = https
# 用戶訪問私倉時使用的協議,默認時http,配置成https
db_password = root123
# 指定mysql數據庫管理員密碼
harbor_admin_password:Harbor12345
# harbor的管理員帳戶密碼
ssl_cert = /data/cert/reg.for-k8s.com.crt
# 設置證書文件路徑
ssl_cert_key = /data/cert/reg.for-k8s.com.key
# 設置證書密鑰文件路徑

####其餘配置選項按需填寫便可

生成ssl證書

生成根證書

$ cd /dada/cert/
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt -subj "/C=CN/L=Shanghai/O=harbor/CN=harbor-registry"

生成一個證書籤名, 設置訪問域名爲 reg.for-k8s.com

$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout reg.for-k8s.com.key -out server.csr -subj "/C=CN/L=Shanghai/O=harbor/CN=reg.for-k8s.com"

生成主機證書

$ openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out reg.for-k8s.com.crt

經過自帶腳本一鍵安裝

安裝步驟以下:

$ cd /usr/local/harbor/
./install.sh
......
......
......
✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at https://reg.for-k8s.com.
For more details, please visit https://github.com/goharbor/harbor .

而後綁定hosts訪問便可:

默認帳號密碼 admin / Harbor12345

ok 那上面的私有倉庫服務已經搭建完畢了,該怎麼使用呢?

首先在harbor上建立一個項目myproject(我這裏不使用默認的libary)

這裏我選擇私有倉庫, pull/push都須要在主機上面執行docker login才行;

一、當我經過Dockerfile構建一個新鏡像的時候, 直接指明registry和標籤, 好比:

$ docker build -treg.for -k8s.com/myproject/mydocker-image:v1.0.1 .  
Sending build contextto Docker daemon97.21MB  
Step1/12 : FROM1and1internet/ubuntu-16  
 ---> dbf985f1f449  
Step2/12 : MAINTAINER guomaoqiu <guomaoqiu@gmail.com>  
 ---> Using cache  
 --->598894333db9  
......  
......  
Successfully built b190966f3773  
Successfully taggedreg.for -k8s.com/myproject/mydocker-image:v1.0.1  
  
$ docker images |grep myproject  
reg.for -k8s.com/myproject/mydocker-image v1.0.1   b190966f3773  44 seconds ago482MB

二、加入當你從別處獲取的鏡像想上傳到私有倉庫呢?就是打個tag就行啦, 好比我想把從官網的這個nginx鏡像放到個人倉庫:

$ dockertag nginxreg.for -k8s.com/myproject/mynginx:latest  
$ docker images |grep myproject  
reg.for -k8s.com/myproject/mydocker-image v1.0.1 b190966f3773  2 minutes ago 482MB  
reg.for -k8s.com/myproject/mynginx latest568c4670fa80  5 weeks ago 109MB

三、登陸倉庫

$ docker login -u admin -p Harbor12345reg.for -k8s.com  
Username: admin  
Password:  
WARNING! Your password willbe stored unencrypted in /root/.docker/config.json.  
Configurea credential helpertoremove this warning. See  
https://docs.docker.com/engine/reference/commandline/login/#credentials-store  
  
Login Succeeded

四、最後把本地的鏡像push到倉庫
當我執行這個的時候報錯了:

docker pushreg.for -k8s.com/myproject/mynginx:latest  
Error response from daemon: Get https://reg.for -k8s.com/v2/: x509: certificate signed by unknown authority

解決辦法就是若是不在客戶端部署證書,那麼在Docker啓動時設置參數 「–insecure-registry IP/倉庫域名」,而後重載服務重啓docker進程;注意的是我這裏使用的這個域名是自定義的,那麼須要在須要上傳下載鏡像的機器上,一樣須要修改docker進程參數,而且綁定hosts,不然即便配置了參數,這個域名無法解析也是push/pull不到鏡像的。

五、再次執行push操做:

$ docker pushreg.for -k8s.com/myproject/mynginx:latest  
The push refersto repository [reg.for -k8s.com/myproject/mynginx]  
b7efe781401d: Pushed  
c9c2a3696080: Pushed  
7b4e562e58dc: Pushed  
latest: digest:sha256:e2847e35d4e0e2d459a7696538cbfea42ea2d3b8a1ee8329ba7e68694950afd3 size:948  
  
$ [root@k8s-m1 kubectl-terminal-ubuntu]# docker pushreg.for -k8s.com/myproject/mydocker-image:v1.0.1  
The push refersto repository [reg.for -k8s.com/myproject/mydocker-image]  
96dca48ee72c: Pushed  
fa879b69764c: Pushed  
4d823b00e6b7: Pushed  
6bf6e96da4a0: Pushed  
eedda540c6a8: Pushed  
f2a971e53afa: Pushed  
3ee1a3b3fd18: Pushed  
8a225cfa6dea: Pushed  
428c1ba11354: Pushed  
b097f5edab7b: Pushed  
27712caf4371: Pushed  
8241afc74c6f: Pushed  
v1.0.1: digest:sha256:a20629f62d73cff93bf73b31958878a1d76c2dd42e36ebb2cb6d0ac294a46da7 size:2826

以上push成功;

測試pull

那爲了測試pull而且能成功運行,我這裏經過kuernetes運行一個DaemonSet,鏡像採用: mynginx ,而且設置鏡像pull策略爲Always, 而後建立一個服務在集羣內部經過ClusterIP可以訪問, yaml以下:

$cat >> test.yaml << EOF  
apiVersion: v1  
kind: Service  
metadata:  
  labels:  
    app: mynginx-service  
  name: mynginx-service  
spec:  
  ports:  
  - name:80-80  
    port:80  
    protocol: TCP  
    targetPort:80  
  selector:  
    run: mynginx  
type: ClusterIP  
 ---  
apiVersion: extensions/v1beta1  
kind: DaemonSet  
metadata:  
  labels:  
    run: mynginx  
  name: mynginx  
spec:  
  selector:  
    matchLabels:  
      run: mynginx  
  template:  
    metadata:  
      labels:  
        run: mynginx  
    spec:  
      containers:  
      - image:reg.for -k8s.com/myproject/mynginx:latest  
        imagePullPolicy: Always  
        name: mynginx  
EOF  
  
$ kubectl apply -f daemonset.yaml  
service/mynginx-service created  
daemonset.extensions/mynginx create

因爲我剛纔建立倉庫的時候設置的倉庫隱私性爲私有的,須要docker login 登陸成功以後,k8s kubectl create 就拉取不了鏡像;若是設置爲公開,那麼久不須要配置這一步驟。只須要docker login 登陸成功以後,k8s kubectl create 就能夠拉取鏡像; 可是我不想讓其爲公開的;因此還須要配置以下步驟:

配置一個私有倉庫harbor的secret:

kubectlcreate secret docker-registry registry-secret --namespace=default \\  
--docker-server=https://reg.for-k8s.com --docker-username=admin \\  
--docker-password=Harbor12345

部署時指定imagePullSecrets, 修改在上面的yaml中添加這個選項:

$cat >> test.yaml << EOF  
apiVersion: v1  
kind: Service  
metadata:  
  labels:  
    app: mynginx-service  
  name: mynginx-service  
spec:  
  ports:  
  - name:80-80  
    port:80  
    protocol: TCP  
    targetPort:80  
  selector:  
    run: mynginx  
type: ClusterIP  
 ---  
apiVersion: extensions/v1beta1  
kind: DaemonSet  
metadata:  
  labels:  
    run: mynginx  
  name: mynginx  
spec:  
  selector:  
    matchLabels:  
      run: mynginx  
  template:  
    metadata:  
      labels:  
        run: mynginx  
    spec:  
      containers:  
      - image:reg.for -k8s.com/myproject/mynginx:latest  
        imagePullPolicy: Always  
        name: mynginx  
      imagePullSecrets:  
        - name: registry-secret  
EOF  
  
$ kubectl apply -f daemonset.yaml  
service/mynginx-service created  
daemonset.extensions/mynginx create

以上就是基於Harbor組建企業級私有鏡像倉庫的所有過程。

若有錯誤或其它問題,歡迎小夥伴留言評論、指正。若有幫助,歡迎點贊+轉發分享。

歡迎你們關注民工哥的公衆號:民工哥技術之路
image.png

相關文章
相關標籤/搜索