国产精品免费久久久久电影院_亚洲日韩蜜桃av无码一二三区_AV在线无码免费特黄毛片_亚洲欧美日韩电影在线专区_福利小视频午夜福利一区二区中文字幕_在线免费观看黄黄色视频_欧美菊爆视频在线观看免费_婷婷六月丁香五月_久久伊人精品中文字幕有码_强奸国产无码激情

云原生干貨 | 如何使用Docker構(gòu)建多平臺(tái)鏡像?

2023-06-27

893

如何構(gòu)建多平臺(tái)鏡像?


如果你還不了解什么是多平臺(tái)構(gòu)建,請(qǐng)先閱讀一下Docker構(gòu)建多平臺(tái)鏡像的文檔:https://docs.docker.com/build/building/multi-platform/


官方文檔里給出了3種多平臺(tái)鏡像的構(gòu)建方式,本文推薦使用第3種方式,即Dockerfile多平臺(tái)構(gòu)建的方式。采用這種方式的好處是不用針對(duì)每種平臺(tái)準(zhǔn)備一份Dockerfile,只需要調(diào)整構(gòu)建鏡像的參數(shù)就能同時(shí)支持多平臺(tái)構(gòu)建。


工作原理


要讓Docker支持多平臺(tái)構(gòu)建,需要滿足以下幾個(gè)條件:


1、 Linux內(nèi)核開啟多處理器架構(gòu)支持;

2、構(gòu)建時(shí)使用基于"docker-container"驅(qū)動(dòng)的Buildx實(shí)例;

3、使用"docker buildx build"命令構(gòu)建鏡像;

4、構(gòu)建命令必須指定"–platform"參數(shù);

5、Dockerfile中,"FROM"指令必須設(shè)置"-platform=${TARGETPLATFORM}";


Docker構(gòu)建多平臺(tái)鏡像實(shí)際上是借助BuildKit來實(shí)現(xiàn)的,并且需要?jiǎng)?chuàng)建一個(gè)基于"docker-container"驅(qū)動(dòng)的Buildx實(shí)例。創(chuàng)建實(shí)例時(shí),Docker會(huì)創(chuàng)建一個(gè)容器作為虛擬節(jié)點(diǎn),用來執(zhí)行構(gòu)建,并存放構(gòu)建后產(chǎn)生的鏡像。


當(dāng)同時(shí)指定了"amd64"和"arm64"平臺(tái)構(gòu)建鏡像時(shí),BuildKit會(huì)分別啟動(dòng)兩個(gè)容器,一個(gè)容器構(gòu)建"amd64"架構(gòu)的鏡像,另一個(gè)容器構(gòu)建"arm64"架構(gòu)的鏡像。兩個(gè)容器的構(gòu)建過程相同,使用的Dockerfile內(nèi)容也相同。BuildKit構(gòu)建完兩個(gè)鏡像后,會(huì)創(chuàng)建一個(gè)Manifest List對(duì)象,然后把"amd64"和"arm64"的鏡像記錄到manifest中,接著用構(gòu)建時(shí)的"-–tag"參數(shù)作為manifest的名稱。如果把"--tag"指定的鏡像名推送到Registry,BuildKit會(huì)將Manifest對(duì)象、兩個(gè)架構(gòu)的鏡像都推到Registry。


需要注意,BuildKit創(chuàng)建的鏡像和Manifest都僅存在于Buildx實(shí)例中,在宿主機(jī)上是看不到這些鏡像的。


準(zhǔn)備構(gòu)建環(huán)境


構(gòu)建多平臺(tái)鏡像最難處理的地方在于準(zhǔn)備構(gòu)建環(huán)境。


· 開啟Linux內(nèi)核對(duì)多處理器架構(gòu)的支持


Docker的官方文檔已經(jīng)給出具體方案,只需要執(zhí)行以下命令即可。但前提是Linux內(nèi)核版本必須>=4.8,如果不滿足條件,升級(jí)內(nèi)核的操作可自行谷歌。


命令行

docker run --privileged --rm tonistiigi/binfmt --install all


執(zhí)行完成后,可以執(zhí)行以下命令進(jìn)行檢查

docker buildx ls


“平臺(tái)”中出現(xiàn)"linux/arm64"字樣即表示開啟成功,輸出內(nèi)容如下:

NAME/NODE    DRIVER/ENDPOINT             STATUS  BUILDKIT PLATFORMS

default      docker

default    default                     running v0.11.6  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6


· 創(chuàng)建使用"docker-container"驅(qū)動(dòng)的Buildx實(shí)例


Docker的官方文檔已給出具體方案,只需要執(zhí)行以下命令即可。


命令行

docker buildx create --name mybuilder --driver docker-container --use


執(zhí)行完成后,可以使用以下命令進(jìn)行檢查

docker buildx ls


輸出內(nèi)容如下

NAME/NODE    DRIVER/ENDPOINT             STATUS  BUILDKIT PLATFORMS

mybuilder *  docker-container

mybuilder0 unix:///var/run/docker.sock running v0.11.6  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6

default      docker

default    default                     running v0.11.6  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6


調(diào)整Dockerfile


Dockerfile只需要加上"–platform=${TARGETPLATFORM}"參數(shù),示例:

Dockerfile

FROM --platform=${TARGETPLATFORM} ubuntu:20.04



調(diào)整構(gòu)建命令


多平臺(tái)構(gòu)建時(shí),不能直接使用"docker build"命令,而是使用"docker buildx build"命令。


這是因?yàn)?docker build"每次僅支持構(gòu)建單一平臺(tái)的鏡像,而"docker buildx build"才支持單命令同時(shí)構(gòu)建多平臺(tái)鏡像。


完整的構(gòu)建命令如下:

docker buildx build

--platform linux/amd64,linux/arm64

--tag "鏡像名稱"


如需構(gòu)建完成后自動(dòng)推送鏡像,可以增加"–push"參數(shù):

docker buildx build

--platform linux/amd64,linux/arm64

--push

--tag "鏡像名稱"


在不同鏡像倉(cāng)庫(kù)之間傳輸鏡像


命令行

skopeo copy --all docker://源鏡像名 docker://目標(biāo)鏡像名


完成以上步驟,就可以使用Docker構(gòu)建多平臺(tái)鏡像啦!






更多云原生干貨文章,請(qǐng)點(diǎn)擊查閱>>


技術(shù)交流
我們建立了多個(gè)云原生技術(shù)交流群,其中有來自O(shè)racle、Citrix、華為、騰訊等國(guó)內(nèi)外云計(jì)算專家,立即掃碼,拉你進(jìn)群。目前已有2000+開發(fā)者加入我們......
云原生廠商 云原生技術(shù)服務(wù)商
在云原生時(shí)代,kaiyun開云創(chuàng)新致力于通過賦能開發(fā)者,實(shí)現(xiàn)企業(yè)快速迭代與交付,大幅提升創(chuàng)新效率。
產(chǎn)品下載