Docker之企業級私有鏡像倉庫Harbor的部署

Docker鏡像倉庫Harbor之搭建及配置

Docker鏡像倉庫Harbor之搭建及配置... 1前端

1、         Harbor簡介... 1node

2、         安裝和配置Harbor. 3python

1.      環境說明... 3linux

2.      安裝docker. 4nginx

3.      安裝docker-compose. 4git

4.      安裝harbor. 6github

5.      修改配置文件... 6web

6.      執行安裝腳本... 6redis

7.      Harbor啓動和中止... 7docker

8.      訪問測試... 7

3、         測試上傳和下載鏡像... 8

4、         Harbor配置TLS證書... 9

1.      修改Harbor配置文件... 9

2.      建立自簽名證書key文件... 9

3.      建立自簽名證書crt文件... 10

4.      開始安裝Harbor. 10

5.      客戶端配置... 10

6.      測試是否支持https訪問... 10

5、         鏡像刪除... 11

6、         遇到問題... 13

 

1、      Harbor簡介

  1. 1.    Harbor介紹

Docker容器應用的開發和運行離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,可是從安全和效率等方面考慮,部署咱們私有環境內的Registry也是很是必要的。Harbor是由VMware公司開源的企業級的Docker Registry管理項目,它包括權限管理(RBAC)、LDAP、日誌審覈、管理界面、自我註冊、鏡像複製和中文支持等功能。

  1. 2.    Harbor特性
  • 基於角色的訪問控制 :用戶與Docker鏡像倉庫經過「項目」進行組織管理,一個用戶能夠對多個鏡像倉庫在同一命名空間(project)裏有不一樣的權限。
  • 鏡像複製 : 鏡像能夠在多個Registry實例中複製(同步)。尤爲適合於負載均衡,高可用,混合雲和多雲的場景。
  • 圖形化用戶界面 : 用戶能夠經過瀏覽器來瀏覽,檢索當前Docker鏡像倉庫,管理項目和命名空間。
  • AD/LDAP 支持 : Harbor能夠集成企業內部已有的AD/LDAP,用於鑑權認證管理。
  • 審計管理 : 全部針對鏡像倉庫的操做均可以被記錄追溯,用於審計管理。
  • 國際化 : 已擁有英文、中文、德文、日文和俄文的本地化版本。更多的語言將會添加進來。
  • RESTful API : RESTful API 提供給管理員對於Harbor更多的操控, 使得與其它管理軟件集成變得更容易。
  • 部署簡單 : 提供在線和離線兩種安裝工具, 也能夠安裝到vSphere平臺(OVA方式)虛擬設備。
  1. 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個容器組成的;

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)的服務端口。

2、      安裝和配置Harbor

1.      環境說明

     

  

環境名稱

  
  

版本

  

系統版本

CentOS Linux   release 7.2.1511 (Core)

docker-ce

17.03.1-ce

docker-compose

1.16.1

Harbor

v1.2.0

安裝方式

在線安裝

安裝位置

/usr/local/harbor

2.      安裝docker

安裝Harbor須要先安裝docker和docker-compose

# yum install -y yum-utils \

  device-mapper-persistent-data \

  lvm2

配置repository:

# yum-config-manager \

    --add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

 

安裝最新版本docker-ce   Docker version 17.03.1-ce

# yum install docker-ce

啓動docker:

# systemctl start docker

若是須要卸載docker-ce,操做以下:
yum remove docker-ce
卸載後images,containers,volumes,configuration files 是不能自動刪除的,爲了刪除all images,containers,and volumes,請執行以下命令:
rm -rf /var/lib/docker

3.      安裝docker-compose

方法一:二進制安裝

a.下載二進制文件

# curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

若是須要安裝其餘版本的話,請修改上面命令中的版本號。

b.賦予二進制文件可執行權限

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

c.根據本身的狀況決定是否安裝命令補全功能

# yum install bash-completion

[root@test-tz-master ~]# curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# docker-compose

build    config   down     exec     images   logs     port     pull     restart  run      start    top      up      

bundle   create   events   help     kill     pause    ps       push     rm       scale    stop     unpause  version 

d.測試是否安裝成功

# docker-compose --version

docker-compose version 1.22.0, build 6d1ac21

若是是單機版,則將此文件拷貝到/usr/local/bin/docker-compose,執行便可,只能用這種方式安裝的進行,pip方式拷貝不生效。

方法二:pip

# yum install python-pip

# pip install --upgrade pip

# pip install  docker-compose

測試:

# docker-compose --version

卸載docker-compose
對應上面兩種安裝方法:
二進制:

# rm  /usr/local/bin/docker-compose

pip 方式

# pip uninstall  docker-compose

根據狀況看是否須要安裝

沒有python-pip包執行命令 yum install –y epel-release

執行yum install 報錯

"Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7"

解決:yum install -y epel-release    

# cd /etc/pki/rpm-gpg

# wget https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7

報錯及解決

報錯:ReadTimeoutError: HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed out

# pip --default-timeout=200 install -U docker-compose

若是報錯:

pkg_resources.DistributionNotFound: backports.ssl-match-hostname>=3.5 

解決方法:更新backports.ssl-match-hostname的版本,在終端輸入命令
  pip install --upgrade backports.ssl_match_hostname

4.      安裝harbor

安裝方式分爲在線安裝和離線安裝兩種方式,我這裏選擇的是離線安裝。

# wget -P /usr/loca/src/     https://github.com/vmware/harbor/releases/download/v1.6.0/harbor-offline-installer-v1.6.0.tgz

# cd /usr/local/src/

# tar zxf harbor-online-installer-v1.2.0.tgz  -C /usr/local/

# cd /usr/local/harbor/

5.      修改配置文件

# vim /usr/local/harbor/harbor.cfg

hostname = http://192.168.1.121

#郵箱配置
email_server = smtp.qq.com
25email_server_port =
@unixfbiemail_username = unixfbi.com
12345678email_password =
@unixfbiemail_from = UnixFBI <unixfbi.com>
falseemail_ssl =
#禁止用戶註冊
self_registration = off
#用戶建立項目權限控制,默認是everyone(全部人),也能夠設置爲adminonly(只能管理員)
project_creation_restriction = adminonly
harbor_admin_password = Harbor

6.      執行安裝腳本

# sh install.sh

出現如下安裝成功

Now you should be able to visit the admin portal at http://192.168.1.121

For more details, please visit https://github.com/vmware/harbor

7.      Harbor啓動和中止

Harbor 的平常運維管理是經過docker-compose來完成的,Harbor自己有多個服務進程,都放在docker容器之中運行,咱們能夠經過docker ps命令查看。

[root@node01-1 harbor]# docker-compose ps

       Name                     Command               State                                Ports                             

------------------------------------------------------------------------------------------------------------------------------

harbor-adminserver   /harbor/start.sh                 Up                                                                      

harbor-db            /entrypoint.sh postgres          Up      5432/tcp                                                       

harbor-jobservice    /harbor/start.sh                 Up                                                                      

harbor-log           /bin/sh -c /usr/local/bin/ ...   Up      127.0.0.1:1514->10514/tcp                                      

harbor-ui            /harbor/start.sh                 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

redis                docker-entrypoint.sh redis ...   Up      6379/tcp                                                        

registry             /entrypoint.sh /etc/regist ...   Up      5000/tcp  

Harbor的啓動和中止

啓動Harbor

# docker-compose start   docker-compose up -d

中止Harbor

# docker-comose stop     docker-compose down -v

重啓Harbor

# docker-compose restart

8.      訪問測試

瀏覽器訪問:http://192.168.1.121

 

 

後臺登陸倉庫

[root@node01-1 harbor]# docker login 192.168.1.121 -uadmin -pHarbor

Error response from daemon: Get https://192.168.1.121/v1/users/: dial tcp 192.168.1.121:443: getsockopt: connection refused

[root@node01-1 harbor]# netstat -ntpl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      855/sshd           

tcp        0      0 127.0.0.1:1514          0.0.0.0:*               LISTEN      1475/docker-proxy-c

tcp6       0      0 :::80                   :::*                    LISTEN      1509/docker-proxy-c

tcp6       0      0 :::22                   :::*                    LISTEN      855/sshd           

tcp6       0      0 :::443                  :::*                    LISTEN      1498/docker-proxy-c

tcp6       0      0 :::4443                 :::*                    LISTEN      1487/docker-proxy-c

kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1

查文檔千變一概說docker一個bug,卸載重裝後依然,

# yum remove docker\*

# yum remove container-selinux\*

# ls docker-ce-

docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm          docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm

# yum install docker-ce-*

# rm -rf /var/lib/docker

# systemctl restart docker

從新安裝harbor,

3、      測試上傳和下載鏡像

更改配置文件不生效,後docker版本更換爲17.03,生效

vi /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd    --insecure-registry 192.168.1.121:80

# systemctl daemon-reload

# systemctl restart docker

# docker login 192.168.1.121:80 -uadmin -pHarbor12345

Login Succeeded

 

# docker tag e548f1a579cf  192.168.1.120:80/library/nginx:t1

# docker push  192.168.1.120:80/library/nginx:t1

 

 

 

修改vi /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd    --insecure-registry 192.168.1.120

# systemctl daemon-reload

# systemctl restart docker

# docker login 192.168.1.120

Username: admin

Password:

Login Succeeded

[root@master-1 harbor]# docker push  192.168.1.120/library/nginx:t2

The push refers to a repository [192.168.1.120/library/nginx]

e89b70d28795: Pushed

832a3ae4ac84: Layer already exists

014cf8bfcb2d: Layer already exists

t1: digest: sha256:9b1ac09900081baca06c8cad32767aeceed9ee62404b1f0c20122cb9a7b1a6e1 size: 948

 

 

可見docker配置文件配的什麼就是什麼,

至此私有鏡像庫搭建完畢!

 

4、      Harbor配置TLS證書

1.      修改Harbor配置文件

修改harbor.cfg

hostname = rgs.unixfbi.com

ui_url_protocol = https

ssl_cert = /etc/certs/ca.crt

ssl_cert_key = /etc/certs/ca.key

2.      建立自簽名證書key文件

# mkdir /etc/certs

# openssl genrsa -out /etc/certs/ca.key 2048

Generating RSA private key, 2048 bit long modulus

....+++

..................................................+++

e is 65537 (0x10001)

3.      建立自簽名證書crt文件

注意命令中/CN=rgs.unixfbi.com字段中rgs.unixfbi.com修改成你本身的倉庫域名。

# openssl req -x509 -new -nodes -key /etc/certs/ca.key -subj "/CN=rgs.unixfbi.com" -days 5000 -out /etc/certs/ca.crt

4.      開始安裝Harbor

# ./install.sh

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at https://rgs.unixfbi.com.

For more details, please visit https://github.com/vmware/harbor .

5.      客戶端配置

客戶端須要建立證書文件存放的位置,而且把服務端建立的證書拷貝到該目錄下,而後重啓客戶端docker。咱們這裏建立目錄爲:/etc/docker/certs.d/rgs.unixfbi.com

# mkdir -p /etc/docker/certs.d/rgs.unixfbi.com

把服務端crt證書文件拷貝到客戶端,例如我這的客戶端爲:192.168.199.183

# scp /etc/certs/ca.crt root@192.168.199.183:/etc/docker/certs.d/rgs.unixfbi.com/

重啓客戶端docker

# systemctl restart docker

 

6.      測試是否支持https訪問

# docker login rgs.unixfbi.com

Username (admin):

Password:

Login Succeeded

 

5、      鏡像刪除

Harbor私有倉庫運行一段時間後,倉庫中存有大量鏡像,會佔用太多的存儲空間。直接經過Harbor界面刪除相關鏡像,並不會自動刪除存儲中的文件和鏡像。須要中止Harbor服務,執行垃圾回收命令,進行存儲空間清理和回收。

 

#要啓用垃圾回收(GC),首先要關閉Harbor服務,而後再執行清理命令

#中止Harbor相關服務

$ docker-compose stop

#使用--dry-run參數運行容器,預覽運行效果,但不刪除任何數據

$ docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect --dry-run /etc/registry/config.yml

#NOTE: The above option "--dry-run" will print the progress without removing any data.

Verify the result of the above test, then use the below commands to perform garbage collection and restart Harbor.

#不使用--dry-run參數,將刪除相關的文件和鏡像,

$ docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect  /etc/registry/config.yml

#從新啓動Harbor相關服務

$ docker-compose start

圖1:01-先在Harbor UI圖形界面中刪除不須要的鏡像

圖2:02-中止Harbor服務,執行垃圾回收命令

[root@master-1 harbor]# docker images | grep goharbor | grep registry

goharbor/registry-photon                                   v2.6.2-v1.6.0       98bf341403a5        6 days ago          201 MB

 

# docker run -it --name gc --rm --volumes-from registry goharbor/registry-photon:v2.6.2-v1.6.0  garbage-collect --dry-run /etc/registry/config.yml

# docker run -it --name gc --rm --volumes-from registry goharbor/registry-photon:v2.6.2-v1.6.0 garbage-collect /etc/registry/config.yml

 

6、      遇到問題

遇到的問題就是Harbor我配置的是http訪問,可是docker客戶端默認都是https訪問Harbor,因此就會產生錯誤。下面看看我是怎麼解決這個問題的吧。下面咱們來訪問如下Harbor

# docker pull rgs.unixfbi.com/library/centos7.1:0.1

Error response from daemon: Get https://rgs.unixfbi.com/v1/_ping: dial tcp 192.168.199.233:443: getsockopt: connection refused

解決方法
方法一
在docker啓動的配置倉庫地址添加以下內容:
--insecure-registry rgs.unixfbi.com

# vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --insecure-registry rgs.unixfbi.com

而後

# systemctl daemon-reload

# systemctl  restart docker

 

補充:--insecure-registry 192.168.1.14:5000

dig @114.114.114.114 registry-1.docker.io

參考文檔:

docker官網: https://docs.docker.com/install/

compose文檔:https://docs.docker.com/compose/install/#install-compose

harbor官網:https://github.com/goharbor/harbor/releases

相關文章
相關標籤/搜索