1.實現方式
? ? ? 想在 x86_64/amd64 的一臺機器平臺上,構建適用于多個平臺的鏡像,例如 linux/amd64、linux/arm64,根據官方文檔,有三種方法可以使用:
QEMU
??使用 QEMU 模擬構建多平臺映像是最簡單的入門方法,但可能比本機構建慢得多,特別是對于編譯、壓縮或解壓縮等計算量大的任務。因此如果條件允許的話,更推薦使用 Cross-compilation(交叉編譯)。
Multiple native nodes
??使用多個本機節點可以為 QEMU 無法處理的更復雜的情況提供更好的支持,并且通常具有更好的性能。
Cross-compilation
??交叉編譯使多平臺構建速度更快、用途更廣泛,但必須要有相對應的編譯器。
?
注意:QEMU 使用起來最簡單,所以我們在x86_64平臺上構建arm64鏡像并運行容器時使用這種方式。
2.QEMU方式實現
如果是Docker Desktop ,可能已經預配置了 binfmt_misc 對其他平臺的支持, 但對于其他版本 Docker, 你可能需要使用 tonistiigi/binfmt 鏡像啟動一個特權容器來進行支持,如果您的節點已經支持 QEMU(例如,如果您正在使用 Docker Desktop),QEMU 是最簡單的入門方式。它不需要更改您的 Dockerfile,BuildKit 會自動檢測可用的輔助架構。當 BuildKit 需要運行不同架構的二進制文件時,它會自動通過binfmt_misc
?處理程序中注冊的二進制文件加載它:
docker run --privileged --rm tonistiigi/binfmt --install all
使用docker buildx ls查看,如下已經支持:?
docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default * dockerdefault default running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
desktop-linux dockerdesktop-linux desktop-linux running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
當然這里有一個比較重要的一點:
binfmt_misc
為了使在主機操作系統上注冊的 QEMU 二進制文件能夠在容器內透明地工作,必須使用fix_binary
?標志進行注冊。這需要內核 >= 4.8 和 binfmt-support >= 2.1.7。您可以通過檢查F
中的標志 是否正確來檢查注冊是否正確/proc/sys/fs/binfmt_misc/qemu-*
。雖然 Docker Desktop 預先配置了binfmt_misc
對其他平臺的支持,但對于其他安裝,可能需要使用映像進行安裝tonistiigi/binfmt?。
?3.builder的使用
可以使用默認的builder,也可以創建builder,默認的就是上邊docker buildx ls中看到的,可以這樣創建builder:
docker buildx create --name mybuilder
啟動builder:
docker buildx inspect --bootstrap mybuilder
?4.構建不同平臺鏡像
如下構建多平臺鏡像就可以
docker buildx build --platform linux/arm64,linux/amd64 -t test/aa:v1 .