Docker CEO Ben Golub在2014年的DockerCon上發(fā)布Docker Hub,并指出已經(jīng)有超過14,000個Docker化的應用存儲在他們的publc registry中。而根據(jù)2015年的DockerCon上,Docker SVP Marianna Tessel公布的數(shù)據(jù),Docker Hub上的repos已經(jīng)超過150,000個,僅一年就有了十倍的增長!
看到這些瘋狂增長的數(shù)字,筆者不禁想去探索這些數(shù)據(jù)背后的故事。所以決定從Docker Hub中挖掘數(shù)據(jù),通過調(diào)用Docker Registry API,研究這150,000個repos。
需要注意的是:Docker Hub中的repos和tag在不斷地被添加和刪除,所以文中的數(shù)據(jù)只是在某個特定時間點的數(shù)據(jù),當你讀到這篇文章時可能它已經(jīng)發(fā)生了變化,但這些數(shù)字背后體現(xiàn)的規(guī)模還是基本準確的。
鏡像倉庫(Repositories)
最新統(tǒng)計顯示Docker Hub上有125,289個公共庫。這比在六月的DockerCon上提及的150,000略少(的確增長到過那個數(shù)字),可能因為有一些私有庫。
在這些公有庫中,39,441(31%)是自動構(gòu)建(automate build),也就是說這個鏡像是由Docker Hub,構(gòu)建一個已經(jīng)發(fā)布的Dockerfile生成的鏡像。剩下85,848個庫鏡像是通過docker push命令上傳的。
Docker Hub上目前有84個官方鏡像倉庫,涵蓋了Mysql,MongoDB和Redis等常用的服務。相比在14年DockerCon上公布的13個,這也是相當大的增幅。
機構(gòu)(Organizations)
以下是發(fā)布公共鏡像倉庫最多的10大機構(gòu)或個人:
不知道datdocker用那8261個庫做什么,看起來像是CI過程中生成的新庫,因為很多庫名都加了數(shù)字后綴。
而imiell的擁有者是Ian Miell,曾寫過一本Docker的書,許多庫看起來都是書中的范例。
收藏數(shù)(Stars)
通過Docker registry API獲取不了鏡像被pull的個數(shù),只能通過鏡像的star數(shù)量,來衡量鏡像的流行度。
毫無疑問,擁有最高star數(shù)量的庫都是官方庫。排名最高的10個官方庫是:
排名最高的十個非官方庫是:
這張列表上最令人驚訝的是aspnet鏡像(ASP.NET的Docker鏡像),顯然有許多微軟開發(fā)人員對Docker很感興趣。
Tags
在這125,289個公共庫中,有243,966個被加了tag。平均每一個庫有1.9個tag。超過100,000個庫(82%)有唯一的tag,有少量庫擁有上千個tag。
tag最多的是rstiller/jetty,有2104個tag(他們似乎為每個可能組合的OS,JDK和Jetty版本都創(chuàng)建了鏡像tag)。所有庫中最常使用的tag:
最有趣的tag是”kitten”,73個不同的鏡像都使用了它,可能和這個Kubernetes Demo App(https://github.com/kubernetes/kubernetes/blob/master/docs/user-guide /update-demo/kitten-rc.yaml)有關(guān)。
排第1的是“lastest”,如果你不明確指定一個tag,默認情況下就會是“lastest”。
有247個庫沒有tag,—它們都是沒有鏡像的空庫。
基礎鏡像(base image)
Docker的優(yōu)雅之處在于其分層鏡像格式,你不必從無到有構(gòu)建你的鏡像——你能使用任何公共鏡像作為基礎,構(gòu)建自己的鏡像。那么哪些鏡像是最經(jīng)常被引用的基礎鏡像呢?以下是排名前十的基礎鏡像:
顯然,Ubuntu是極其受大家歡迎的基礎鏡像,前10中占了6個,因為很多開發(fā)人員都對Ubuntu很熟悉。但建議關(guān)注一下alpine,特別是出于精簡鏡像的考慮。 scratch鏡像是當之無愧的No.1.Docker 1.5以前,幾乎每個鏡像都將scratch作為基礎鏡像。
Alpine鏡像的大小是5MB(ubuntu鏡像大小是188MB),有一個很棒的包管理器。CenturyLink已經(jīng)將很多的基礎鏡像從Ubuntu遷移到了Alpine,顯著縮小了鏡像的大小。
Missing Tags
10個最經(jīng)常被引用的基礎鏡像中,6個沒有tag(被標記為lastest),可能之前它們也被標記為某一個值,但又變了。
比如,之前bf84c1d84a8f層被標記為debian:latest(也是debian:jessie)。當其它鏡像以其為基礎鏡像時,會在Dockerfile中寫FROM debian或FROM debian:jessie。
如果Debian鏡像被重新構(gòu)建,tag會被指向到另外的層。所以,鏡像tag不是靜態(tài)的,它們可能指向到另外的鏡像。
如果你希望你的鏡像始終基于最新版本的Debian Jessie或者Ubuntu構(gòu)建而成,你需要追蹤這些tag的變更,并根據(jù)情況重構(gòu)鏡像。Docker Hub的repository link特性可以幫你實現(xiàn)這一點。