模仿京東商城網(wǎng)站開發(fā)視頻蘋果自研搜索引擎或?yàn)樘娲雀?/h1>
目錄
鏡像倉庫:怎么用好docker?hub這個(gè)寶藏
什么是鏡像倉庫(Registry)
什么是docker?hub
如何在docker?hub上挑選鏡像
docker?hub上進(jìn)行概念股命名規(guī)則是什么
該怎么上傳自己的鏡像
離線環(huán)境該怎么辦
小結(jié)
鏡像倉庫:怎么用好docker?hub這個(gè)寶藏
好,我們繼續(xù)來說一下往后的章節(jié),上章節(jié)里面呢,我們學(xué)習(xí)了dockerfile和docker?build的用法,知道了如何創(chuàng)建自己的鏡像,那么鏡像文件應(yīng)該如何管理呢,具體來說,應(yīng)該如何存儲,檢索,分發(fā),共享鏡像呢?不解決這些問題,我們?nèi)萜骰瘧?yīng)用還是無法順利地實(shí)施。
今天,我們來談一下這個(gè)話題,聊聊什么是鏡像倉庫,還有該怎么用好鏡像倉庫。
什么是鏡像倉庫(Registry)
之前我們已經(jīng)用過docker?pull命令拉取鏡像,也說過有一個(gè)鏡像倉庫(Registry)的概念,那到底什么是鏡像倉庫呢?
還是來看看docker的官方架構(gòu)圖:
圖里右邊的區(qū)域就是鏡像倉庫,術(shù)語叫Registry,直譯是所有鏡像的Repository都在這里登記保管,就像是一個(gè)巨大的檔案館。
然后我們再來看看左邊的docker?pull,虛線顯示了它的工作流程,先到docker?daemon,再到Registry,只有當(dāng)Registry里存有鏡像才能真正把他下載到本地。
當(dāng)然了,拉取鏡像只是鏡像倉庫最基本的一個(gè)功能,他還會提供更多的功能,比如上傳,查詢,刪除等等,是一個(gè)全面的鏡像管理服務(wù)站點(diǎn)。
你也可以把鏡像倉庫比成手機(jī)上的應(yīng)用商店,里面分門別類放了許多容器化的應(yīng)用,需要什么去找一下就行了,有了它,我們使用鏡像才能免除后顧之憂。
什么是docker?hub
不過,你應(yīng)該沒有注意到,在使用docker?pull?獲取鏡像的時(shí)候我們并沒有明確指定鏡像倉庫,在這種情況下,動(dòng)車可就會使用一個(gè)默認(rèn)的鏡像倉庫,也就是大名鼎鼎的docker?hub?
https://hub.docker.com
docker?hub是docker公司搭建的官方registry服務(wù),創(chuàng)立于2014年6月,和docker?1.0同時(shí)發(fā)布,他號稱是世界上最大的鏡像倉庫,和Git?hub一樣,幾乎成為了容器世界的基礎(chǔ)設(shè)施。
docker?hub里面不僅有docker自己打包的鏡像,而且還對公眾免費(fèi)開放,任何人都可以上傳自己的作品,經(jīng)過這8年的發(fā)展,docker?hub已經(jīng)不再是一個(gè)單純的鏡像倉庫了,更應(yīng)該說是一個(gè)豐富而繁榮的容器社區(qū)
你可以看看下面的這張截圖,里面列出的都是下載量超過十億次的最受歡迎的應(yīng)用程序,比如nginx,MongoDB,node.js,Redis,openJDK,等等,顯然,把這些容器化的應(yīng)用引入到我們自己的系統(tǒng)里,就像是站在了巨人的肩膀上,一開始就會有一個(gè)高水平的起點(diǎn)
但和Github,App?Store一樣,面向所有人公開的docker?hub也有一個(gè)不可避免的缺點(diǎn),就是良莠不齊。
在docker?hub搜索框里輸入關(guān)鍵字,比如NGINX,MySQL,她立即就會給出幾百上千個(gè)搜索結(jié)果,有點(diǎn)亂花迷人眼的感覺,這么多鏡像,應(yīng)該如何挑選出最適合自己的呢?下面我們來說說自己在這方面的一些經(jīng)驗(yàn)。
如何在docker?hub上挑選鏡像
首先,你應(yīng)該知道,在docker?hub上有官方鏡像,認(rèn)證鏡像,和非官鏡像的區(qū)別
官方鏡像是指docker公司官方提供的高質(zhì)量鏡像,GitHub - docker-library/official-images: Primary source of truth for the Docker "Official Images" program
都經(jīng)過了嚴(yán)格的漏洞掃描和安全檢查,支持x86,arm64等多種硬件架構(gòu),還具有清晰易讀的文檔,一般來說使我們構(gòu)建鏡像的首選,也是我們編寫dockerfile的最佳范例
官方鏡像目前大概100多個(gè),基本上囊括了現(xiàn)在的各種流行技術(shù),下面就是官方的nginx鏡像網(wǎng)頁截圖:
你會看到,官方鏡像會有一個(gè)特殊的Official?image的標(biāo)記,這就表示這個(gè)鏡像經(jīng)過了docker公司的認(rèn)證,有專門的團(tuán)隊(duì)負(fù)責(zé)審核,發(fā)布,更新,質(zhì)量上絕對可以放心。
第二類是認(rèn)證鏡像,標(biāo)記是Verified?publisher,也就是認(rèn)證發(fā)行商,比如Bitnami,Rancher,ubuntu等,他們都是頗具規(guī)模的大公司,具有不遜于docker公司的實(shí)力,所以就在docker?hub上開了個(gè)認(rèn)證賬號,發(fā)布自己打包的鏡像,有點(diǎn)類似我們微博上的大V。
這些鏡像有公司背書,當(dāng)然也很值得信賴,不過他們難免會有戴上一些各自公司的烙印,比如Bitnami的鏡像就統(tǒng)一以minideb為基礎(chǔ),靈活性上比docker官方鏡像略差,有的時(shí)候也許會不符合我們的需求。
除了官方鏡像和認(rèn)證鏡像,剩下的就都屬于非官方鏡像了,不過這里面也可以分出兩類。
第一類是“半官網(wǎng)”鏡像,因?yàn)槌蔀閂erified?publisher?是要給docker公司交錢的,而很多公司不想花這個(gè)冤枉錢,所以只在docker?hub上開了公司賬號,但并不加入認(rèn)證
這里我以openresty為例,看一下它的docker?hub頁面,可以看到顯示的是openresty官方發(fā)布的,但并沒有經(jīng)過docker正式認(rèn)證,所以難免就會存在一些風(fēng)險(xiǎn),有被冒名頂替的可能,需要我們在使用的時(shí)候留心鑒別一下,不過一般來說,這種辦官方鏡像也是比較可靠的
第二類就是純粹的民間鏡像了,通常是個(gè)人上傳到docker?hub的,因?yàn)闂l件有限,測試不完全甚至沒有測試,質(zhì)量上難得以保證,下載的時(shí)候需要小心謹(jǐn)慎。
除了查看鏡像是否為官方認(rèn)證,我們還可以再結(jié)合其他的條件來判斷鏡像質(zhì)量是否足夠好,做法和GitHub差不多,就是看它的下載量,星數(shù),還有更新歷史,簡單的來說就是好評數(shù)量
一般來說下載量是最重要的參考依據(jù),好的鏡像下載量通常都在百萬級別(超過1M)而有的鏡像雖然也是官方認(rèn)證,但缺乏維護(hù),更新不及時(shí),用的人很少,星數(shù),下載數(shù)都寥寥無幾,那么還是應(yīng)該選擇下載量最多的鏡像,通俗來說就是隨大流
下面這張截圖就是openresty在docker?hub上的搜索結(jié)果,可以看到,有兩個(gè)認(rèn)證發(fā)行商的鏡像(Bitnami?,?IBM),但是下載量都很少,還有一個(gè)民間鏡像下載量雖然超過了1M,但更新時(shí)間是三年前,所以毫無疑問,我們應(yīng)該選擇排在前三位,但下載量超過10m,有360多個(gè)星的半官方鏡像
看了這么多docker?hub上的鏡像,你一定注意到了,應(yīng)用都是一樣的名字,比如都是NGINX,redis,openresty,該怎么區(qū)分不同作者打包出的鏡像呢?
如果你很熟悉GitHub,就會發(fā)現(xiàn)docker?hub也使用了同樣的規(guī)則,就是用戶名/應(yīng)用名的形式,比如bitnami/nginx、ubuntu/nginx、rancher/nginx等等
所以,我們在使用docker?pull下載這些非官方鏡像的時(shí)候,就必須把用戶名也帶上,否則默認(rèn)就會使用官方鏡像:
docker?pull?bitnami/nginx
docker?pull?ubuntu/nginx?
docker?hub上進(jìn)行概念股命名規(guī)則是什么
確定了這個(gè)鏡像還不夠,因?yàn)殓R像還會有許多不同的版本,也就是標(biāo)簽(tag)
直接使用默認(rèn)的latest雖然簡單方便,但在生產(chǎn)環(huán)境里是一種非常不負(fù)責(zé)任的做法,會導(dǎo)致版本不可控,所以我們還需要理解dockerhub標(biāo)簽命名的含義,才能挑選出最適合我們自己的鏡像版本。
下面我就那官方的redis鏡像作為例子,解釋一下這些標(biāo)簽都是什么意思
通常來說,鏡像標(biāo)簽的格式是應(yīng)用的版本號加上操作系統(tǒng),
版本號你應(yīng)該比較了解吧,及把他那都是主版本號+次版本號+補(bǔ)丁號的形式,有的還會在正式發(fā)布前出rc版(候選版本,release?candidate),而操作系統(tǒng)的情況略微復(fù)雜一些,應(yīng)為各個(gè)Linux發(fā)型版的命名方式太多了
alpine,centos的命令比較簡單明了,就是數(shù)字的版本號,像這里的alpine3.15.而ubuntu、Debian則才用了代號的形式,比如ubuntu.18.04是bionic,ubuntu20.04是focal,Debian9是stretch,Debian10是buster,Debian11是bullseye
另外,有的標(biāo)簽還會加上slim,fat,來進(jìn)一步表示這個(gè)鏡像的內(nèi)容是經(jīng)過精簡的,還是包含了較多的輔助工具,通常slim鏡像會比較小。運(yùn)行效率高,而fat鏡像會比較大,適合用來開發(fā)調(diào)試
下面我就列出幾個(gè)標(biāo)簽的例子來說明一下。
-?nginx:1.21.6-alpine,表示版本號是1.21.6,基礎(chǔ)鏡像是最新的Alpine。
-?redis:7.0-rc-bullseye,表示版本號是7.0候選版,基礎(chǔ)鏡像是Debian?11。
-?node:17-buster-slim,表示版本號是17,基礎(chǔ)鏡像是精簡的Debian?10。
該怎么上傳自己的鏡像
現(xiàn)在,我想你應(yīng)該對如何在docker?hub上選擇鏡像有了比較全面的了解,那么接下來的問題就是我們用dockerfile創(chuàng)建的鏡像該如何上傳到docker?hub上呢?
這件事其實(shí)一點(diǎn)也不難,只需要4個(gè)步驟就能完成
第一步,你需要在docker?hub上注冊一個(gè)用戶,這個(gè)就不必再多說了
第二步,你需要在本機(jī)上使用docker?login命令,用剛才注冊的用戶名和密碼認(rèn)證身份登錄,像這里就用了我的用戶名chronolaw
第三步很關(guān)鍵,需要使用docker?tag?命令,給鏡像改成帶用戶名的完整名字,表示鏡像是屬于還整個(gè)用戶的,或者簡單一點(diǎn),直接用docker?build?-t在創(chuàng)建鏡像的時(shí)候就起好名字,這里我就用上次章節(jié)里的ngx-app作為例子,給他改名成chronolaw/ngx-app:1.0
docker?tag?ngx-app?chronolaw/ngx-app:1.0
第四步,用docker?push?把這個(gè)鏡像推上去,我們的鏡像發(fā)布工作就大功告成了:
docker?push?chronolaw/ngx-app:1.0
你還可以登錄docker?hub網(wǎng)站驗(yàn)證一下鏡像發(fā)布的效果,可以看到他會自動(dòng)為我們生成一個(gè)頁面模板。,里面還可以進(jìn)一步豐富完善,比如添加描述信息,使用說明等等;
現(xiàn)在你就可以把這個(gè)鏡像的名字(用戶名/應(yīng)用名:標(biāo)簽)告訴你的同事,讓他去用docker?pull?下載部署了
離線環(huán)境該怎么辦
使用docke?hub來管理鏡像的確是非常方便,不過有一種場景它卻是無法發(fā)揮作用,那就是企業(yè)內(nèi)網(wǎng)的離線環(huán)境,連不上外網(wǎng),自然也就不能使用docker?push。docker?pull來同送拉取鏡像了
那這種情況有沒有解決辦法呢?
方法當(dāng)然有,而且有很多,最佳的方法就是在內(nèi)網(wǎng)環(huán)境里仿造docker?hub,創(chuàng)建一個(gè)自己的私有registry服務(wù),有他來管理我們的鏡像,就想我們自己搭建gitlab做版本管理一樣
自建registry已經(jīng)有很多成熟的解決方案,比如docker?registry,還有CNCF?Harbor,不用使用他們還需要一些目前沒有講到的知識,步驟也有點(diǎn)繁瑣,所以我會在后續(xù)的章節(jié)里再介紹
下面我們說一說存儲,分發(fā)鏡像的一種笨方法,雖然比較原始,但簡單易行,可以作為臨時(shí)的應(yīng)急手段
docker提供了save和load這兩個(gè)鏡像歸檔命令,可以把鏡像導(dǎo)出成壓縮包,或者從壓縮包導(dǎo)入docker,而壓縮包是非常容易保管和傳輸?shù)?#xff0c;可以聯(lián)機(jī)拷貝,FTP共享,甚至存在U盤上隨身攜帶
需要注意的是,這兩個(gè)命令默認(rèn)使用標(biāo)準(zhǔn)流作為輸入輸出(為了方便linux管道操作)所以一般會用-o、-i參數(shù)來使用文件的形式,例如:
docker?save?ngx-app:latest?-o?ngx.tar
docker?load?-i?ngx.tar
小結(jié)
好了,今天我們一起學(xué)習(xí)了鏡像倉庫,了解了docker?hub的使用方法,整理一下要點(diǎn)方便你加深理解:
1-鏡像倉庫(registry)是一個(gè)提供綜合鏡像服務(wù)的網(wǎng)站,最基本的功能是長傳和下載
2-docker?hub是目前最大的鏡像倉庫,擁有很多高質(zhì)量的鏡像和,尚明的鏡像非常多,選擇的標(biāo)準(zhǔn)有官方認(rèn)證,下載量,星數(shù)等,需要綜合評估
3-鏡像也有很多版本,應(yīng)該根據(jù)版本號和操作系統(tǒng)仔細(xì)確認(rèn)合適的標(biāo)簽
4-在docker?hub注冊之后就可以上傳自己的鏡像,用docker?tag打上標(biāo)簽再用docker?push推送
5-離線環(huán)境可以自己搭建私有鏡像倉庫,或者使用docker?save把鏡像存成壓縮包,再用docker?load從壓縮包恢復(fù)成鏡像
最后我還是提問幾個(gè)問題,留給大家來思考:
1-很多應(yīng)用,比如nginx,redis,go,都已經(jīng)有了docker官方鏡像,為什么其他公司(Bitnami,Rancher)還要重復(fù)勞動(dòng),發(fā)布自己打包的鏡像呢?
2-你能否對比一下GitHub和docker?hub,說說他們兩個(gè)在功能,服務(wù)對象,影響范圍,等方面的異同點(diǎn)呢?
記得在留言區(qū)參與討論哦,我看到后會第一時(shí)間回復(fù),我們下個(gè)章節(jié)再見~