Docker 企業級映象倉庫 Harbor 的搭建與維護
目錄
- 一、什麼是 Harbor
- 二、Harbor 安裝
- 2.1、Harbor 安裝環境
- 2.2、Harbor安裝
- 2.3 配置HTTPS
- 三、Harbor 的使用
- 3.1、登入Harbor並使用
- 3.2、注意事項
- 四、Harbor 管理
- 4.1 啟動暫停
- 更改配置檔案
一、什麼是 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