需求
最近因為工作需要,開始研究docker-registry的實現和服務搭建。docker-registry是啥呢?就是目前很火的容器docker的鏡像存儲服務端。
或者這么說把,docker干的事情就是把整個應用、操作系統、配置打包成一個靜態的鏡像,這個鏡像可以快速的啟動關閉為一個動態的運行容器。但這種能力對單個人是沒有很大意義的,我們需要有個地方把鏡像存下來,然后用一個url或者鏈接分享給其他人。
如果是你,你會怎么設計?開一個公共的FTP讓大家存鏡像然后分享?這是個好主意,不過……docker的鏡像有這么一個設定,就是一個鏡像是由多層組成的,如果每次傳輸全量文件,對客戶端、服務端、用戶啟動都造成時間和流量的浪費。
于是……
需求一:遠程存儲服務,上傳和下載需要智能的識別對面有沒有這層,如果兩邊的層的uuid一致,已經有的話,就不傳了。
簡單的根據名字上傳下載,對人日常使用來說還不不夠方便,還需要一個web界面,讓人可以登陸、搜索、區分公共的鏡像和私有的鏡像,等等,這是人的需求,不是客戶端程序的需求。
需求二:web界面,支持搜索
每個鏡像層的大小約為幾十M到幾百M之間,可以想象,當很多人都往一個地方上傳時,單個服務器的存儲容量是絕對支撐不住的,需要可以水平擴展的集群,但web界面不能分開,客戶端程序也不應該很麻煩的自己找去哪里下載。
需求三:支持水平擴展的集群存儲
docker-hub和docker-registry的分工如下:
docker-hub
負責保存集中的信息訪問,關于
用戶賬戶鏡像的效驗碼公共和私人鏡像倉庫的區分docker-hub有幾個組件:
Web UIMeta-data 元數據存儲(附注、星級、公共庫清單)訪問認證token管理dokcer-registry
有這么幾個特性
存儲鏡像、以及鏡像層的家族譜系沒有用戶賬戶數據不知道用戶的賬戶和安全性把安全和認證委托給docker-hub來做,用token來保證傳遞安全不需要重新發明輪子,支持多種存儲后端沒有本地數據庫一次docker pull 或 push背后發生的事情
這兩個圖里面index就是hub,可以看到每次客戶端都要先訪問index,決定鏡像文件從哪個registry上傳或下載,然后去相應的registry操作。從閱讀源碼中可以看出,在registry上,每個鏡像的層都是以tar.gz格式存儲的。
自己搭建docker鏡像服務的考慮
既然是私服,同樣需要考慮用戶、安全認證、搜索等問題,可以說,docker的開發者在設計鏡像服務時就考慮了這些問題,把Web這塊留給每個私服的開發者自己去實現,把后端存儲抽象成接口來調用。docker-registry的源代碼放在這里 。為了保證后續的正常開發使用,我決定先閱讀一下這個源碼,不過碰上了不少問題:
docker-registry是用python實現的,我對python的了解僅僅限于簡單的腳本,對python的包、模塊、類都不大懂,所以我學習了pythondocker-registry使用了egg打包發布,gunicorn作為應用服務器(類似tomcat),flask作為mvc框架(類似spring),后面還有sqlalchemy作為搜索后端。這些技術都需要做簡單的了解,在需要的時候深入學習。后端存儲,因為鏡像最終是以tar.gz的方式靜態存儲在服務端,不需要實時read或write,所以適用于對象存儲而不是塊存儲,于是問題就轉化成找一個或寫一個私有的存儲驅動,官方支持的驅動有亞馬遜AWS S3、ceph-s3、Google gcs、OpenStack swift,glance等等,國內的七牛也寫了自己的驅動 ,后面在我的環境需要自己寫一個驅動。搜索,這塊我還沒涉及,后續再看……Web UI的實現,現在github上已經有好幾個項目了,例如docker-registry-web ,docker-registry-frontend,后續再看……最近在研究用Docker實現PaaS,歡迎大家有想法找我交流:-)
原文鏈接:http://my.oschina.net/HardySimpson/blog/365513