使用 docker buildx 構建多 CPU 架構鏡像

使用 docker buildx 構建多 CPU 架構鏡像

引言
在工作中,遇到了需要將應用程序打包成 Docker 鏡像並同時運行在不同的 CPU 架構(X86 和 ARM)的環境中。

ARM 架構與 X86 相比,ARM 低功耗、移動市場佔比高,X86 高性能、服務器市場佔比高。

不同的 CPU 架構,對於運行相同的應用程序的 Docker 容器,需要分別在相應的 CPU 架構下編譯的 Docker 鏡像。
要構建多架構鏡像,首先想到的是每種 CPU 架構環境(物理環境或虛擬環境)下構建相應的鏡像。
但目前 docker 構建環境是 X86 的,沒有 ARM 環境,
或者要申請 ARM 物理機,或者要申請/創建 ARM 虛擬機,或者交叉編輯等等,聽上去都比較麻煩。

經過研究,發現 docker buildx 支持構建多架構鏡像,這使得構建多架構鏡像變得簡單。
這樣就可以在 X86 架構下構建 ARM 架構的鏡像。

接下來,開始實踐之旅吧。

環境
Docker Desktop(Mac)
Docker Engine 19.03+

實踐步驟
第一步,開啓 docker buildx
docker buildx 目前還是試驗功能,默認沒有開啓,需要在 Docker Desktop 的首選項中開啓它

Docker —>Preferences —>Command Line —> Enable experimental features

執行 docker buildx 命令,輸出截圖如下:

第二步,構建多架構鏡像,並推送到 Docker Hub
寫個簡單的 Dockerfile,僅做演示:

echo "FROM python:3.7-alpine”>Dockerfile

列出 builder:

$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMS
default * docker
  default default         running linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
我們當前使用的是默認的 builder,它基本上是舊的 builder。
讓我們創建一個新的 builder,它使我們能夠訪問一些新的多架構結構功能。

創建 builder:

$ docker buildx create --use --name mybuilder
mybuilder
查看 builder:

$ docker buildx inspect --bootstrap
[+] Building 18.8s (1/1) FINISHED
=> [internal] booting buildkit                                                                                                                                                                       18.8s
=> => pulling image moby/buildkit:buildx-stable-1                                                                                                                                                    18.0s
=> => creating container buildx_buildkit_mybuilder0                                                                                                                                                   0.7s
Name:   mybuilder
Driver: docker-container

Nodes:
Name:      mybuilder0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
構建多架構鏡像,並推送到 Docker Hub:

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t donhui/multiarch --push .
該 --platform 標誌指示 buildx 要爲 Intel 64位、Arm 32位和 Arm 64位架構生成 Linux 鏡像。
該 --push 標誌生成一個多架構清單,並將所有鏡像推送到 Docker Hub。

在 DockerHub 查看該鏡像,latest tag 下有三個鏡像,當在不同的架構 pull 該 tag 時會根據其環境 pull 相應架構的鏡像:

思考與總結
實踐中不斷產生疑問,不斷思考,不斷求解,或許你也會有同樣的問題:

1、多架構鏡像對 docker 版本有何要求?

構建時要用到 docker buildx 命令,docker 版本需要 19.03+;

運行時 docker 版本不一定需要 19.03+,筆者使用 1.13.1 和 18.06.1 都可以 pull 多架構鏡像的。

2、所有 Dockerfile 都可以構建成多架構嗎?還是有什麼要求?

對 Dockerfile 沒有要求,任何 Dockerfile 無需修改。

3、鏡像構建後默認保存在構建緩存中,如何將鏡像保存在本地?

可以將 type 指定爲 docker,但必須分別爲不同的 CPU 架構構建不同的鏡像,不能合併成一個鏡像,如:

docker buildx build -t donghui/multiarch-armv7 --platform=linux/arm/v7 -o type=docker .
docker buildx build -t donghui/multiarch-arm64 --platform=linux/arm64 -o type=docker .
docker buildx build -t donghui/multiarch-amd64 --platform=linux/amd64 -o type=docker .
也可以將鏡像 push 到鏡像倉庫後,再進行 pull。

4、只支持推送到 Docker Hub 嗎?如果要推送到私有鏡像倉庫,對私有鏡像倉庫有什麼要求?

也可以將鏡像推送到私有鏡像倉庫,但需要該鏡像倉庫支持多架構鏡像的功能。

如果要將多架構鏡像推送到 Harbor,需要 Harbor 的版本爲 v2.0.0。

Harbor v2.0.0 於 2020/05/13 發佈,Harbor v2.0.0 完全支持多架構鏡像。

Harbor v2.0.0 更新日誌:https://github.com/goharbor/harbor/releases/tag/v2.0.0

參考
Container 愛上ARM

https://www.jianshu.com/p/64f0da7a044d

跨平臺構建 Docker 鏡像新姿勢,x86、arm 一把梭

https://blog.csdn.net/alex_yangchuansheng/article/details/103146303

Getting started with Docker for Arm on Linux

https://engineering.docker.com/2019/06/getting-started-with-docker-for-arm-on-linux/

Multi-arch build and images, the simple way

https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/

Building multi-platform images

https://github.com/docker/buildx#building-multi-platform-images

Building Multi-Arch Images for Arm and x86 with Docker Desktop

https://www.docker.com/blog/multi-arch-images/

原文地址https://my.oschina.net/donhui/blog/4283243

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章