云原生集成開發(fā)環(huán)境——TitanIDE
通過網(wǎng)頁在任何地方更安全、更高效地編碼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)擊查閱>>