程 寧
(湖北輕工職業(yè)技術(shù)學(xué)院, 湖北 武漢 430070)
Docker 倉庫是Docker 集中存放鏡像文件的場所,分為公有倉庫和私有倉庫兩種形式。目前,最大的公有倉庫是Docker Hub,存放了數(shù)量龐大的鏡像供用戶下載使用,用戶也可上傳鏡像到公有倉庫。國內(nèi)不少云服務(wù)提供商,如時速云、阿里云、百度云等云服務(wù)商提供了倉庫的本地源,可以提供穩(wěn)定的國內(nèi)訪問。雖然公有倉庫有眾多優(yōu)點,但是也存在一些問題。如公司企業(yè)級的私有鏡像,由于鏡像涉及機密的數(shù)據(jù)和軟件,私密性比較強,因此不太適合放在公有倉庫中。此外,出于安全考慮,一些公司不允許公司內(nèi)網(wǎng)服務(wù)器環(huán)境訪問外網(wǎng),因此無法下載到公有倉庫的鏡像[1]。為了解決這些問題,可以根據(jù)需要搭建私有倉庫,提供私有鏡像的上傳、下載。對比公有倉庫,私有倉庫具有安全性和私密性高、訪問速度快、自主控制、方便存儲和可維護性高的優(yōu)點。
常見搭建Docker 私有倉庫的方法有利用Registry 和Harbor 兩種形式。Registry 是Docker 官方的一個私有倉庫鏡像,可以將本地的鏡像打標(biāo)簽進行標(biāo)記然后push 到以Registry 起的容器的私有倉庫中。對比Registry,Harbor 是一個用于存儲和分發(fā)Docker 鏡像的企業(yè)級私有Registry 服務(wù)器, 具有基于角色的訪問控制, 基于策略的鏡像復(fù)制,漏洞掃描,LDAP/AD 支持,鏡像刪除和垃圾收集等強大功能[2]。本文將重點介紹利用Harbor 搭建Docker 私有倉庫的方法。
Porxy:對應(yīng)啟動組件nginx,提供nginx 反向代理服務(wù),該代理服務(wù)來自瀏覽器的Docker client 的不同請 求 由Proxy 分 發(fā) 到Harbor 的registry、UI、token service 等組件。
Registry:對應(yīng)啟動組件registry,負(fù)責(zé)提供Docker鏡像的存儲,以及處理Docker 的push、pull 等請求。由于Harbor 需要對鏡像的訪問做權(quán)限控制,因此Registry 會將docker client 的每次push、pull 請求轉(zhuǎn)發(fā)到token 服務(wù)以獲取一個有效的token 令牌。
Job services:對應(yīng)啟動組件harbor-jobservice,主要用于鏡像復(fù)制,本地鏡像可以被同步到遠程的Harboar 鏡像倉庫。
Log Collector:對應(yīng)啟動組件harbor-log,負(fù)責(zé)收集其他容器的日志并進行日志輪轉(zhuǎn)。
Database:對應(yīng)啟動組件harbor-db,負(fù)責(zé)提供數(shù)據(jù)持久化服務(wù),用于存放工程元數(shù)據(jù)、用戶數(shù)據(jù)、角色數(shù)據(jù)、同步策略以及鏡像元數(shù)據(jù)。
Harbor 是通過docker compose 進行部署的,其每一個組件均會被包裝成一個Docker 容器,不同容器組件按照以下步驟進行Login 登錄和Push 傳輸處理工程:
步驟1:客戶端發(fā)送請求會被監(jiān)聽80 端口的代理容器所接收,容器中的nginx 將會把該請求轉(zhuǎn)發(fā)給后端的Registry 容器
步驟2:如果Registry 容器發(fā)現(xiàn)請求中沒有攜帶令牌,會返回一個401 錯誤碼,并將獲取令牌URL 的地址傳遞給Docker 客戶端。如請求攜帶令牌,則轉(zhuǎn)向步驟6。
內(nèi)部控制管理體制的不完善,導(dǎo)致高校在招標(biāo)過程中,缺少必要的監(jiān)督制度與嚴(yán)格的操作過程以及容易受行政干擾,導(dǎo)致采購的物質(zhì)質(zhì)量、價格和售后服務(wù)都很難得到保證,極易滋生腐敗。另外,高校在物資采購和驗收時,存在一人同時負(fù)責(zé)這兩項工作的情況,嚴(yán)重違反分工控制準(zhǔn)則。在設(shè)備采購后,高校中出現(xiàn)不把新采購設(shè)備計入固定資產(chǎn)項目的情況,導(dǎo)致國有資產(chǎn)流失嚴(yán)重。
步驟3:當(dāng)Docker 客戶端收到401 錯誤碼后,會向token service URL 發(fā)送一個嵌入用戶名和密碼信息的請求。
步驟4:token service URL 收到請求后,通過解碼提取用戶名和密碼信息,并到數(shù)據(jù)庫中進行核對。
步驟5:當(dāng)token service 被配置為LDAP/AD 認(rèn)證時,token service 會通過外部的服務(wù)器來完成認(rèn)證。如果認(rèn)證通過,Token 服務(wù)會給客戶端分發(fā)一個令牌,當(dāng)客戶端得到令牌,再次執(zhí)行Login 登錄操作,以完成Login 登錄工作。
步驟6:在收到獲得令牌后,Registry 會檢驗令牌的合法性及有效期,如令牌通過合法性和有效期的檢驗,則會開啟鏡像的push 傳輸過程,并將鏡像放入到倉庫中。
本案例選用兩臺部署在VMware Workstation 15 中的Centos7.2 虛擬機作為宿主機,均已預(yù)先安裝好Docker,并與外網(wǎng)互通,且關(guān)閉防火墻和Selinux 配置[3]。
1)由于Harbor 需通過Docker 的compose 項目進行部署,因此需要先安裝compose,本實驗選用docker compose 的版本為1.29.2。
2)安裝openssl 軟件包,并配置OpenSSL 工具配置文件openssl.cnf。
3)簽發(fā)SSL 證書。
命令執(zhí)行后,會成生harbor.crt 和harbor.key 文件,再將生成的私有證書追加到系統(tǒng)的證書管理文件中,否則后面push、login 和pull 時會報錯。
4)安裝harbor 倉庫,harbor 的安裝包為harbor-offline-installer-v1.10.1.tgz。
進入當(dāng)前目錄下的harbor 目錄,編輯harbor.yml配置文件,修改hostname、https 證書路徑、admin 密碼三個參數(shù)信息。
步驟1:利用docker ps 命令檢測容器啟動狀態(tài),要求所有容器均為“UP”狀態(tài)。
步驟2:打開瀏覽器,地址欄中輸入“https://192.168.100.20”,在打開的登錄容器中輸入正確的用戶名和密碼后,進行harbor 工作主界面。
步驟3:創(chuàng)建一個名為test 的項目,設(shè)置項目訪問權(quán)限為“公開”,如下頁圖2 所示。
步驟4:利用dockerlogin 命令登錄192.168.100.20,輸入正確的用戶名和密碼后,如顯示“Login Succeeded“信息,則登錄成功。
步驟5:利用docker tag 命令修改鏡像標(biāo)簽后,使用docker push 命令將鏡像推送到私有倉庫。
步驟6:在test 項目中可查看到推送的nginx 鏡像。如圖3 所示。
步驟7:在客戶端上利用docker pull 命令從私有倉庫中下載nginx 鏡像。
編輯/etc/docker/daemon.json 文件。
重啟docker 服務(wù)后,利用docker pull 命令從私有倉庫中下載nginx 鏡像,并利用docker image 查看下載的鏡像。
本案例實現(xiàn)了利用harbor 在docker 環(huán)境在搭建私有倉庫的方法。在實際生產(chǎn)系統(tǒng)中,私有倉庫搭建還需考慮高可用性,以解決單點故障的問題,可采用磁盤共享負(fù)載均衡分發(fā)方案、Harbor 復(fù)制同步策略方案和HA 主從方案進行解決。