云原生集成開發環境——TitanIDE
通過網頁在任何地方更安全、更高效地編碼2023-06-27
893
如何構建多平臺鏡像?
如果你還不了解什么是多平臺構建,請先閱讀一下Docker構建多平臺鏡像的文檔:https://docs.docker.com/build/building/multi-platform/
官方文檔里給出了3種多平臺鏡像的構建方式,本文推薦使用第3種方式,即Dockerfile多平臺構建的方式。采用這種方式的好處是不用針對每種平臺準備一份Dockerfile,只需要調整構建鏡像的參數就能同時支持多平臺構建。
工作原理
要讓Docker支持多平臺構建,需要滿足以下幾個條件:
1、 Linux內核開啟多處理器架構支持;
2、構建時使用基于"docker-container"驅動的Buildx實例;
3、使用"docker buildx build"命令構建鏡像;
4、構建命令必須指定"–platform"參數;
5、Dockerfile中,"FROM"指令必須設置"-platform=${TARGETPLATFORM}";
Docker構建多平臺鏡像實際上是借助BuildKit來實現的,并且需要創建一個基于"docker-container"驅動的Buildx實例。創建實例時,Docker會創建一個容器作為虛擬節點,用來執行構建,并存放構建后產生的鏡像。
當同時指定了"amd64"和"arm64"平臺構建鏡像時,BuildKit會分別啟動兩個容器,一個容器構建"amd64"架構的鏡像,另一個容器構建"arm64"架構的鏡像。兩個容器的構建過程相同,使用的Dockerfile內容也相同。BuildKit構建完兩個鏡像后,會創建一個Manifest List對象,然后把"amd64"和"arm64"的鏡像記錄到manifest中,接著用構建時的"-–tag"參數作為manifest的名稱。如果把"--tag"指定的鏡像名推送到Registry,BuildKit會將Manifest對象、兩個架構的鏡像都推到Registry。
需要注意,BuildKit創建的鏡像和Manifest都僅存在于Buildx實例中,在宿主機上是看不到這些鏡像的。
準備構建環境
構建多平臺鏡像最難處理的地方在于準備構建環境。
· 開啟Linux內核對多處理器架構的支持
Docker的官方文檔已經給出具體方案,只需要執行以下命令即可。但前提是Linux內核版本必須>=4.8,如果不滿足條件,升級內核的操作可自行谷歌。
命令行
docker run --privileged --rm tonistiigi/binfmt --install all
執行完成后,可以執行以下命令進行檢查
docker buildx ls
“平臺”中出現"linux/arm64"字樣即表示開啟成功,輸出內容如下:
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
· 創建使用"docker-container"驅動的Buildx實例
Docker的官方文檔已給出具體方案,只需要執行以下命令即可。
命令行
docker buildx create --name mybuilder --driver docker-container --use
執行完成后,可以使用以下命令進行檢查
docker buildx ls
輸出內容如下
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
調整Dockerfile
Dockerfile只需要加上"–platform=${TARGETPLATFORM}"參數,示例:
Dockerfile
FROM --platform=${TARGETPLATFORM} ubuntu:20.04
調整構建命令
多平臺構建時,不能直接使用"docker build"命令,而是使用"docker buildx build"命令。
這是因為"docker build"每次僅支持構建單一平臺的鏡像,而"docker buildx build"才支持單命令同時構建多平臺鏡像。
完整的構建命令如下:
docker buildx build
--platform linux/amd64,linux/arm64
--tag "鏡像名稱"
如需構建完成后自動推送鏡像,可以增加"–push"參數:
docker buildx build
--platform linux/amd64,linux/arm64
--push
--tag "鏡像名稱"
在不同鏡像倉庫之間傳輸鏡像
命令行
skopeo copy --all docker://源鏡像名 docker://目標鏡像名
完成以上步驟,就可以使用Docker構建多平臺鏡像啦!
更多云原生干貨文章,請點擊查閱>>