開發與維運

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

1.png
鏡像下載、域名解析、時間同步請點擊 阿里巴巴開源鏡像站

一、概述

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

不同的 CPU 架構,對於運行相同的應用程序的 Docker 容器,需要分別在相應的 CPU 架構下編譯的 Docker 鏡像。

傳統的構建多架構鏡像的方法又比較麻煩,所以接下來將為大家介紹如何使用 docker buildx 構建多架構鏡像。通過在 X86 架構下構建 ARM 架構的鏡像的方式,使得構建多架構鏡像變得更簡單。

二、環境

  • Docker Desktop(Mac)
  • Docker Engine 19.03+

2.png

三、操作步驟

1. 開啟 docker buildx

docker buildx 目前還是試驗功能,默認沒有開啟,需要在 Docker Desktop 的首選項中開啟它
Docker —>Preferences —>Command Line —> Enable experimental features
3.png
執行 docker buildx 命令,輸出截圖如下:
4.png

2. 構建多架構鏡像,並推送到 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。
5.png
在 DockerHub 查看該鏡像,latest tag 下有三個鏡像,當在不同的架構 pull 該 tag 時會根據其環境 pull 相應架構的鏡像:
6.png

四、思考與總結

實踐中不斷產生疑問,不斷思考,不斷求解,或許你也會有同樣的問題:
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

原文鏈接

阿里巴巴開源鏡像站 提供全面,高效和穩定的鏡像下載服務。釘釘搜索 ' 21746399 ‘ 加入鏡像站官方用戶交流群。”

Leave a Reply

Your email address will not be published. Required fields are marked *