Docker容器技術——企業級鏡像倉庫harbor的部署和使用
1. 什麼是harbor
- Harbor是一個用於存儲和分發Docker鏡像的企業級Registry服務器。
- 鏡像的存儲harbor使用的是官方的docker registry(v2命名是distribution)服務去完成。
- harbor在docker distribution的基礎上增加了一些安全、訪問控制、管理的功能以滿足企業對於鏡像倉庫的需求。
- harbor以docker-compose的規範形式組織各個組件,並通過docker-compose工具進行啓停。
2. 爲什麼使用harbor
docker的registry用本地存儲或者s3都可以的,harbor的功能是在此之上提供用戶權限管理、鏡像複製等功能,提高使用的registry的效率。Harbor的鏡像拷貝功能是通過docker registry的API去拷貝,這種做法屏蔽了繁瑣的底層文件操作、不僅可以利用現有docker registry功能不必重複造輪子,而且可以解決衝突和一致性的問題。
Harbor是VMware公司開源了企業級Registry項目, 其的目標是幫助用戶迅速搭建一個企業級的Docker registry服務。
它以Docker公司開源的registry爲基礎,額外提供瞭如下功能:
- 基於角色的訪問控制(Role Based Access Control)
- 基於策略的鏡像複製(Policy based image replication)
- 鏡像的漏洞掃描(Vulnerability Scanning)
- AD/LDAP集成(LDAP/AD support)
- 鏡像的刪除和空間清理(Image deletion & garbage collection)
- 友好的管理UI(Graphical user portal)
- 審計日誌(Audit logging)
- RESTful API
- 部署簡單(Easy deployment)
3. harbor的架構
Harbor依賴的外部組件
- Nginx(Proxy): Harbor的registry,UI,token等服務,通過一個前置的反向代理統一接收瀏覽器、Docker客戶端的請求,並將請求轉發給後端不同的服務。
- Registry v2: Docker官方鏡像倉庫, 負責儲存Docker鏡像,並處理docker push/pull命令。由於我們要對用戶進行訪問控制,即不同用戶對Docker image有不同的讀寫權限,Registry會指向一個token服務,強制用戶的每次docker pull/push請求都要攜帶一個合法的token,,Registry會通過公鑰對token進行解密驗證。
- Database(MySQL):爲core services提供數據庫服務,負責儲存用戶權限、審計日誌、Docker image分組信息等數據。
Harbor自己的組件
Core services(Admin Server): 這是Harbor的核心功能,主要提供以下服務:
- UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 並對用戶進行授權。
- webhook:爲了及時獲取registry 上image狀態變化的情況, 在Registry上配置webhook,把狀態變化傳遞給UI模塊。
- Auth服務:負責根據用戶權限給每個docker push/pull命令簽發token. Docker 客戶端向Registry服務發起的請求,如果不包含token,會被重定向到這裏,獲得token後再重新向Registry進行請求。
- API: 提供Harbor RESTful API
- Replication Job Service:提供多個 Harbor 實例之間的鏡像同步功能。
- Log collector:爲了幫助監控Harbor運行,負責收集其他組件的log,供日後進行分析。
4. 主要組件的彙總
組件 | 功能 |
---|---|
Proxy | 對應啓動組件nginx。它是一個nginx反向代理,代理Notary client(鏡像認證)、Docker client(鏡像上傳下載等)和瀏覽器的訪問請求(Core Service)給後端的各服務 |
UI(Core Service)對應啓動組件harbor-ui。底層數據存儲使用mysql數據庫,主要提供了四個子功能 | UI:一個web管理頁面ui;API:Harbor暴露的API服務;Auth:用戶認證服務,decode後的token中的用戶信息在這裏進行認證;auth後端可以接db、ldap、uaa三種認證實現 |
Token服務(上圖中未體現) | 負責根據用戶在每個project中的role來爲每一個docker push/pull命令issuing一個token,如果從docker client發送給registry的請求沒有帶token,registry會重定向請求到token服務創建token |
Registry | 對應啓動組件registry。負責存儲鏡像文件,和處理鏡像的pull/push命令。Harbor對鏡像進行強制的訪問控制,Registry會將客戶端的每個pull、push請求轉發到token服務來獲取有效的token |
Admin Service | 對應啓動組件harbor-adminserver。是系統的配置管理中心附帶檢查存儲用量,ui和jobserver啓動時候需要加載adminserver的配置 |
Job Sevice | 對應啓動組件harbor-jobservice。負責鏡像複製工作的,他和registry通信,從一個registry pull鏡像然後push到另一個registry,並記錄job_log |
Log Collector | 對應啓動組件harbor-log。日誌彙總組件,通過docker的log-driver把日誌彙總到一起 |
Volnerability Scanning | 對應啓動組件clair。負責鏡像掃描 |
Notary | 對應啓動組件notary。負責鏡像認證 |
DB | 對應啓動組件harbor-db,負責存儲project、 user、 role、replication、image_scan、access等的metadata數據 |
5. 部署harbor
5.1 準備工作
harbor git 地址:
https://github.com/goharbor/harbor
harbor支持k8s的helm安裝和本地安裝,這次的安裝方式是本地安裝,運行環境是 Rhel7.6。
(1)下載docker
yum install docker-ce -y
systemctl start docker
systemctl enable docker
(2)加密,生成證書
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -x509 -days 365 -out certs/westos.org.crt
#做解析
vim /etc/hosts
172.25.1.1 server1 reg.westos.org
(3)拉取倉庫的鏡像
docker search registry
docker pull registry
(4)生成用戶的認證文件
mkdir auth
docker run --rm --entrypoint htpasswd registry -Bbn admin westos > auth/htpasswd
docker run --rm --entrypoint htpasswd registry -Bbn kai westos >> auth/htpasswd #追加
cat auth/htpasswd
(5)運行容器
docker run -d \
> --restart=always \
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key \
> -p 443:443 \
> -v "$(pwd)"/auth:/auth \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
> registry
(6)拷貝證書到docker的配置目錄下
cd /etc/docker/
ls
mkdir -p certs.d/westos.org
cd certs.d/westos.org/
cp ~/certs/westos.org.crt .
ls
pwd
mv westos.org.crt ca.crt #必須要命名爲ca.crt
5.2 部署docker-compose
在線安裝:
curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
給docker-compose執行權限
chmod +x /usr/local/bin/docker-compose
檢查,運行docker-compose --version
docker-compose --version
5.3 harbor的下載和安裝
下載地址:https://github.com/goharbor/harbor/releases
#下載成功後解壓
tar zxf harbor-offline-installer-v1.10.1.tgz
cd harbor/
ls
harbor.yml
就是harbor的配置文件,編輯harbor.yml,修改hostname、https證書路徑、admin密碼
vim harbor.yml
注意:每次修改完配置文件後都需要運行
./prepare
啓動harbor
./install.sh
運行成功,docker ps 查看,可以看到服務已經起來了
常用管理命令
停止服務: docker-compose stop
開始服務: docker-compose start
重啓服務: docker-compose restart
注意:這些命令均要在harbor目錄下運行
6. 圖形化界面的使用
#在真機做解析
vim /etc/hosts
172.25.1.1 server1 reg.westos.org
瀏覽器訪問https://reg.westos.org:
輸入用戶名admin,密碼Harbor12345登陸:
新建一個項目,命名爲 wk,並設置訪問級別爲公開
這裏的項目就是一私有化的Docker鏡像倉庫
7. 本機鏡像上傳與下載測試
7.1 上傳測試
step1 修改Docker配置
docker 默認是按 https 請求的,修改文件 /etc/docker/daemon.json
vim /etc/docker/daemon.json
step2 重啓docker
systemctl daemon-reload
systemctl restart docker
step3 製作鏡像
從 docker hub 上拉取一個ubuntu鏡像,再將其製作成一個私有鏡像
docker pull ubuntu
docker tag ubuntu:latest reg.westos.org/cl/ubuntu:latest
step4上傳測試
首先登陸私有庫
docker login reg.westos.org
接下來進行PUSH:
docker push reg.westos.org/cl/ubuntu
可以在網頁端查看結果:
7.2 下載測試
docker rmi reg.westos.org/cl/ubuntu #刪除原來的鏡像
docker pull reg.westos.org/cl/ubuntu #拉取鏡像
下載成功!
8. 遠程主機鏡像上傳與下載測試
8.1 上傳測試
準備另一臺虛擬機server2
首先安裝好docker,再做好解析:
vim /etc/hosts
daemon文件配置:
vim /etc/docker/daemon.json
建立證書目錄,把crt證書放到/etc/docker/certs.d/harbor.dinginfo.com目錄下
mkdir -p /etc/docker/certs.d/reg.westos.org
cd /etc/docker/certs.d/harbor.dinginfo.com
cp ~/certs/westos.org.crt .
重啓docker
systemctl daemon-reload
systemctl restart docker
上傳測試:
docker login reg.westos.org
docker tag nginx:latest reg.westos.org/cl/nginx
docker push reg.westos.org/cl/nginx
網頁端查看:
上傳成功!
8.2 下載測試
docker pull reg.westos.org/cl/ubuntu
下載成功!