Blog.085 Harbor:Docker 私有倉庫
本章目錄
1. 搭建本地私有倉庫
1.1 搭建步驟
1.2 搭建流程
2. Harbor 簡介
2.1 特性
2.2 構成
2.3 使用 Docker Compose 部署 Harbor
3. Harbor 部署
3.1 部署步驟
4. 維護管理 Harbor
有時候使用 Docker Hub 這樣的公共倉庫可能不方便,這種情況下使用者可以使用 registry 建立一個本地倉庫供私人使用,這點跟Maven的管理類似。
使用私有倉庫有許多優點:
- 節省網路頻寬,針對於每個映象不用每個人都去中央倉庫上面去下載,只需要從私有倉庫中下載即可;
- 提供映象資源利用,針對於公司內部使用的映象,推送到本地的私有倉庫中,以供公司內部相關人員使用。
(1)下載 registry 映象
1 docker pull registry
Docker 官方提供了一個搭建私有倉庫的映象 registry (註冊伺服器),只需把映象下載下來,執行容器並暴露5000埠,就可以使用了。
目前 Docker Registry 已經升級到了v2,最新版的 Docker 已不再支援 v1。Registry v2 使用 Go 語言編寫,在效能和安全性上做了很多優化,重新設計了映象的儲存格式。如果需要安裝 registry v2,只需下載 registry:2.2 即可。
Docker官方提供的工具docker-registry可以用於構建私有的映象倉庫。
(2)在 daemon.json 檔案中新增私有映象倉庫地址
1 vim /etc/docker/daemon.json 2 3 { 4 "insecure-registries": ["192.168.80.10:5000"], 5 "registry-mirrors": ["https://6ijb8ubomirror.aliyuncs.com"] 6 } 7 8 systemctl restart docker.service
(3)執行 registry 容器
1 docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
- -itd:在容器中開啟一個偽終端進行互動操作,並在後臺執行
- -v:把宿主機的 /data/registry 目錄繫結到容器 /var/lib/registry 目錄(這個目錄是registry容器中存放映象檔案的目錄),來實現資料的持久化;
在容器中啟動私有映象倉庫並將私有倉庫的儲存目錄掛載到宿主機指定目錄中,這樣做的目的是,如果容器被刪除了,儲存在容器中的映象就不會被刪掉(預設情況下如果容器被刪除,則存放於容器中的映象也會丟失)
- -p:對映埠;訪問宿主機的5000埠就訪問到registry容器的服務
- --restart=always:這是重啟的策略,在容器退出時總是重啟容器
- --name registry:建立容器命名為registry
- registry:latest:這個是剛才pull下來的映象
Docker容器的重啟策略如下:
- no:預設策略,在容器退出時不重啟容器
- on-failure:在容器非正常退出時(退出狀態非0),才會重啟容器
- on-failure:3:在容器非正常退出時重啟容器,最多重啟3次
- always:在容器退出時總是重啟容器
- unless-stopped:在容器退出時總是重啟容器,但是不考慮在 Docker 守護程序啟動時就已經停止了的容器
(4)為映象打標籤
1 docker tag centos:7 192.168.229.90:5000/centos:v1
如果不對私有倉庫命名的話,預設走的是公共倉庫(docker hub),所以需要命名映象。
私有倉庫映象的命名規則:宿主機ip地址:埠號/xxxx(需要更改的名稱)
注意:當你對源映象進行命名後,命名後的映象名稱也視為一個標籤,因為id號是相同的。如果當源映象刪除,命名後的映象依然會存在,因為刪除的是一個標籤。
(5)上傳到私有倉庫
1 docker push 192.168.229.90:5000/centos:v1
(6)列出私有倉庫的所有映象
1 curl http://192.168.229.90:5000/v2/_catalog
(7)列出私有倉庫的 centos 映象有哪些 tag
1 curl http://192.168.229.90:5000/v2/centos/tags/list
(8)先刪除原有的 centos 映象,再測試私有倉庫下載
1 docker rmi -f 8652b9f0cb4c 2 docker pull 192.168.229.90:5000/centos:v1
(1)下載 registry 映象
(2)在 daemon.json 檔案中新增私有映象倉庫地址
(3)執行 registry 容器
(4)為映象打標籤
(5)上傳到私有倉庫
(6)列出私有倉庫的所有映象
(7)列出私有倉庫的 centos 映象有哪些 tag
(8)先刪除原有的 centos 映象,再測試私有倉庫下載
Harbor 是 VMware 公司開源的企業級 Docker Registry 專案,其目標是幫助使用者迅速搭建一個企業級的 Docker Registry 服務。
Harbor 以 Docker 公司開源的 Registry 為基礎,提供了圖形管理 UI 、基於角色的訪問控制(Role Based AccessControl) 、AD/LDAP 整合、以及審計日誌(Auditlogging) 等企業使用者需求的功能,同時還原生支援中文。
Harbor 的每個元件都是以 Docker 容器的形式構建的,使用 docker-compose 來對它進行部署。用於部署 Harbor 的 docker-compose 模板位於 harbor/docker-compose.yml。
- 基於角色控制:使用者和倉庫都是基於專案進行組織的,而使用者在專案中可以擁有不同的許可權。
- 基於映象的複製策略:映象可以在多個 Harbor 例項之間進行復制(同步)。
- 支援 LDAP/AD:Harbor 可以整合企業內部已有的 AD/LDAP(類似資料庫的一張表),用於對已經存在的使用者認證和管理。
- 映象刪除和垃圾回收:映象可以被刪除,也可以回收映象佔用的空間。
- 圖形化使用者介面:使用者可以通過瀏覽器來瀏覽,搜尋映象倉庫以及對專案進行管理。
- 審計管理:所有針對映象倉庫的操作都可以被記錄追溯,用於審計管理。
- 支援 RESTful API:RESTful API 提供給管理員對於 Harbor 更多的操控, 使得與其它管理軟體整合變得更容易。
- Harbor 和 docker registry 的關係:Harbor 實質上是對 docker registry 做了封裝,擴充套件了自己的業務模板。
Harbor 在架構上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六個元件。
- Proxy:Harbor 的 Registry、UI、Token 服務等元件,都處在 nginx 反向代理後邊。該代理將來自瀏覽器、docker clients 的請求轉發到後端不同的服務上。
- Registry:負責儲存 Docker 映象,並處理 Docker push/pull 命令。由於要對使用者進行訪問控制,即不同使用者對 Docker 映象 有不同的讀寫許可權,Registry 會指向一個 Token 服務,強制使用者的每次 Docker pull/push 請求都要攜帶一個合法的 Token, Registry 會通過公鑰對 Token 進行解密驗證。
- Core services:Harbor的核心功能,主要提供以下3個服務:
(1)UI(harbor-ui): 提供圖形化介面,幫助使用者管理 Registry 上的映象(image), 並對使用者進行授權。
(2)WebHook:為了及時獲取Registry 上image 狀態變化的情況,在Registry 上配置 Webhook,把狀態變化傳遞給 UI 模組。
(3)Token 服務:負責根據使用者許可權給每個 Docker push/pull 命令簽發 Token。Docker 客戶端向 Registry 服務發起的請求, 如果不包含 Token,會被重定向到 Token 服務,獲得 Token 後再重新向 Registry 進行請求。
- Database(harbor-db):為core services提供資料庫服務,負責儲存使用者許可權、審計日誌、Docker 映象分組資訊等資料。
- Job services:主要用於映象複製,本地映象可以被同步到遠端 Harbor 例項上。
- Log collector(harbor-log):負責收集其他元件的日誌到一個地方。
lw解說版,看到說明你賺了(●'◡'●):
- Proxy:
Docker 客戶端進行請求,內部服務太多,需要通過代理端(Proxy元件)進行反向代理,轉發使用者請求。
- Registry:
Registry 用於儲存映象,使用者進行的 docker pull、docker push 等操作,都需要在這個元件上進行相關操作。它的任何操作都需要由 token 進行認證,否則任何人都可以隨意操作。
- UI:
如果使用者是通過外部頁面進行訪問的,它會通過 Proxy 轉發到 UI 這裡來檢視到外部頁面相關的服務。
- token:
如果使用者命令沒有攜帶 token 令牌,它會重定向到 token 服務當中,獲得相關的 token 令牌之後,才可以對 Registry 中的映象進行操作。
- Webhook:
映象倉庫中的映象如果有一些變化,可以通過 Webhook 獲取到,在外部頁面中展現出來。
- Database:
使用者在外部頁面上所做的任何操作都可以被 Database 記錄下來,比如使用者許可權、使用者資訊、具有什麼操作許可權,都要在 Database 先進行查詢。
- Log collector:
使用者對映象倉庫裡面的映象進行任何的映象拉取、上傳等操作都會被記錄到 Log collector 元件中,通過這個元件對日誌進行收集。如果需要回溯可以通過此元件檢視日誌,進行回溯。
- Job Services:
如果想把映象遠端同步給遠端例項,需要用 Job Services 進行操作,由它來對接遠端的 Harbor 例項,用它和遠端主機相同的例項進行對接,實現映象同步。
2.3 使用 Docker Compose 部署 Harbor
Harbor 的每個元件都是以 Docker 容器的形式構建的,因此,使用 Docker Compose 來對它進行部署。
總共分為 7 個容器執行,通過在 docker-compose.yml 所在目錄中執行 docker-compose ps 命令來檢視, 名稱分別為:nginx、harbor-jobservice、harbor-ui、harbor-db、harbor-adminserver、registry、harbor-log。
其中 harbor-adminserver 主要是作為一個後端的配置資料管理,並沒有太多的其他功能。
harbor-ui 所要操作的所有資料都通過 harbor-adminserver 這樣一個數據配置管理中心來完成。
(1)環境準備
- Harbor 伺服器:192.168.30.10:docker-ce、docker-compose、harbor-offline-v1.2.2
- client 伺服器:192.168.30.20:docker-ce
(2)部署 Docker-Compose 服務
詳見部落格:Blog.084 Docker Compose 編排
(3)部署 Harbor 服務
- 下載或上傳 Harbor 安裝程式
1 wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz #下載安裝包,我這裡是之前已經傳入下載的安裝包 2 3 tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
- 修改 harbor 安裝的配置檔案
1 vim /usr/local/harbor/harbor.cfg 2 --5行--修改,設定為Harbor伺服器的IP地址或者域名 3 hostname = 192.168.229.90 4 --59行--指定管理員的初始密碼,預設的使用者名稱/密碼是admin/Harbor12345 5 harbor_admin_password = Harbor12345
關於 Harbor.cfg 配置檔案中有兩類引數:所需引數和可選引數。
(1)所需引數:這些引數需要在配置檔案 Harbor.cfg 中設定。如果使用者更新它們並執行 install.sh 指令碼重新安裝 Harbour, 引數將生效。具體引數如下:
- hostname:用於訪問使用者介面和 register 服務。它應該是目標機器的 IP 地址或完全限定的域名(FQDN),例如 192.168.80.10 或 hub.kgc.cn。不要使用 localhost 或 127.0.0.1 為主機名。
- ui_url_protocol:(http 或 https,預設為 http)用於訪問 UI 和令牌/通知服務的協議。如果共證處於啟用狀態,則此引數必須為 https。
- max_job_workers:映象複製作業執行緒。
- db_password:用於db_auth 的 MySQL 資料庫 root 使用者的密碼。
- customize_crt:該屬性可設定為開啟或關閉,預設開啟。開啟此屬性時,準備指令碼建立私鑰和根證書,用於生成/驗證登錄檔令牌。當由外部來源提供金鑰和根證書時,將此屬性設定為 off。
- ssl_cert:SSL 證書的路徑,僅當協議設定為 https 時才應用。
- secretkey_path:用於在複製策略中加密或解密遠端 register 密碼的金鑰路徑。
(2)可選引數:這些引數對於更新是可選的,即使用者可以將其保留為預設值,並在啟動 Harbor 後在 Web UI 上進行更新。如果進入 Harbor.cfg,只會在第一次啟動 Harbor 時生效,隨後對這些引數的更新,Harbor.cfg 將被忽略。
注意:如果選擇通過 UI 設定這些引數,請確保在啟動 Harbor 後立即執行此操作。具體來說,必須在註冊或在 Harbor 中建立任何新使用者之前設定所需的 auth_mode。
當系統中有使用者時(除了預設的 admin 使用者), auth_mode 不能被修改。 具體引數如下:
- Email:Harbor 需要該引數才能向用戶傳送“密碼重置”電子郵件,並且只有在需要該功能時才啟用。請注意,在預設情況下 SSL 連線時沒有啟用。如果 SMTP 伺服器需要 SSL,但不支援 STARTTLS,那麼應該通過設定啟用 SSL email_ssl = TRUE。
- harbour_admin_password:管理員的初始密碼,只在 Harbour 第一次啟動時生效。之後, 此設定將被忽略,並且應在 UI 中設定管理員的密碼。請注意,預設的使用者名稱/密碼是admin/Harbor12345。
- auth_mode:使用的認證型別,預設情況下,它是 db_auth,即憑據儲存在資料庫中。對於LDAP身份驗證,請將其設定為 ldap_auth。
- self_registration:啟用/禁用使用者註冊功能。禁用時,新使用者只能由 Admin 使用者建立,只有管理員使用者可以在 Harbour 中建立新使用者。注意:當 auth_mode 設定為 ldap_auth 時,自注冊功能將始終處於禁用狀態,並且該標誌被忽略。
- Token_expiration:由令牌服務建立的令牌的到期時間(分鐘),預設為 30 分鐘。
- project_creation_restriction:用於控制哪些使用者有權建立專案的標誌。預設情況下,每個人都可以建立一個專案。如果將其值設定為“adminonly”,那麼只有 admin 可以建立專案。
- verify_remote_cert:開啟或關閉,預設開啟。此標誌決定了當Harbor與遠端 register 例項通訊時是否驗證 SSL/TLS 證書。 將此屬性設定為 off 將繞過 SSL/TLS 驗證,這在遠端例項具有自簽名或不可信證書時經常使用。
另外,預設情況下,Harbour 將映象儲存在本地檔案系統上。在生產環境中,可以考慮 使用其他儲存後端而不是本地檔案系統,如 S3、Openstack Swif、Ceph 等物件儲存,但需要更新 common/templates/registry/config.yml 檔案。
(4)啟動 Harbor
1 cd /usr/local/harbor/ 2 ./install.sh
(5)檢視 Harbor 啟動映象
1 cd /usr/local/harbor/ 2 docker-compose ps
(6)建立一個新專案
- 瀏覽器訪問:http://192.168.30.10 登入 Harbor WEB UI 介面,預設的管理員使用者名稱和密碼是 admin/Harbor12345(H大寫)
- 輸入使用者名稱和密碼登入介面後可以建立一個新專案。點選“+專案”按鈕。
- 填寫專案名稱為 “test”,點選“確定”按鈕,建立新專案
- 此時可使用 Docker 命令在本地通過 127.0.0.1 來登入和推送映象。預設情況下,Registry 伺服器在埠 80 上偵聽。
- 登入 Harbor
1 docker login [-u admin -p Harbor12345] http://127.0.0.1
- 下載映象測試
1 docker pull nginx
- 將映象打標籤
1 格式:docker tag 映象:標籤 倉庫IP/專案名稱/映象名:標籤 2 docker push 127.0.0.1/hello/redis:v1
- 上傳映象到 Harbor
1 docker push 127.0.0.1/hello/redis:v1
- 在 Harbor 介面目錄下可看見映象及相關資訊
(7)在其他客戶端上傳映象
以上操作都是在 Harbor 伺服器本地操作。
如果其他客戶端登入到 Harbor,就會報如下錯誤。
1 docker login -u admin -p Harbor12345 http://192.168.229.90 2 WARNING! Using --password via the CLI is insecure. Use --password-stdin. 3 Error response from daemon: Get https://192.168.229.90/v2/: dial tcp 192.168.80.10:443: connect: connection refused
出現這問題的原因為 Docker Registry 互動預設使用的是 HTTPS,但是搭建私有映象預設使用的是 HTTP 服務,所以與私有映象互動時出現以下錯誤。
解決辦法是:在 Docker server 啟動的時候,增加啟動引數,預設使用 HTTP 訪問。
1 第一種:在Docker server啟動的時候,增加啟動引數,預設使用 HTTP 訪問。 2 vim /usr/lib/systemd/system/docker.service 3 --13行--修改 4 ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.229.90 --containerd=/run/containerd/containerd.sock 5 或 6 ExecStart=/usr/bin/dockerd --insecure-registry 192.168.229.90 7 第二種:vim /etc/ docker/daemon.json 8 { 9 "insecure-registries": ["192.168.229.90"], 10 #新增,注意用逗號結尾 11 "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"] 12 }
1 ##重啟 docker,再次登入 2 3 systemctl daemon-reload 4 systemctl restart docker 5 6 ##再次登入 harbor 7 8 docker login -u admin -p Harbor12345 http://192.168.229.90 9 WARNING! Using --password via the CLI is insecure. Use --password-stdin. 10 WARNING! Your password will be stored unencrypted in /root/.docker/config.json. 11 Login Succeeded
將自動儲存憑據到 /root/.docker/config.json,下次登入時可直接使用憑據登入 Harbor。
(1)通過 Harbor Web 建立專案
在 Harbor 倉庫中,任何映象在被 push 到 regsitry 之前都必須有一個自己所屬的專案。
單擊“+專案”,填寫專案名稱,專案級別若設定為"私有",則不勾選。如果設定為公共倉庫,則所有人對此專案下的映象擁有讀許可權,命令列中不需要執行"Docker login"即可下載映象,映象操作與 Docker Hub 一致。
(2)建立 Harbor 使用者
- 建立使用者並分配許可權
在 Web 管理介面中單擊 系統管理 -> 使用者管理 -> +使用者,
填寫使用者名稱、郵箱、全名、密碼、註釋(可省略)。
附:使用者建立成功後,單擊左側“...”按鈕可將上述建立的使用者設定為管理員角色或進行刪除操作,本例不作任何設定。
- 新增專案成員
單擊 專案 -> 成員 -> + 成員,填寫上述建立的使用者,並分配角色為“開發人員”。
此時單擊左側 “...” 按鈕仍然可對成員角色進行變更或者刪除操作。
- 在客戶端上使用普通賬戶操作映象
1 ##刪除上述打標籤的本地映象 2 3 docker rmi 192.168.30.10/test2/cirros:v2
1 ##先退出當前使用者,然後使用上述建立的賬戶登入 2 3 docker logout 192.168.30.10 4 5 docker login 192.168.30.10 6 7 或 8 9 docker login -u city -p Abc123456 http://192.168.30.10
1 ##下載和上傳映象進行測試 2 3 docker pull 192.168.30.10/test2/cirros:v2 4 5 docker tag cirros:latest 192.168.30.10/test2/cirros:v3 6 docker push 192.168.30.10/test2/cirros:v3
(3)檢視日誌
Web 介面日誌,操作日誌按時間順序記錄使用者相關操作。
(4)修改 Harbor.cfg 配置檔案
要更改 Harbour 的配置檔案中的可選引數時,請先停止現有的 Harbor例項並更新 Harbor.cfg;然後執行 prepare 指令碼來填充配置; 最後重新建立並啟動 Harbour 的例項。
使用 docker-compose 管理 Harbor 時,必須在與 docker-compose.yml 相同的目錄中執行。
1 cd /usr/local/harbor 2 docker-compose down -v 3 4 vim harbor.cfg #只能修改可選引數 5 6 ./prepare 7 8 docker-compose up -d 9 //如果有以下報錯,需要開啟防火牆 firewalld 服務解決 10 Creating network "harbor_harbor" with the default driver 11 ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name. 12 (exit status 1)) 13 14 systemctl restart firewalld.service 15 docker-compose up -d
(5)移除 Harbor 服務容器同時保留映象資料/資料庫,並進行遷移
在 Harbor 伺服器上操作
1 ##移除 Harbor 服務容器 2 3 cd /usr/local/harbor 4 docker-compose down -v
1 ##把專案中的映象資料進行打包 2 3 ##持久資料,如映象,資料庫等在宿主機的 /data/ 目錄下,日誌在宿主機的 /var/log/harbor/ 目錄下 4 5 ls /data/registry/docker/registry/v2/repositories/ly 6 cd /data/registry/docker/registry/v2/repositories/ly 7 tar zcvf ly.tar.gz ./*
(6)如需重新部署,需要移除 Harbor 服務容器全部資料
1 cd /usr/local/harbor 2 docker-compose down -v 3 rm -r /data/database 4 rm -r /data/registry
-