如何構(gòu)建多架構(gòu)(Multi-Arch)的容器鏡像(一)

? ? Docker的目標(biāo)是 “Build, Ship, and Run Any App, Anywhere” 决帖。但是我們?cè)趯?shí)際環(huán)境中會(huì)發(fā)現(xiàn)現(xiàn)在的服務(wù)器除了Intel x86架構(gòu)的還有ARM墩朦,也有OpenPOWER(ppc64le).Docker Image是容器運(yùn)行的基礎(chǔ)吮螺,它是依賴于操作系統(tǒng)的。比如說我們不能把一個(gè)tomcat的ppc64le/linux架構(gòu)的Docker鏡像運(yùn)行在amd64/linux 架構(gòu)的環(huán)境中,否則你會(huì)遇到 “exec format error”尊残。早期Docker鏡像存儲(chǔ)的設(shè)計(jì)沒有充分考慮到鏡像Multi architecture的支持,而是簡(jiǎn)單的使用鏡像存儲(chǔ)庫(kù)的前綴來區(qū)分相同應(yīng)用的不同平臺(tái)淤堵,并建議開發(fā)者將不同平臺(tái)的鏡像應(yīng)該push到相對(duì)應(yīng)的Docker hub的鏡像倉(cāng)庫(kù)中寝衫。

? ? 從Docker registry v2.3和Docker 1.10 開始,Docker hub就可以pull multi architecture Docker鏡像了.Docker社區(qū)重新定義了 v2.2 Image specification format(PR #1068)并在 Implement schema2 manifest formats(PR #1281)實(shí)現(xiàn)了Multi architecture Docker鏡像功能拐邪。這個(gè)功能能夠讓我們?cè)诓煌珻PU架構(gòu)的主機(jī)上慰毅,運(yùn)行相同的docker pull 命令就可以直接獲得符合當(dāng)前主機(jī)CPU架構(gòu)的鏡像。比如在不同CPU架構(gòu)的主機(jī)上運(yùn)行?docker run -it --rm busybox arch 這個(gè)命令扎阶,我們能自動(dòng)獲取到不同架構(gòu)的busybox的docker 鏡像汹胃。除了busybox鏡像,httpd,nginx, tomcat和etcd等主流開源應(yīng)用都有了Multi architecture Docker鏡像支持东臀。在Docker Hub里只要鏡像有顯示支持不同架構(gòu)的標(biāo)簽就是Multi architecture Docker鏡像着饥。

? ? Docker 通過使用 manifest lists 技術(shù)來實(shí)現(xiàn)Multi architecture Docker鏡像。什么是image manifest list呢惰赋?一個(gè)image manifest list 包含指向已經(jīng)存在鏡像的manifest對(duì)象列表(圖一)宰掉。

圖一

一個(gè)image manifest list包含已經(jīng)存在鏡像的manifest對(duì)象的平臺(tái)特性(CPU arch和OS類型)特征(圖二)

圖二

當(dāng)我們運(yùn)行docker pull拉取鏡像的時(shí)候,如果registry響應(yīng) docker pull 命令不是 image manifest里的, Docker 檢查manifest list 然后 pull該平臺(tái)對(duì)應(yīng)的 list entry然后再運(yùn)行赁濒。distribution protocol 是后向兼容的,? manifest lists 只服務(wù)于指明了支持 Accept header的客戶端贵扰。對(duì)于不支持 manifest lists的客戶端, registries 將會(huì)返回給 x86-64 Linux image manifest. Manifest lists 通過 Docker Content Trust 支持全部特征,確保 multi-platform image 內(nèi)容被加密驗(yàn)證和檢驗(yàn)流部。

? ? ?制作一個(gè)multi architecture Docker鏡像最重要的是定義image的manifest list戚绕。下面演示分別使用兩種工具定義manifest list

1 . Enhanced Docker CLI

這是加強(qiáng)版的Docker CLI,他的code base 是基于社區(qū)的Docker CLI,并且marge了 Docker官方的Add manifest command這個(gè)pull request枝冀,它很好的集成了現(xiàn)有的Docker CLI, 并且增加了docker manifest的sub command 支持舞丛。

a. 構(gòu)建myapp的x86_64鏡像,并且push到Docker hub上

docker build -t huxl/myapp-x86_64:v1

b. 構(gòu)建myapp的ppc64le鏡像果漾,并且push到Docker hub上

docker build -t huxl/myapp-ppc64le:v1

c. 創(chuàng)建指向myappp的x86_64和ppc64le的鏡像的manifests list對(duì)象并將它push到docker hub

./docker manifest create huxl/myapp:v1 huxl/myapp-x86_64:v1 huxl/myapp-ppc64le:v1

./docker manifest annotate huxl/myapp:v1 huxl/myapp-x86_64:v1 --os linux --arch amd64

./docker manifest annotate huxl/myapp:v1 huxl/myapp-ppc64le:v1 --os linux --arch ppc64le

./docker manifest push huxl/myapp:v1

2. Manifest-tool

這是一個(gè)獨(dú)立的小工具球切,它也實(shí)現(xiàn)了v2.2 Image specification format,并且支持查看绒障,創(chuàng)建和push manifests list 對(duì)象到Docker registry吨凑,并且更加方便易用,因?yàn)樗梢允褂脃aml文件定義image manifest list對(duì)象。

a. 創(chuàng)建一個(gè)yaml文件用來表述支持multi architecture的鏡像myapp:v1

? ? ? ? ?image: huxl/myapp:v1

? ? ? ? ? ? ? manifests:

? ? ? ? ? ? ? ? ? image: huxl/myapp-ppc64le:v1

? ? ? ? ? ? ? ? ? ?platform:

? ? ? ? ? ? ? ? ? ? ? ?architecture: ppc64le

? ? ? ? ? ? ? ? ? ? ? ? ?os: linux

? ? ? ? ? ? ? ? ? ? image: huxl/myapp-x86_64:v1

? ? ? ? ? ? ? ? ? ? platform:

? ? ? ? ? ? ? ? ? ? ? ? architecture: amd64

? ? ? ? ? ? ? ? ? ? ? ? os: linux

b. push myapp.yaml到docker hub

./manifest-tool push from-spec myapp.yaml

Note:我們可以使用命令docker manifest inspect huxl/myapp:v1 或者 manifest-tool inspect huxl/mycool-app:v1看到這個(gè)multi architecture Docker鏡像的manifest list鸵钝,這里就不在贅述了糙臼。

總結(jié)

1Push multi architecture Docker鏡像到Docker registry并不會(huì)push image的layers,它只會(huì)push一個(gè)引用,這個(gè)引用指向了已經(jīng)存在的多個(gè)Docker鏡像恩商;

2只有multi architecture Docker鏡像的創(chuàng)建者才需要知道這個(gè)引用背后指向具體的Docker鏡像变逃,而對(duì)最終的用戶是透明的,最終用戶只需要知道鏡像的名字和tag就足夠了怠堪;

3有了multi architecture Docker鏡像支持揽乱,我們?cè)僖膊挥迷谀_本里面判斷OS的類型和CPU的arch而去pull相應(yīng)的鏡像,提高CICD代碼的簡(jiǎn)潔和優(yōu)雅粟矿;

4Image manifest list是極好的兼容性設(shè)計(jì)凰棉,它不但支持multi architecture Docker鏡像,而且不會(huì)影響已經(jīng)在的simple architecture Docker鏡像的使用方式, 用戶不用做二選一的艱難的決定陌粹。

參考?

https://blog.csdn.net/dev_csdn/article/details/79138424

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渊啰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子申屹,更是在濱河造成了極大的恐慌绘证,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哗讥,死亡現(xiàn)場(chǎng)離奇詭異嚷那,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)杆煞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門魏宽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人决乎,你說我怎么就攤上這事队询。” “怎么了构诚?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蚌斩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我范嘱,道長(zhǎng)送膳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任丑蛤,我火速辦了婚禮叠聋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘受裹。我一直安慰自己碌补,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厦章,像睡著了一般镇匀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闷袒,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音岩梳,去河邊找鬼囊骤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冀值,可吹牛的內(nèi)容都是我干的也物。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼列疗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼滑蚯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抵栈,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤告材,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后古劲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斥赋,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年产艾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疤剑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闷堡,死狀恐怖隘膘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杠览,我是刑警寧澤弯菊,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站踱阿,受9級(jí)特大地震影響误续,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扫茅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一蹋嵌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葫隙,春花似錦栽烂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)焰手。三九已至,卻和暖如春怀喉,著一層夾襖步出監(jiān)牢的瞬間书妻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工躬拢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躲履,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓聊闯,卻偏偏與公主長(zhǎng)得像工猜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菱蔬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容