1. 程式人生 > >docker私有registry和harbor簡單使用

docker私有registry和harbor簡單使用

前言介紹

Registry用於儲存docker映象,包括映象的層次結構和元資料

使用者可自建Registry,也可使用官方的Docker Hub

Docker Registry,它是所有倉庫(包括共有和私有)以及工作流的中央Registry。在深入Docker Registry之前,讓我們先去看看一些常見的術語和與倉庫相關的概念。

  • Repositories(倉庫)可以被標記為喜歡或者像書籤一樣標記起來
  • 使用者可以在倉庫下評論。
  • 私有倉庫和共有倉庫類似,不同之處在於前者不會在搜尋結果中顯示,也沒有訪問它的許可權。只有使用者設定為合作者才能訪問私有倉庫。
  • 成功推送之後配置webhooks。

Docker Registry角色

Docker Registry有三個角色,分別是index、registry和registry client。

角色 1 -- Index

index 負責並維護有關使用者帳戶、映象的校驗以及公共名稱空間的資訊。它使用以下元件維護這些資訊:

  • Web UI
  • 元資料儲存
  • 認證服務
  • 符號化

這也分解了較長的URL,以方便使用和驗證使用者儲存庫。

角色 2 --Registry

registry是映象和圖表的倉庫。然而,它沒有一個本地資料庫,也不提供使用者的身份認證,由S3、雲檔案和本地檔案系統提供資料庫支援。此外,通過Index Auth service的Token方式進行身份認證。Registries可以有不同的型別。現在讓我們來分析其中的幾種型別:

  • Sponsor Registry:第三方的registry,供客戶和Docker社群使用。

  • Mirror Registry:第三方的registry,只讓客戶使用。

  • Vendor Registry:由釋出Docker映象的供應商提供的registry。

  • Private Registry:通過設有防火牆和額外的安全層的私有實體提供的registry。

角色 3 --Registry Client

Docker充當registry客戶端來負責維護推送和拉取的任務,以及客戶端的授權。

Docker Registry工作流程詳解

現在,讓我們討論五種情景模式,以便更好地理解Docker Registry。

情景A:使用者要獲取並下載映象。所涉及的步驟如下:

  1. 使用者傳送請求到index來下載映象。
  2. index 發出響應,返回三個相關部分資訊:
    • 該映象所處的registry
    • 該映象包括所有層的校驗
    • 以授權為目的的Token

    注意:當請求header裡有X-Docker-Token時才會返回Token。而私人倉庫需要基本的身份驗證,對於公有倉庫這一點不是強制性的。

  3. 使用者通過響應後返回的Token和registry溝通,registry全權負責映象,它用來儲存基本的映象和繼承的層。
  4. registry現在要與index證實該token是被授權的。
  5. index會發送“true”或者“false”給registry,由此判定是否允許使用者下載所需要的映象。

情景A流程圖

情景B:使用者想要將映象推送到registry中。其中涉及的步驟如下:

  1. 使用者傳送附帶證書的請求到index要求分配庫名。
  2. 在認證成功,名稱空間可用之後,庫名也被分配。index發出響應返回臨時的token。
  3. 映象連帶token,一起被推送到registry中。
  4. registry與index證實token被授權,然後在index驗證之後開始讀取推送流。
  5. 該index由Docker校驗的映象更新。

情景B

情景C:使用者想要從index或registry中刪除映象:

  1. index接收來自Docker一個刪除庫的訊號。
  2. 如果index對庫驗證成功,它將刪除該庫,並返回一個臨時的token。
  3. registry現在接收到帶有該token的刪除訊號。
  4. registry與index核實該token,然後刪除庫以及所有與其相關的資訊。
  5. Docker現在通知有關刪除的index,然後index移除庫的所有記錄。

情景C

情景D:使用者希望在沒有index的獨立模式中使用registry。
使用沒有index的registry,這完全由Docker控制,它最適合於在私有網路中儲存映象。registry執行在一個特殊的模式裡,此模式限制了registry與Docker index的通訊。所有有關安全性和身份驗證的資訊需要使用者自己注意。

情景E:使用者想要在有index的獨立模式中使用registry。
在這種情況下,一個自定義的index會被建立在私有網路裡來儲存和訪問映象的問題。然而,通知Docker有關定製的index是耗時的。 Docker提供一個有趣的概念chaining registries,從而,實現負載均衡和為具體請求而指定的registry分配。在接下來的Docker教程系列中,我們將討論如何在上述每個情景中使用Docker Registry API ,以及深入瞭解Docker Security。

搭建registry

[[email protected] ~]# yum info docker-registry

版本 :0.9.1 //版本過老

釋出 :7.el7

大小 :123 k

源 :extras/7/x86_64

[[email protected] ~]# yum install docker-registry

========================================================================================

Package 架構 版本 源 大小

========================================================================================

正在安裝:

docker-distribution x86_64 2.6.2-2.git48294d9.el7 extras 3.5 M

[[email protected] ~]# rpm -ql docker-distribution

/etc/docker-distribution/registry/config.yml

/usr/bin/registry //主程式

上傳映象

[[email protected] ~]# cd /etc/docker-distribution/registry/

[[email protected] registry]# cat config.yml

version: 0.1

log:

fields:

service: registry

storage:

cache:

layerinfo: inmemory

filesystem:

rootdirectory: /var/lib/registry

http:

addr: :5000 //預設所有主機的 5000埠

[[email protected] registry]# systemctl start docker-distribution.service

[[email protected] registry]# ss -tnl

State Recv-Q Send-Q Local Address:Port Peer Address:Port

LISTEN 0 128 *:22 *:*

LISTEN 0 128 :::5000 :::*

LISTEN 0 128 :::22 :::*

[[email protected] ~]# docker tag myweb:v0.3-8 node2.zisefeizhu.com:5000/myweb:v0.3-8

[[email protected] ~]# docker image ls

node2.zisefeizhu.com:5000/myweb v0.3-8 05f10f0430cb 18 hours ago 17.4MB

[[email protected] ~]# cat /etc/hosts          //做好域名解析準備

10.0.0.220 node2.zisefeizhu.com

[[email protected] ~]# docker push node2.zisefeizhu.com:5000/myweb:v0.3-8

The push refers to repository [node2.zisefeizhu.com:5000/myweb]

Get https://node2.zisefeizhu.com:5000/v2/: http: server gave HTTP response to HTTPS client

[[email protected] ~]# vim /etc/docker/daemon.json

{

"registry-mirrors": ["https://llpuz83z.mirror.aliyuncs.com","https://registry.docker-cn.com"],

"insecure-registries": ["node2.zisefeizhu.com:5000"]   //修改使其可以通過http方式push到私有倉庫

}

[[email protected] ~]# systemctl restart docker

上傳成功

[[email protected] ~]# docker push node2.zisefeizhu.com:5000/myweb:v0.3-8

The push refers to repository [node2.zisefeizhu.com:5000/myweb]

edcda3959450: Pushed

8154ed0fadea: Pushed

9a07ffbe3d7d: Pushed

955e7d7f7300: Pushed

95bb4e754f2d: Pushed

ebf12965380b: Pushed

v0.3-8: digest: sha256:3b70494d5bae8bdc49c6d0b93b3ed7ea4522bb854dd77d672c7252ed4887bf4b size: 1568

檢視上傳映象資訊

[[email protected] ~]# cd /var/lib/registry/

[[email protected] registry]# ls

docker

[[email protected] registry]# cd docker/

[[email protected] docker]# ls

registry

[[email protected] docker]# cd registry/

[[email protected] registry]# ls

v2

[[email protected] registry]# cd v2/

[[email protected] v2]# ls

blobs repositories

[[email protected] v2]# cd repositories/

[[email protected] repositories]# ls

myweb

[[email protected] repositories]# ls myweb/

_layers _manifests _uploads

[[email protected] repositories]# ls myweb/_layers/sha256/

05f10f0430cbdd4e77759dec3f075a88a9211f70665b69eb0e6e63e24696612b

428de5b8d58a2547bec1c51d249f7c99dd0eadc454a44205def2e5e826992896

4f98fc8b751c0da0efe6133a9df21d68cd713de0ad00c2016e2fa5afbb8c191a

61a56b170416bea473afcb041812027f39024d5e890e5874c971e32380d9f32b

7efd417f3e288119f4aea8cf4b4f804ffecef91559fe683ceada620a09bf9407

8654768780c4b660118a2604f5c4e8b54f7658dbe26287a43622a80a0cef3022

c67f3896b22c1378881cbbb9c9d1edfe881fd07f713371835ef46d93c649684d

[[email protected] repositories]# ls myweb/_layers/sha256/05f10f0430cbdd4e77759dec3f075a88a9211f70665b69eb0e6e63e24696612b/

link

下載映象

[[email protected] ~]# vim /etc/docker/daemon.json

{

"registry-mirrors": ["https://llpuz83z.mirror.aliyuncs.com","https://registry.docker-cn.com"],

"insecure-registries": ["node2.zisefeizhu.com:5000"]   //修改使其可以通過http方式私有倉庫pull映象

}

[[email protected] ~]# systemctl restart docker

[[email protected] ~]# cat /etc/docker

docker/ docker-distribution/

拖取成功

[[email protected] ~]# docker pull node2.zisefeizhu.com:5000/myweb:v0.3-8

v0.3-8: Pulling from myweb

c67f3896b22c: Pull complete

428de5b8d58a: Pull complete

7efd417f3e28: Pull complete

61a56b170416: Pull complete

8654768780c4: Pull complete

4f98fc8b751c: Pull complete

Digest: sha256:3b70494d5bae8bdc49c6d0b93b3ed7ea4522bb854dd77d672c7252ed4887bf4b

Status: Downloaded newer image for node2.zisefeizhu.com:5000/myweb:v0.3-8

檢視映象

[[email protected] ~]# docker image ls

REPOSITORY TAG IMAGE ID CREATED SIZE

node2.zisefeizhu.com:5000/myweb v0.3-8 05f10f0430cb 18 hours ago 17.4MB

缺點:太醜陋了。。。

distribution沒有web頁面,管理起來不方便,還有一個解決辦法是vmware harbor,路徑為https://github.com/vmware/harbor  關於harbor的安裝文件,可以見連結 https://github.com/vmware/harbor/blob/master/docs/installation_guide.md

Harbor簡介

Harbor介紹

Harbor是一個用於儲存和分發Docker映象的企業級Registry伺服器,通過新增一些企業必需的功能特性,例如安全、標識和管理等,擴充套件了開源Docker Distribution。作為一個企業級私有Registry伺服器,Harbor提供了更好的效能和安全。提升使用者使用Registry構建和執行環境傳輸映象的效率。Harbor支援安裝在多個Registry節點的映象資源複製,映象全部儲存在私有Registry中, 確保資料和智慧財產權在公司內部網路中管控。另外,Harbor也提供了高階的安全特性,諸如使用者管理,訪問控制和活動審計等。

Harbor特性

基於角色的訪問控制 :使用者與Docker映象倉庫通過“專案”進行組織管理,一個使用者可以對多個映象倉庫在同一名稱空間(project)裡有不同的許可權。

映象複製 : 映象可以在多個Registry例項中複製(同步)。尤其適合於負載均衡,高可用,混合雲和多雲的場景。

圖形化使用者介面 : 使用者可以通過瀏覽器來瀏覽,檢索當前Docker映象倉庫,管理專案和名稱空間。

AD/LDAP 支援 : Harbor可以整合企業內部已有的AD/LDAP,用於鑑權認證管理。

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

國際化 : 已擁有英文、中文、德文、日文和俄文的本地化版本。更多的語言將會新增進來。

RESTful API : RESTful API 提供給管理員對於Harbor更多的操控, 使得與其它管理軟體整合變得更容易。

部署簡單 : 提供線上和離線兩種安裝工具, 也可以安裝到vSphere平臺(OVA方式)虛擬裝置。

3.Harbor元件

Harbor在架構上主要由6個元件構成:

Proxy:Harbor的registry, UI, token等服務,通過一個前置的反向代理統一接收瀏覽器、Docker客戶端的請求,並將請求轉發給後端不同的服務。

Registry: 負責儲存Docker映象,並處理docker push/pull 命令。由於我們要對使用者進行訪問控制,即不同使用者對Docker image有不同的讀寫許可權,Registry會指向一個token服務,強制使用者的每次docker pull/push請求都要攜帶一個合法的token, Registry會通過公鑰對token 進行解密驗證。

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

UI:提供圖形化介面,幫助使用者管理registry上的映象(image), 並對使用者進行授權。

webhook:為了及時獲取registry 上image狀態變化的情況, 在Registry上配置webhook,把狀態變化傳遞給UI模組。

token 服務:負責根據使用者許可權給每個docker push/pull命令簽發token. Docker 客戶端向Regiøstry服務發起的請求,如果不包含token,會被重定向到這裡,獲得token後再重新向Registry進行請求。

Database:為core services提供資料庫服務,負責儲存使用者許可權、審計日誌、Docker image分組資訊等資料。

Job Services:提供映象遠端複製功能,可以把本地映象同步到其他Harbor例項中。

Log collector:為了幫助監控Harbor執行,負責收集其他元件的log,供日後進行分析。

各個元件之間的關係如下圖所示:

.Harbor實現

Harbor的每個元件都是以Docker容器的形式構建的,官方也是使用Docker Compose來對它進行部署。用於部署Harbor的Docker Compose模板位於 harbor/docker-compose.yml,開啟這個模板檔案,發現Harbor是由7個容器組成的;

# docker-compose ps
       Name                     Command               State                                Ports                              
------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver   /harbor/harbor_adminserver       Up                                                                      
harbor-db            docker-entrypoint.sh mysqld      Up      3306/tcp                                                        
harbor-jobservice    /harbor/harbor_jobservice        Up                                                                      
harbor-log           /bin/sh -c crond && rm -f  ...   Up      127.0.0.1:1514->514/tcp                                         
harbor-ui            /harbor/harbor_ui                Up                                                                      
nginx                nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp
registry             /entrypoint.sh serve /etc/ ...   Up      5000/tcp 

nginx:nginx負責流量轉發和安全驗證,對外提供的流量都是從nginx中轉,所以開放https的443埠,它將流量分發到後端的ui和正在docker映象儲存的docker registry。
harbor-jobservice:harbor-jobservice 是harbor的job管理模組,job在harbor裡面主要是為了映象倉庫之前同步使用的;
harbor-ui:harbor-ui是web管理頁面,主要是前端的頁面和後端CURD的介面;
registry:registry就是docker原生的倉庫,負責儲存映象。
harbor-adminserver:harbor-adminserver是harbor系統管理介面,可以修改系統配置以及獲取系統資訊。
這幾個容器通過Docker link的形式連線在一起,在容器之間通過容器名字互相訪問。對終端使用者而言,只需要暴露proxy (即Nginx)的服務埠。
harbor-db:harbor-db是harbor的資料庫,這裡儲存了系統的job以及專案、人員許可權管理。由於本harbor的認證也是通過資料,在生產環節大多對接到企業的ldap中;
harbor-log:harbor-log是harbor的日誌服務,統一管理harbor的日誌。通過inspect可以看出容器統一將日誌輸出的syslog。

這幾個容器通過Docker link的形式連線在一起,這樣,在容器之間可以通過容器名字互相訪問。對終端使用者而言,只需要暴露proxy (即Nginx)的服務埠。

例項:

下載harbor

https://github.com/goharbor/harbor/releases   這裡有關於harbor的詳細說明

我這裡以1.2.0為例演示

[[email protected] ~]#wget http://harbor.orientsoft.cn/harbor-v1.5.0/harbor-offline-installer-v1.2.0.tgz

[[email protected] ~]# tar xf harbor-online-installer-v1.2.0.tgz -C /usr/local

[[email protected] ~]# cd /usr/local/

[[email protected] local]# ls

bin etc games harbor include lib lib64 libexec sbin share src

[[email protected] local]# cd harbor/

[[email protected] harbor]# ls

common docker-compose.yml install.sh prepare

docker-compose.clair.yml harbor_1_1_0_template LICENSE upgrade

docker-compose.notary.yml harbor.cfg NOTICE

//執行install.sh前先編輯docker-compose.yml

//需要仔細閱讀docker-compose.yml 和 harbor.cfg

[[email protected] ~]# systemctl stop docker-distribution.service //先停掉服務再編輯

[[email protected] harbor]# vim harbor.cfg

hostname = node2.zisefeizhu.com

db_password = root123

#管理登入密碼

harbor_admin_password = Harbor12345

#The path of cert and key files for nginx, they are applied only the protocol is set to

https

ssl_cert = /data/cert/server.crt

ssl_cert_key = /data/cert/server.key

執行指令碼

[[email protected] harbor]# ./install.sh 過程會很慢 還顯示版本過低

安裝過程,[Step 1]: loading Harbor images … 這一步比較慢,需要下載很多映象,來實現相關的服務

停止docker harbor服務,通過docker-compose來實現,所有harbor服務會被停止,命令如下

注意,命令必須在/usr/local/harbor/路徑下執行

docker-compose stop

啟動服務

yum install -y docker-compose

[[email protected] ~]#docker-compose start

[[email protected] harbor]# ./install.sh

[[email protected] ~]# ss -tnl

State Recv-Q Send-Q Local Address:Port Peer Address:Port

LISTEN 0 128 127.0.0.1:1514 *:*

LISTEN 0 128 *:22 *:*

LISTEN 0 128 :::5000 :::*

LISTEN 0 128 :::80 :::*

LISTEN 0 128 :::22 :::*

LISTEN 0 128 :::443 :::*

LISTEN 0 128 :::4443 :::*

建立一個使用者:zhujingxing

建立目標

關閉證書(也可以自己搭建個CA認證)

普通使用者登入

自定一個專案,專案裡可以有很多倉庫

驗證推node1推映象到倉庫

[[email protected] ~]# vim /etc/docker/daemon.json     //node2也做相應修改

{
  "registry-mirrors": ["https://llpuz83z.mirror.aliyuncs.com","https://registry.docker-cn.com"],
  "insecure-registries": ["node2.zisefeizhu.com"]   //預設就是PORT:80
}
[[email protected] ~]# systemctl restart docker

重新打標(多打幾個)

[[email protected] ~]# docker  tag  myweb:v0.3-1 node2.zisefeizhu.com/devel/myweb:v0.3-1
[[email protected] ~]# docker  tag  myweb:v0.3-2 node2.zisefeizhu.com/devel/myweb:v0.3-2
[[email protected] ~]# docker  tag  myweb:v0.3-4 node2.zisefeizhu.com/devel/myweb:v0.3-4

登陸

[[email protected] ~]# docker login node2.zisefeizhu.com
Username: zhujingxing     //普通使用者
Password:                        //對應使用者設定的密碼
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
推到倉庫

[[email protected] ~]# docker push node2.zisefeizhu.com/devel/myweb
The push refers to repository [node2.zisefeizhu.com/devel/myweb]
cc61e03b98b5: Pushed 
9a07ffbe3d7d: Pushed 
955e7d7f7300: Pushed 
95bb4e754f2d: Pushed 
ebf12965380b: Pushed 
v0.3-1: digest: sha256:fbfb1113ee9b4d467415f1149c0f4b0f1523018cd46b5ae6884ddc52d9b0293e size: 1360
6f41b1930405: Pushed 
9a07ffbe3d7d: Layer already exists 
955e7d7f7300: Layer already exists 
95bb4e754f2d: Layer already exists 
ebf12965380b: Layer already exists 
v0.3-2: digest: sha256:9945293ffcd1db79922d78209c884e25b7cc153e8364c07d881c5499862daa3c size: 1360
6f41b1930405: Layer already exists 
9a07ffbe3d7d: Layer already exists 
955e7d7f7300: Layer already exists 
95bb4e754f2d: Layer already exists 
ebf12965380b: Layer already exists 
v0.3-4: digest: sha256:c2f07dcc0319d75c83e6661cd48708c62d4bc05c097a93ff59b78e82f8dbb895 size: 1...

頁面驗證

成功!!!

但是還有一定問題的:上傳的映象放到了那個路徑下了 vim docker-compose.yml

我們可以改一改,改成我們真正準備的一個磁碟空間,空間較大的,IO較強的分割槽或者目錄

停止docker-compose

[[email protected] harbor]# docker-compose pause    //暫停 ,訪問不到了
Pausing harbor-log         ... done
Pausing harbor-adminserver ... done
Pausing harbor-db          ... done
Pausing registry           ... done
Pausing harbor-ui          ... done
Pausing harbor-jobservice  ... done
Pausing nginx              ... done
[[email protected] harbor]# docker-compose unpause  //繼續執行
Unpausing nginx              ... done
Unpausing harbor-jobservice  ... done
Unpausing harbor-ui          ... done
Unpausing registry           ... done
Unpausing harbor-db          ... done
Unpausing harbor-adminserver ... done
Unpausing harbor-log         ... done

[[email protected] harbor]# docker-compose --help
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

將來我們可以把harbor也託管到Kubernetes上,所以這裡我們會簡單應用即可!!!

參考:

https://www.cnblogs.com/pangguoping/p/7650014.html

https://www.jianshu.com/p/6ebd82086754

http://blog.51cto.com/ghbsunny/2155048