一、什么是 Harbor
Harbor 是一個開源的雲本地 registry 倉庫,可以用於管理和儲存 Docker 鏡像。Harbor 支持在多個倉庫直接進行復制鏡像,提供用戶管理和訪問控制和活動審計。
Harbor 由以下服務組成(每個服務都由一個容器運行):
- nginx
- harbor-jobservice
- harbor-portal
- harbor-core
- registryctl
- harbor-db
- redis
- registry
- harbor-log
本文搭建的 Harbor 是基於 1.8.0,因為我最近准備寫這個文檔的時候,就發現 Harbor 最新版本為 1.8.0 了,本着追尋潮流,引領時尚的做人原則,就選擇基於 1.8.0 來書寫這篇文檔,1.8.0 相對於之前的版本還是有比較多的更新的。
- 支持 OpenID Connect
- 支持機器人賬戶,可以將機器人賬戶設置只具有推送和拉取鏡像的權限。
- 復制改進,擴展 Harbor-to-Harbor 的復制功能,增加了 Harbor --> Docker Hub 、Harbor---> Docker Registry 、Harbor---> Huawei Registry 的功能。
- 支持定時清理任務,支持狀態檢查 API,增加了新的項目角色,不僅僅是開發人員和管理員,還有維護人員、訪客。
- 引入 harbor.yml 替代 harbor.cfg,Docker Registry 升級到 2.7.1。
二、Harbor 安裝
官方安裝文檔(2019.0514): https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
官方文檔的安裝方法主要還是針對於 1.8.0 之前的版本,后續官方應該會對 1.8.0 版本進行更新文檔。暫時沒有針對新的版本的文檔。
Harbor 的安裝是基於 docker-compose ,通過構建多個容器來組成一個服務。
2.1、Harbor 安裝環境
Harbor 的硬件需求
Resource | Capacity | Description |
---|---|---|
CPU | minimal 2 CPU | 4 CPU is preferred |
Mem | minimal 4GB | 8GB is preferred |
Disk | minimal 40GB | 160GB is preferred |
軟件需求
Software | Version | Description |
---|---|---|
Python | version 2.7 or higher | Note that you may have to install Python on Linux distributions (Gentoo, Arch) that do not come with a Python interpreter installed by default |
Docker engine | version 17.03.0-ce+ or higher | For installation instructions, please refer to: https://docs.docker.com/engine/installation/ |
Docker Compose | version 1.18.0 or higher | For installation instructions, please refer to: https://docs.docker.com/compose/install/ |
Openssl | latest is preferred | Generate certificate and keys for Harbor |
端口需求
Port | Protocol | Description |
---|---|---|
443 | HTTPS | Harbor portal and core API will accept requests on this port for https protocol |
4443 | HTTPS | Connections to the Docker Content Trust service for Harbor, only needed when Notary is enabled |
80 | HTTP | Harbor portal and core API will accept requests on this port for http protocol |
目前,Harbor 使用的數據庫僅支持 PostgreSQL 數據庫。
2.2、Harbor安裝
Harbor 有兩種安裝方法:
- 在線安裝,在線安裝需要網絡,安裝包非常小。
- 離線安裝,離線安裝,本地主機可以沒有網絡,安裝包會比較大。
我們這里選擇的是離線安裝,避免因國內網絡問題導致安裝耗時比較久。
安裝 docker-compose ,版本需要1.18.0+
curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
安裝 Harbor
# 獲取需要安裝的版本
https://github.com/goharbor/harbor/releases
# 下載
cd /opt/ && wget 下載版本鏈接
tar -xzf harbor-offline-installer*
cd harbor
# 編輯配置文件 harbor.yml
vim harbor.yml
# 需要更改的參數
hostname: 192.168.15.170 # 綁定ip,不能使用127.0.0.1和localhost
http: # 監聽端口,默認80,也就是我們 管理ui訪問的端口
port: 80
harbor_admin_password: Harbor12345 # 設置管理員密碼
## 還可以設置啟動 https,並指定證書,和指定數據目錄
# 安裝
./install.sh
默認安裝是不包含 Notary 和 Clair (用於漏洞掃描)。但是已經與他們集成了。我們可以使用
默認是使用 HTTP 協議,我們可以配置證書並使用 HTTPS 來訪問 Harbor。
2.3 配置HTTPS
說實話我開始是抵觸的,我不想去使用它,但是當我考慮到,我不可能暫停我所有已經運行的容器來修改配置,來解決 docker login
的問題,所有我只能老老實實的來配置 HTTPS ,這個煩人的 HTTPS。
官方配置文檔: https://github.com/goharbor/harbor/blob/master/docs/configure_https.md
我們這里演示的是創建自己的 證書,實際生產環境中我們可以去阿里雲或者其他雲服務器廠商申請免費的 證書。
創建證書
# 創建存放證書的目錄
mkdir -p /data/cert/
cd /data/cert/
# 創建自簽名證書key文件
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=192.168.15.170" \
-key ca.key \
-out ca.crt #CN 替換為你的倉庫域名
修改配置
#配置 HTTPS 配置
https:
# # https port for harbor, default is 443
port: 443
# # The path of cert and key files for nginx
certificate: /data/cert/ca.crt
private_key: /data/cert/ca.key
重新初始化 Harbor
# 暫停
docker-compose down -v
prepare # 生成配置文件,根據 harbor.yml 配置生成docker-compose文件。
docker-compose up -d # 后台啟動
客戶端配置
將 Harbor 生成的證書 /data/cert/ca.crt
復制到 客戶端的 /etc/docker/certs.d/倉庫域名/
。
然后重啟docker 。
docker login 倉庫域名
三、Harbor 的使用
3.1、登錄Harbor並使用
登錄網址 : ip,http://192.168.15.170
默認的用戶名和密碼是:
用戶名:admin
密碼: Harbor12345
登錄 Harbor 並創建一個私有項目 test 。
1.8.0版本使用界面圖
1.7.5版本使用界面圖
(不知道為啥上面有一坨綠色,難道是……,不可能的)。
本地登錄 並且上傳鏡像
docker login 192.168.15.170
docker tag centos:latest 192.168.15.170/test/centos:latest # tag 名稱= 倉庫地址/項目名稱/鏡像名稱:標記(版本號)
docker push 192.168.15.170/test/centos:latest
下載鏡像
docker pull 192.168.15.170/test/centos:latest
3.2、注意事項
在進行登錄的過程中我們會遇到以下的問題,我們也給出了解決辦法。
# 登錄
docker login 192.168.15.170
# 登錄報錯
[root@localhost harbor]# docker login 192.168.15.170
Username: admin
Password:
Error response from daemon: Get https://192.168.15.170/v2/: dial tcp 192.168.15.170:443: connect: connection refused
# 解決辦法 ,官方的安裝文檔也是有寫到這個問題
在 dockerd 啟動參數中加上 --insecure-registry=192.168.15.170
編輯配置文件 /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=192.168.15.170
四、Harbor 管理
4.1 啟動暫停
我們可以使用 docker-compose 來管理 Harbor 的生命周期,以下命令的運行環境目錄需要與 docker-compose.yml
是同一個目錄。
# 暫停 Harbor
docker-compose stop
# 啟動 Harbor
docker-compose start
# 更改 harbor.yml,1.8.0之前的版本配置文件是 harbor.cfg
docker-compose down -v
vim harbor.yml # 更改配置
prepare # 生成配置文件,根據 harbor.yml 配置生成docker-compose文件。
docker-compose up -d
# 刪除 Harbor 的容器,將鏡像數據和 Harbor的數據庫文件保存在文件系統上。
docker-compose down -v
# 徹底地刪除 Harbor 的數據和鏡像
rm -r /data/database
rm -r /data/registry
默認情況下,Harbor 的數據保存在 /data/ 下,即使我們刪除或者重建 Harbor 數據不會發生改變。並且 Harbor 使用了 rsyslog 來進行收集每個容器的日志,默認情況下,這些日志文件儲存在主機的 /var/loh/harbor/
更改配置文件
Harbor 默認的監聽端口是 80(HTTP)和 443(HTTPS).
對於1.8.0版本
方法一 : 更改 harbor.yml
配置文件
在配置文件中有配置 監聽端口 和使用具體協議的位置,我們根據各自需求進行設置。
注意,我們這邊進行更改 docker-compose.yml
配置文件 來更改配置是無效的,因為當我們運行了 prepare
docker-compose
文件就會被重寫,所以更改 docker-compose.yml
是無效的。
對於1.8.0之前的版本
對於 HTTP 協議。
方法一 :更改 docker-compose.yml
配置文件
proxy:
image: goharbor/nginx-photon:v1.7.5
container_name: nginx
restart: always
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- NET_BIND_SERVICE
volumes:
- ./common/config/nginx:/etc/nginx:z
networks:
- harbor
dns_search: .
ports:
- 80:80
- 443:443
- 4443:4443
depends_on:
- postgresql
- registry
- core
- portal
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"
# 將原有的內部監聽80端口替換為 8888
proxy:
image: goharbor/nginx-photon:v1.7.5
container_name: nginx
restart: always
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- NET_BIND_SERVICE
volumes:
- ./common/config/nginx:/etc/nginx:z
networks:
- harbor
dns_search: .
ports:
- 8888:80
- 443:443
- 4443:4443
depends_on:
- postgresql
- registry
- core
- portal
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"
方法二 更改 harbor.cfg
,將端口添加到參數 hostname
上。
hostname = 192.168.15.170:8888
對於HTTPS 協議
跟配置 HTTP 協議一致。
更改了配置之后,我們需要重新部署 Harbor.
# 以下命令在 docker-compose.yml 文件所在目錄中運行
./prepare
docker-compose up -d
2020年3月14號
最近一個群友反饋的一問題,就是 docker 在push 鏡像到 harbor 的時候, 有報錯:
blob upload unknown
了解到這個哥們在 harbor 前面加了 Nginx.
他在 Nginx 配置里有 proxy_set_header Host $http_host
這個,我們把這個注釋后,reload 了一下 Nginx,就可以了。
這個問題初步判斷,是不是 harbor 會對 Host 的值進行驗證。這個后續再去探究。