docker harbor搭建筆記
阿新 • • 發佈:2019-09-23
介紹
Harbor是VMware公司開源的一個用於儲存和分發Docker映象的企業級Registry伺服器,以Docker開源的Registry為基礎,通過新增一些企業必需的功能特性,例如安全、標識和管理等,擴充套件了開源Docker Distribution。作為一個企業級私有Registry伺服器,Harbor提供了更好的效能和安全,提升使用者使用Registry構建和執行環境傳輸映象的效率。Harbor支援安裝在多個Registry節點的映象資源複製,映象全部儲存在私有Registry中,確保資料和智慧財產權在公司內部網路中管控。另外,Harbor也提供了高階的安全特性,諸如使用者管理,訪問控制和活動審計等。
Harbor特性
- 基於角色的訪問控制(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)
Harbor元件
-
依賴的外部元件:
- Nginx(Proxy): Harbor的Registry、UI、Token等服務,通過一個前置的反向代理統一接收瀏覽器、Docker客戶端的請求,並將請求轉發給後端不同的服務。
- Registry v2: Docker官方映象倉庫, 負責儲存Docker映象,並處理Docker Push/Pull命令。由於我們要對使用者進行訪問控制,即不同使用者對Docker映象有不同的讀寫許可權,Registry會指向一個Token服務,強制使用者的每次Docker Push/Pull請求都要攜帶一個合法的Token, Registry會通過公鑰對Token進行解密驗證。
- Database(MySQL/Postgresql):為Core Services提供資料庫服務,負責儲存使用者許可權、審計日誌、Docker映象分組資訊等資料。
-
Harbor自己的元件:
- Core Services(Admin Server): 這是Harbor的核心功能,主要提供以下服務:
- API:提供Harbor RESTful API
- UI:提供圖形化介面,幫助使用者管理Registry上的映象, 並對使用者進行授權。
- Webhook:為了及時獲取Registry上映象狀態變化的情況,在Registry上配置Webhook,把狀態變化傳遞給UI模組。
- Auth服務:負責根據使用者許可權給每個Docker Push/Pull命令簽發Token。Docker客戶端向Registry服務發起的請求,如果不包含Token,會被重定向到這裡,獲得Token後再重新向Registry進行請求。
- Replication Job Service:提供多個Harbor例項之間的映象同步功能。
- Log Collector:為了幫助監控Harbor執行,負責收集其他元件的日誌,供日後進行分析。
- Core Services(Admin Server): 這是Harbor的核心功能,主要提供以下服務:
harbor架構圖
harbor 安裝
# 安裝方式分為線上安裝和離線安裝兩種方式,這裡採用線上安裝方式 # 下載線上安裝程式 # wget -P /usr/local https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-online-installer-v1.7.1.tgz # 解壓下載檔案 # tar zxf /usr/local/harbor-online-installer-v1.7.1.tgz -C /usr/local/ # 修改配置檔案,根據自己的需求進行修改 # vim /usr/local/harbor/harbor.cfg # 本機IP或者域名,不能是127.0.0.1或者localhost hostname = 192.168.1.130 或者域名xxx.com # 系統Harbor管理員的密碼 harbor_admin_password = Harbor12345 # 禁止使用者註冊 self_registration = off # 設定只有管理員可以建立專案 project_creation_restriction = adminonly # 由於Harbor的Nginx元件預設會監聽宿主機的80、443、4443埠,如果需要更改Nginx的埠對映,可以修改以下配置檔案 # vim /usr/local/harbor/docker-compose.yml ports: - 8082:80 - 443:443 - 4443:4443 # 如果上面更改了Nginx的80埠對映,此時還需要編輯Harbor的配置檔案,修改hostname加上指定的埠號 # vim harbor.cfg hostname = 192.168.1.130:8082 # 執行安裝指令碼 # /usr/local/harbor/install.sh # Harbar的日誌目錄是:/var/log/harbor # Harbar相關資料卷的掛載目錄預設是宿主機的/data目錄,如果重新安裝Harbar並在配置檔案裡更改了資料庫密碼,則需要刪除/data目錄,否則Harbor部分元件會啟動失敗
harbor操作
# 如果某個Harbor元件啟動失敗,可以在日誌目錄/var/log/harbor下檢視具體的日誌資訊,進一步定位啟動失敗的原因 # 啟動時Harbor預設會監聽宿主機的80、443、4443埠,啟動Harbor之前必須確保宿主機的80、443、4443埠不被佔用,否則Harbor相關元件會啟動失敗。 # 檢視Harbor容器的執行狀態 # docker ps # 或者通過docker-compose檢視,此時需要進入Harbor安裝指令碼所在的目錄裡執行相關命令 # cd /usr/local/harbor # 檢視Harbor容器的執行狀態 # docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------------- harbor-adminserver /harbor/start.sh Up (healthy) harbor-core /harbor/start.sh Up (healthy) harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp harbor-jobservice /harbor/start.sh Up harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp harbor-portal nginx -g daemon off; Up (healthy) 80/tcp nginx nginx -g daemon off; Up (healthy) 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp redis docker-entrypoint.sh redis ... Up 6379/tcp registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp registryctl /harbor/start.sh Up (healthy) # 啟動Harbor容器 # docker-compose start # 停止Harbor容器 # docker-compose stop # 重啟Harbor容器 # docker-compose restart # 停止並刪除Harbor容器,加上-v引數可以同時移除掛載在容器上的目錄 # docker-compose down # 建立並啟動Harbo容器,引數“-d”表示後臺執行命令 # docker-compose up -d
至此,harbor算是安裝完成了(http方式),不過這種方式還得去每個機器上配置docker deamon檔案,生產中建議使用https方式
安裝證書
# 下面以IP:192.168.1.130為例子,實際操作中將命令中的IP地址修改為自己的IP地址即可 # 建立存放證書的臨時目錄 # mkdir ~/cert # cd ~/cert # 建立自簽名根證書 # openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout ca.key \ -x509 -days 1000 -out ca.crt \ -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=test/[email protected]" # ls ca.crt ca.key # 產生證書籤名請求 # openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout harbor-registry.key \ -out harbor-registry.csr \ -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=192.168.1.130/[email protected]" # ls ca.crt ca.key harbor-registry.csr harbor-registry.key # 為Registry主機產生證書 # echo subjectAltName = IP:192.168.1.130 > extfile.cnf 這裡ip可根據需要配置為域名,如xx.com # openssl x509 -req -days 1000 -in harbor-registry.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out harbor-registry.crt
# ls ca.crt ca.key ca.srl extfile.cnf harbor-registry.crt harbor-registry.csr harbor-registry.key # 建立Harbor的證書目錄 # mkdir -p /opt/cert # 拷貝harbor-registry證書到Harbor的證書目錄 # cp harbor-registry.crt /opt/cert/ # cp harbor-registry.key /opt/cert/
配置harbor
# 進入Harbor的安裝目錄 # cd /usr/local/harbor # 停止並刪除Harbor容器,加上-v引數可以同時移除掛載在容器上的目錄 # docker-compose down # 修改harbor.cfg配置檔案 # vim /usr/local/harbor/harbor.cfg ui_url_protocol = https hostname = 192.168.1.130 ssl_cert = /opt/cert/harbor-registry.crt ssl_cert_key = /opt/cert/harbor-registry.key # 重新生成配置檔案 # prepare # 讓Docker客戶端預設使用Https協議訪問Registry,需要去掉“insecure-registries”相關配置項 # 檢視daemon.json檔案中是否有"insecure-registries":["192.168.1.130"],如果有則將其刪除掉 # vim /etc/docker/daemon.json {"insecure-registries":[""]} # 重新載入Docker的配置檔案 # systemctl daemon-reload # 重啟Docker # systemctl restart docker # 建立並啟動Harbor容器 # docker-compose up -d
使用docker login登入harbor
# 建立Docker的證書目錄,目錄名稱是IP地址,需要根據自己的情況進行修改 # 注意,如果Nginx的443埠對映到了其他埠,則目錄名稱需要帶上具體的埠號,例如/etc/docker/certs.d/192.168.1.130:8443 # mkdir -p /etc/docker/certs.d/192.168.1.130 # 將上面產生的ca.crt拷貝到Docker的證書目錄下 # cp ~/cert/ca.crt /etc/docker/certs.d/192.168.1.130 # 重啟Docker # systemctl restart docker # 登入Harbor Registry,回車後輸入admin使用者的帳號資訊(admin/Harbor12345) # docker login 192.168.1.130 # 檢視映象列表 # docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 7 weeks ago 202MB .... # 給映象打上標籤 # docker tag centos:latest 192.168.1.130/library/centos:1.0 # 將本地映象Push到Harbor # docker push 192.168.1.130/library/centos:1.0
#注意這一步:
# 將上面產生的ca.crt拷貝到Docker的證書目錄下 # cp ~/cert/ca.crt /etc/docker/certs.d/192.168.1.130
當其他主機需要使用harbor時,也需要將該證書放在相應目錄下
參考
https://www.techgrow.cn/posts/99d575a6.html
&n