搭建Harbor企業級docker倉庫

 

 

 

1、Harbor簡介

1.Harbor介紹

Harbor是一個用於存儲和分發Docker鏡像的企業級Registry服務器,經過添加一些企業必需的功能特性,例如安全、標識和管理等,擴展了開源Docker Distribution。做爲一個企業級私有Registry服務器,Harbor提供了更好的性能和安全。提高用戶使用Registry構建和運行環境傳輸鏡像的效率。Harbor支持安裝在多個Registry節點的鏡像資源複製,鏡像所有保存在私有Registry中, 確保數據和知識產權在公司內部網絡中管控。另外,Harbor也提供了高級的安全特性,諸如用戶管理,訪問控制和活動審計等。前端

2.Harbor特性

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

3.Harbor組件

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

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

  • Registry: 負責儲存Docker鏡像,並處理docker push/pull 命令。因爲咱們要對用戶進行訪問控制,即不一樣用戶對Docker image有不一樣的讀寫權限,Registry會指向一個token服務,強制用戶的每次docker pull/push請求都要攜帶一個合法的token, Registry會經過公鑰對token 進行解密驗證。mysql

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

  • UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 並對用戶進行受權。git

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

  • token 服務:負責根據用戶權限給每一個docker push/pull命令簽發token. Docker 客戶端向Regiøstry服務發起的請求,若是不包含token,會被重定向到這裏,得到token後再從新向Registry進行請求。web

  • Database:爲core services提供數據庫服務,負責儲存用戶權限、審計日誌、Docker image分組信息等數據。sql

  • Job Services:提供鏡像遠程複製功能,能夠把本地鏡像同步到其餘Harbor實例中。docker

  • Log collector:爲了幫助監控Harbor運行,負責收集其餘組件的log,供往後進行分析。

各個組件之間的關係以下圖所示:

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

 

2、安裝部署

一、安裝最新版的docker    docker-compose

curl -fsSL https://get.docker.com/ | sh    或  yum install docker-ce-18.03.1.ce
curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose

驗證

docker version
docker-compose --version

 

二、安裝harbor

登陸下載相應版本的harbor  

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

harbor-offline-installer-v1.8.1.tgz

解壓

tar zxvf harbor-offline-installer-v1.8.1.tgz 

編輯 harbor.yml而後執行./install.sh

 

安裝完成後在瀏覽器使用 172.16.119.225便可登錄,若是用域名的話,能夠配置nginx以下:

server {
    listen              80;
    server_name         harbor.xxx.com;
    location / {
        proxy_pass http://172.16.119.225:80;
  }
}

便可使用域名登錄,登錄帳號密碼在harbor.yml配置的,默認帳號密碼: admin / Harbor12345 登陸後可修改密碼。

 

Harbor的啓動和中止

# 啓動Harbor
docker-compose start
# 中止Harbor
docker-comose stop
# 重啓Harbor
docker-compose restart

 

 3、測試上傳下載鏡像

一、全部服務器修改docker客戶端配置

vim /usr/lib/systemd/system/docker.service  增長 --insecure-registry=http://172.16.119.225:80 便可。

ExecStart=/usr/bin/dockerd  --insecure-registry=http://172.16.119.225:80  #harbor.yml裏配置的hostname值

重啓docker

systemctl restart docker

或建立/etc/docker/daemon.json文件,在文件中指定倉庫地址 ,而後從新docker

{
  "insecure-registries":["172.16.119.225:80"]
}

 

 

二、建立Dockerfile

from docker.io/tomcat:latest
MAINTAINER zhangpan
RUN rm -rf /usr/local/openjdk-8
RUN rm -rf /usr/local/tomcat
COPY jdk1.8.0_92 /usr/local/jdk1.8.0_92
COPY tomcat /usr/local/tomcat

三、建立鏡像

tag名稱裏  172.16.119.225:80/library/  是不變的,172.16.119.225:80表示私庫地址,library是倉庫項目名,能夠更改,但私庫裏要先建立好

docker build -t 172.16.119.225:80/library/tomcat:wuyun .

 

四、登陸私庫而後把鏡像推送到Harbor倉庫

docker push 172.16.119.225:80/library/tomcat:wuyun   

 

若是不是本身建立的鏡像,須要先執行 docker tags 給鏡像作tag再推送,如:

docker pull flannel
docker tag quay.io/coreos/flannel:v0.11.0-amd64  172.16.119.225:80/library/flannel:v0.11.0-amd64 
docker push 172.16.119.225:80/library/busybox:latest

 

 刪除這種同id不一樣tag的鏡像

docker rmi 172.16.119.225:80/library/flannel:v0.11.0-amd64

 

 

 

五、登錄web頁面查看鏡像

 

 

 

六、在別的服務器上拉取鏡像,服務器上要先更改好私庫地址

 

 

4、Harbor配置TLS證書

參考文章:https://github.com/goharbor/harbor/blob/master/docs/configure_https.md

由於咱們上面對Harbor的配置都是使用的http協議訪問,可是咱們工做中通常都是配置https訪問。因此我給你們演示一下怎麼配置Harbor可使用https訪問,以及配置TLS證書都須要作哪些工做。

 由於Harbor默認使用http協議訪問,因此咱們這裏在配置文件中,開啓https配置;

一、編輯harbor.yml 

http 和port前加上註釋,同時取消https  port  certificate    private_key前註釋並修改證書路徑

 

 

 

 

二、建立目錄並生成ca文件

mkdir /etc/certs  && cd /etc/certs/
openssl genrsa -out /etc/certs/ca.key 2048 

 

三、建立自簽名證書key文件,注意CN的值,更改和harbor.yml裏hostname值同樣便可

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

 

四、生成服務器端私鑰和CSR簽名請求

openssl genrsa -out 172.16.119.225.key 4096   #172.16.119.225是ip或者主機名
openssl req -sha512 -new -subj "/CN=172.16.119.225" -key 172.16.119.225.key  -out 172.16.119.225.csr

 

五、簽發服務器證書

建立文件v3.ext並生成crt文件

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth 
subjectAltName = @alt_names

[alt_names]
DNS.1=172.16.119.225
DNS.2=test-04
IP.1=
172.16.119.225 #其餘須要鏈接docker私庫的服務器IP地址
IP.2=172.16.119.224
IP.3=172.16.119.223
IP.4=172.16.119.***
 
openssl x509 -req -sha512 -days 3650 -extfile v3.ext  -CA ca.crt -CAkey ca.key -CAcreateserial  -in 172.16.119.225.csr -out 172.16.119.225.crt

 

所有證書生成後結果以下:

 

 

六、配置docker證書

爲全部須要用https的 Docker服務器配置服務器證書,密鑰和CA.

Docker守護程序將.crt文件解釋爲CA證書,將.cert文件解釋爲客戶端證書。

 

將crt文件轉換爲cert文件

openssl x509 -inform PEM -in 172.16.119.225.crt -out 172.16.119.225.cert

 

將文件cert  key和ca文件拷貝到 /etc/docker/certs.d/172.16.119.225 若是沒有目錄就新建,目錄格式不能錯。

 
 

# 若是以下目錄不存在,請建立,若是有域名請按此格式依次建立
mkdir -p /etc/docker/certs.d/192.168.50.84
# mkdir -p /etc/docker/certs.d/[IP2]
# mkdir -p /etc/docker/certs.d/[example1.com]
# 若是端口爲443,則不須要指定。若是爲自定義端口,請指定端口
# /etc/docker/certs.d/yourdomain.com:port


mkdir -p /etc/docker/certs.d/172.16.119.225

cp 172.16.119.225.cert /etc/docker/certs.d/172.16.119.225

cp 172.16.119.225.key /etc/docker/certs.d/172.16.119.225

cp ca.crt /etc/docker/certs.d/172.16.119.225

 

七、重啓docker而後爲Harbor生成配置文件

systemctl restart docker
./prepare 

若是Harbor已在運行,請中止並刪除現有實例。而後重啓實例

 

docker-compose down -v
docker-compose up -d

 

若是nginx沒法啓動且查看容器日誌也查看不了,報以下錯誤

Error response from daemon: configured logging driver does not support reading

 

 

遇到此問題能夠關注docker-compose.yml 如下選項是否對應

source: /data/cert/server.key
target: /etc/cert/server.key
source: /data/cert/server.crt
target: /etc/cert/server.crt

 

 我這查看顯示source 都是ca.crt,由於我複製錯了,docker-compose.yml 是在./install 後映射的harbor.yml內容,因此更改harbor.yml後從新安裝便可

 

八、測試

全部docker服務器先更改/etc/docker/daemon.json再重啓docker

{
  "insecure-registries":["172.16.119.225:443"]
}

而後docker login 172.16.119.225:443 若是提示x509: certificate signed by unknown authority錯誤,則須要添加主機信任,centos操做以下:

cp 172.16.119.225.crt /etc/pki/ca-trust/source/anchors/172.16.119.225.crt

update-ca-trust

再次登陸便可,若是端口不是443端口,登陸須要指明端口,如:docker login 172.16.119.225:9999

 ps  刪除 ~/.docker/config.json  文件內 auths內容能夠刪除登陸記錄

相關文章
相關標籤/搜索