鏡像下載、域名解析、時間同步請點擊 阿里巴巴開源鏡像站
一、概述
ARM 架構與 X86 相比,ARM 低功耗、移動市場佔比高,X86 高性能、服務器市場佔比高。
不同的 CPU 架構,對於運行相同的應用程序的 Docker 容器,需要分別在相應的 CPU 架構下編譯的 Docker 鏡像。
傳統的構建多架構鏡像的方法又比較麻煩,所以接下來將為大家介紹如何使用 docker buildx 構建多架構鏡像。通過在 X86 架構下構建 ARM 架構的鏡像的方式,使得構建多架構鏡像變得更簡單。
二、環境
- Docker Desktop(Mac)
- Docker Engine 19.03+
三、操作步驟
1. 開啟 docker buildx
docker buildx 目前還是試驗功能,默認沒有開啟,需要在 Docker Desktop 的首選項中開啟它
Docker —>Preferences —>Command Line —> Enable experimental features
執行 docker buildx 命令,輸出截圖如下:
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。
在 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
“ 阿里巴巴開源鏡像站 提供全面,高效和穩定的鏡像下載服務。釘釘搜索 ' 21746399 ‘ 加入鏡像站官方用戶交流群。”