Harbor是一個用於存儲和分發Docker鏡像的企業級Registry服務器,經過添加一些企業必需的功能特性,例如安全、標識和管理等,擴展了開源Docker Distribution。做爲一個企業級私有Registry服務器,Harbor提供了更好的性能和安全。提高用戶使用Registry構建和運行環境傳輸鏡像的效率。Harbor支持安裝在多個Registry節點的鏡像資源複製,鏡像所有保存在私有Registry中, 確保數據和知識產權在公司內部網絡中管控。另外,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,供往後進行分析。
各個組件之間的關係以下圖所示:
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)的服務端口。
一、安裝最新版的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
一、全部服務器修改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頁面查看鏡像
六、在別的服務器上拉取鏡像,服務器上要先更改好私庫地址
參考文章: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內容能夠刪除登陸記錄