docker harbor搭建筆記


介紹

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組件

  • 依賴的外部組件:

    1. Nginx(Proxy): Harbor的Registry、UI、Token等服務,通過一個前置的反向代理統一接收瀏覽器、Docker客戶端的請求,並將請求轉發給后端不同的服務。
    2. Registry v2: Docker官方鏡像倉庫, 負責儲存Docker鏡像,並處理Docker Push/Pull命令。由於我們要對用戶進行訪問控制,即不同用戶對Docker鏡像有不同的讀寫權限,Registry會指向一個Token服務,強制用戶的每次Docker Push/Pull請求都要攜帶一個合法的Token, Registry會通過公鑰對Token進行解密驗證。
    3. Database(MySQL/Postgresql):為Core Services提供數據庫服務,負責儲存用戶權限、審計日志、Docker鏡像分組信息等數據。
  • Harbor自己的組件:

    1. 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進行請求。
    2. Replication Job Service:提供多個Harbor實例之間的鏡像同步功能。
    3. Log Collector:為了幫助監控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/emailAddress=test@qq.com"

# 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/emailAddress=test@qq.com"

# ls
ca.crt  ca.key  harbor-registry.csr  harbor-registry.key

# 為Registry主機產生證書
# echo subjectAltName = IP:192.168.1.130 > extfile.cnf  這里ip可根據需要配置為域名,如xx.com  echo subjectAltName = DNS.1:xxx.com > extfile.cnf
# 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM