1. 程式人生 > 程式設計 >Harbor私有映象倉庫無坑搭建

Harbor私有映象倉庫無坑搭建

一、介紹

Docker容器應用的開發和執行路不開可靠的映象管理,雖然Docker官方也提供了公共的映象倉庫,但是從安全和效率等方面考慮,部署我們私有環境的Registry也是非常必要的。 Harbor是由VMware公司開源的企業級的Docker Registry管理專案,它包括許可權管理(RBAC)、LDAP、日誌稽核、管理介面、自我註冊、映象複製和中文支援等功能。

二、元件

用於部署 Harbor 的 Docker Compose 模板位於 /Deployer/docker-compose.yml. 開啟這個模板檔案,會發現 Harbor 由 5 個容器組成:

  • proxy:由 Nginx 伺服器構成的反向代理。
  • registry:由 Docker 官方的開源 registry 映象構成的容器例項。
  • ui:即架構中的 core services,構成此容器的程式碼是 Harbor 專案的主體。
  • mysql:由官方 MySql 映象構成的資料庫容器。
  • log: 執行著 rsyslogd 的容器,通過 log-driver 的形式收集其他容器的日誌。

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

三、工作原理

假設我們將 Harbor 部署在主機名為 registry.abcdocker.com 的虛機上。使用者通過 docker login 命令向這個 Harbor 服務發起登入請求:docker login registry.abcdocker.com當使用者輸入所需資訊並點選回車後,Docker 客戶端會向地址“registry.abcdocker.com/v2/” 發出 HTTP GET 請求。

Harbor 的各個容器會通過以下步驟處理:

(1)Docker login

(a) 首先,這個請求會由監聽 80 埠的 proxy 容器接收到。根據預先設定的匹配規則,容器中的 Nginx會將請求轉發給後端的 registry 容器;

(b) 在 registry 容器一方,由於配置了基於 token 的認證,registry 會返回錯誤程式碼 401,提示 Docker客戶端訪問 token 服務繫結的 URL。在 Harbor 中,這個 URL 指向 Core Services;

(c) Docker 客戶端在接到這個錯誤程式碼後,會向token服務的URL發出請求,並根據HTTP協議的BasicAuthentication 規範,將使用者名稱密碼組合並編碼,放在請求頭部(header);

(d)類似地,這個請求通過 80 埠發到 proxy 容器後,Nginx 會根據規則把請求轉發給 ui 容器,ui 容器監聽 token 服務網址的處理程式接收到請求後,會將請求頭解碼,得到使用者名稱、密碼;

(e) 在得到使用者名稱、密碼後,ui 容器中的程式碼會查詢資料庫,將使用者名稱、密碼與 mysql 容器中的資料進行比對(注:ui 容器還支援 LDAP 的認證方式,在那種情況下 ui 會試圖和外部 LDAP 服務進行通訊並校驗使用者名稱/密碼)。比對成功,ui 容器會返回表示成功的狀態碼, 並用金鑰生成 token,放在響應體中返回給 Docker 客戶端。這個過程中元件間的互動過程如下圖所示

至此,一次 docker login 成功地完成了,Docker 客戶端會把步驟(c)中編碼後的使用者名稱密碼儲存在本地的隱藏檔案中。

(2) Docker Push

使用者登入成功後用 docker push 命令向 Harbor 推送一個 Docker 映象:docker push registry.abcdocker.com/library/hello-world

(a) 首先,docker 客戶端會重複 login 的過程,首先傳送請求到 registry,之後得到 token 服務的地址;

(b) 之後,Docker 客戶端在訪問ui容器上的token服務時會提供額外資訊,指明它要申請一個對imagelibrary/hello-world 進行 push 操作的 token;

(c) token 服務在經過 Nginx 轉發得到這個請求後,會訪問資料庫核實當前使用者是否有許可權對該 image進行 push。如果有許可權,它會把 image 的資訊以及 push 動作進行編碼,並用私鑰簽名,生成 token返回給 Docker 客戶端;

(d) 得到 token 之後 Docker 客戶端會把 token 放在請求頭部,向 registry 發出請求,試圖開始推送image。 Registry 收到請求後會用公鑰解碼 token 並進行核對,一切成功後,image 的傳輸就開始了。我們省去 proxy 轉發的步驟,下圖描述了這個過程中各元件的通訊

四、安裝環境

IP地址 docker版本 docker-compose版本 核心 Centos
192.168.1.197 17.03 1.22 4.17.12 7.4

注意:Harbor的所有服務元件都是在Docker中部署的,所以官方安裝使用Docker-compose快速部署,所以我們需要安裝Docker、Docker-compose. 由於Harbor是基於Docker Registry V2版本,所以就要求Docker版本不小於1.10.0,Docker-compose版本不小於1.6.0

五、環境準備

# 設定主機名
hostnamectl set-hostname harbor

# 時間同步
yum -y install ntp
 systemctl enable ntpd
 systemctl start ntpd
 ntpdate -u cn.pool.ntp.org
 hwclock --systohc
 timedatectl set-timezone Asia/Shanghai
 
# 關閉swap分割槽
vim /etc/fstab  #永久關閉swap分割槽
swap was on /dev/sda11 during installation
UUID=0a55fdb5-a9d8-4215-80f7-f42f75644f69 none  swap    sw      0       0
#註釋掉SWAP分割槽項,即可
或者
複製程式碼

echo "vm.swappiness = 0">> /etc/sysctl.conf
sysctl -p
swapoff -a && swapon -a

# 關閉防火牆 Selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
 
# 升級核心
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml -y&&
sed -i s/saved/0/g /etc/default/grub&&
grub2-mkconfig -o /boot/grub2/grub.cfg && reboot複製程式碼

六、安裝Docker、Docker-compose

下載Docker安裝包

wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
複製程式碼
➜ yum install docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm -y
➜ yum install docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm -y
複製程式碼

設定開機啟動並啟動docker
systemctl enable docker 
systemctl start docker 

替換docker相關配置
sed -i '/ExecStart=\/usr\/bin\/dockerd/i\ExecStartPost=\/sbin/iptables -I FORWARD -s 0.0.0.0\/0 -d 0.0.0.0\/0 -j ACCEPT' /usr/lib/systemd/system/docker.service
sed -i '/dockerd/s/$/ \-\-storage\-driver\=overlay2 --insecure-registry 192.168.60.26/g' /usr/lib/systemd/system/docker.service複製程式碼
注意:
1.Docker預設從官方拉取映象,並且從1.12版本之後,預設私有倉庫是使用https來進行連線,我們需要將使用私服的主機上docker啟動檔案進行修改,在啟動命令新增--insecure-registry 192.168.1.197
Docker-compose Install複製程式碼

Github地址:github.com/docker/comp…

Docker Compose簡介

Docker Compose是Docker編排服務的最後一塊,前面提到的Machine可以讓使用者在其它平臺快速安裝Docker,Swarm可以讓Docker容器在叢集中高效運轉,而Compose可以讓使用者在叢集中部署分散式應用。簡單的說,Docker Compose屬於一個“應用層”的服務,使用者可以定義哪個容器組執行哪個應用,它支援動態改變應用,並在需要時擴充套件。

 複製程式碼

安裝Docker-compose

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

$ docker-compose --version
docker-compose version 1.22.0,build f46880fe
複製程式碼

Docker-compose常用命令

docker-compose up -d               ###後臺啟動,如果容器不存在根據映象自動建立

docker-compose down   -v         ###停止容器並刪除容器

docker-compose start                 ###啟動容器,容器不存在就無法啟動,不會自動建立映象

docker-compose stop                 ###停止容器


複製程式碼

安裝Harbor

Harbor官方地址
github.com/vmware/harb…

Harbor 2種安裝方式

1.離線安裝
$ wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.0.tgz
$ tar xf harbor-online-installer-v1.5.0.tgz

2.線上安裝
$ wget https://storage.googleapis.com/harbor-releases/harbor-online-installer-v1.5.2.tgz
$ tar xf harbor-online-installer-v1.5.2.tgz

 重點:下載那個823M的安裝
複製程式碼

配置Harbor

解壓之後,配置檔名稱harbor.cfg,該檔案就是Harbor的配置檔案

編輯harbor.cfg
實際上我們只需要修改Hostname欄位

[root@harbor harbor]# head  harbor.cfg 
## Configuration file of Harbor

#This attribute is for migrator to detect the version of the .cfg file,DO NOT MODIFY!
_version = 1.5.0
#The IP address or hostname to access admin UI and registry service.
#DO NOT use localhost or 127.0.0.1,because Harbor needs to be accessed by external clients.
hostname = 192.168.1.197


複製程式碼

harbor.cfg相關配置解釋

[root@master harbor]# grep -Ev "^$|^[#;]" harbor.cfg 
# Harbor版本
_version = 1.5.0

# hostname 設定訪問地址,可以使用IP/域名,不可以設定127.0.0.1 && localhost
hostname = 192.168.60.24

# 訪問協議,預設是http,也可以設定https,如果設定https,則nginx ssl需要設定on
ui_url_protocol = http

# Job 最大程式數
max_job_workers = 50 

# 是否建立證書,建立證書將會在下面的路徑下生成
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key

# 私鑰儲存路徑
secretkey_path = /data

# 設定日誌大小
admiral_url = NA
log_rotate_count = 50
log_rotate_size = 200M

# 是否使用代理
http_proxy =
https_proxy =
no_proxy = 127.0.0.1,localhost,ui

# 郵箱設定,傳送重置密碼郵件時使用
email_identity = 
email_server = smtp.mydomain.com
email_server_port = 25
email_username = [email protected]
email_password = abc
email_from = admin <[email protected]>
email_ssl = false
email_insecure = false

# 安裝Harbor後,管理員UI登陸的密碼,預設是Harbor12345
harbor_admin_password = Harbor12345

# 認證方式,這裡支援多種認證方式,比如LDAP、資料庫認證。預設是db_auth
auth_mode = db_auth

# LDAP認證時配置項
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = ou=people,dc=mydomain,dc=com
ldap_uid = uid 
ldap_scope = 2 
ldap_timeout = 5
ldap_verify_cert = true
ldap_group_basedn = ou=group,dc=com
ldap_group_filter = objectclass=group
ldap_group_gid = cn
ldap_group_scope = 2

#是否開啟自動註冊
self_registration = on

# Token有效時間,預設30分鐘
token_expiration = 30

# 使用者建立專案許可權控制,預設是everyone(所有人),也可以設定為adminonly(管理員)
project_creation_restriction = everyone

# Mysql資料庫root使用者預設密碼root123,根據實際時使用來進行修改
db_host = mysql
db_password = root123
db_port = 3306
db_user = root

# Redis配置
redis_url = redis:6379
clair_db_host = postgres
clair_db_password = password
clair_db_port = 5432
clair_db_username = postgres
clair_db = postgres
uaa_endpoint = uaa.mydomain.org
uaa_clientid = id
uaa_clientsecret = secret
uaa_verify_cert = true
uaa_ca_cert = /path/to/ca.pem
registry_storage_provider_name = filesystem
registry_storage_provider_config = 
複製程式碼

本次我們使用離線安裝,安裝包在上面

tar xf harbor-offline-installer-v1.5.0.tgz


./install 複製程式碼

七、訪問Harbor

訪問:192.168.1.197

預設埠為80,需要修改埠請修改docker-compose.yaml對應服務的對映

八、客戶端配置免https

[root@localhost ~]# echo '{ "insecure-registries":["172.16.1.146:8888"] }' > /etc/docker/daemon.json
 [root@localhost ~]# cat /etc/docker/daemon.json
{ "insecure-registries":["172.16.1.146:8888"] } 
restart docker 
[root@localhost ~]# service docker restart
複製程式碼

如果不配置,客戶端使用時候會報錯: Error response from daemon: Get https:// 172.16.1.146:5000/v1/_ping: http: server gave HTTP response to HTTPS client

[root@localhost harbor]# docker login 172.16.1.146:8888
Username (admin): admin
Password: 
Login Succeeded
複製程式碼

九、管理映象

打標籤並且上傳

docekr tag 映象名稱:標籤 你的IP:埠/專案名稱/映象名稱:標籤 
docker push 你的IP:埠/專案名稱/映象名稱:標籤複製程式碼
[root@localhost harbor]#  docker tag registry:2.6.2 172.16.1.146:8888/wondertek/registry:2.6.2
[root@localhost harbor]#  docker push  172.16.1.146:8888/wondertek/registry:2.6.2
The push refers to a repository
 [172.16.1.146:8888/wondertek/registry]
9113493eaae1: Layer already exists 
621c2399d41a: Layer already exists 
59e80739ed3f: Layer already exists 
febf19f93653: Layer already exists 
e53f74215d12: Layer already exists 
2.6.2: digest: sha256:feb40d14cd33e646b9985e2d6754ed66616fedb840226c4d917ef53d616dcd6c size: 1364複製程式碼

刪除本地映象 重新下載

[root@localhost harbor]# docker rmi 172.16.1.146:8888/wondertek/registry:2.6.2
Untagged: 172.16.1.146:8888/wondertek/registry:2.6.2
Untagged: 172.16.1.146:8888/wondertek/registry@sha256:feb40d14cd33e646b9985e2d6754ed66616fedb840226c4d917ef53d616dcd6c

[root@localhost harbor]# docker pull 172.16.1.146:8888/wondertek/registry:2.6.2
Trying to pull repository 172.16.1.146:8888/wondertek/registry ... 
2.6.2: Pulling from 172.16.1.146:8888/wondertek/registry
Digest: sha256:feb40d14cd33e646b9985e2d6754ed66616fedb840226c4d917ef53d616dcd6c
Status: Downloaded newer image for 172.16.1.146:8888/wondertek/registry:2.6.2

複製程式碼