使用dockerbuildx构建多cpu架构镜像(代码片段)

woshidanzi woshidanzi     2023-03-17     556

关键词:

在工作中,遇到了需要将应用程序打包成 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”百事2注册:www.baihuayl7.cn >Dockerfile

列出 builder:

$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMS
default * docker
  default default         running linux/amd64, linux/arm64, linux/ppc64le,www.baishenjzc.cn linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

我们当前使用的是默认的 builder,它基本上是旧的 builder。
让我们创建一个新的 builder,它使我们能够访问一些新的多架构结构功能。

创建 builder:

$ docker buildx create www.jintianxuesha.com--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: /www.lanboyulezc.cn //var/run/docker.sock
Status:    running
Platforms: linux/amd64, www.yixingylzc.cn linux/arm64, linux/ppc64le, www.dafengyulept.com 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,但必须分别为不同的 恒煊2注册:www.hengxuangyul.com   架构构建不同的镜像,不能合并成一个镜像,如:

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

http://www.jintianxuesha.com/?id=605

Building multi-platform images   www.sdcqmm.cn

www.0371xzrmyy.com

https://www.shbkrcxzz.cn /?id=605 /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/

docker镜像多架构构建

...有对应架构的机器用来构建怎么办?目前最新的办法就是使用buildx来进行构建,不过这个特性目前默认是没启用的,需要在docker的配置文件中添加"experi 查看详情

Docker - 无法使用 docker buildx 构建多平台映像

】Docker-无法使用dockerbuildx构建多平台映像【英文标题】:Docker-Cannotbuildmulti-platformimageswithdockerbuildx【发布时间】:2020-05-2115:09:14【问题描述】:我正在尝试使用dockerbuildx构建多平台(amd64、arm64和armv7)映像。由于我使用的是运... 查看详情

docker开启buildx多cpu架构镜像制作(代码片段)

...1a;buildx推送镜像时,不会走主机的hosts文件,默认使用https协议关于QEMUQEMU可以模拟一个完整的操作系统(开销较大)。QEMU还有一种用户态模式,基于binfmt_misc模拟目标硬件的用户空间,该模式可以创建轻量... 查看详情

docker镜像多架构构建(代码片段)

...应架构的机器用来构建怎么办?目前最新的办法就是使用buildx来进行构建,不过这个特性目前默认是没启用的,需要在docker的配置文件中添加“experimental”:true后重启docker服务生效。首先执行下面的命令让amd64的机器... 查看详情

docker入门之多架构支持(代码片段)

...开始为Arm构建。Docker引入了一个CLI命令,称为buildx.可以使用buildx构建多架构映像Buildx通过添加基于BuildKit的新构建器实例运行非本地二进制文件来实现这一点。3.使用查看所有构建器:dockerbuildxlsNAME/NODEDRIVER/ENDPOINTSTATUSPLATFORMSdeskt... 查看详情

使用docker开发-使用多阶段构建镜像(代码片段)

...要的工件。要编写一个真正高效的Dockerfile,传统上需要使用sh 查看详情

docker如何构建多架构(arm64,x86_64,armv7)容器镜像?(代码片段)

1.更新docker的版本到大于或等于19.031.1x86下如何更新docker?$sudoaptinstall-yapt-transport-https$curl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudoapt-keyadd-$sudoadd-apt-repository"deb[arch=amd64]https:// 查看详情

如何保存/同步多架构容器docker镜像(代码片段)

...08;或旧的Intel芯片苹果电脑);Edge:数据中心使用x86服务器,边缘Edge端使用低功耗的arm边缘设备(如树莓派等)。容器云原生技术在这方面支持的是很好,但是实际使用中细节会有一些问题,举一... 查看详情

谈谈docker镜像多阶段构建(代码片段)

...多阶段构建【方案三】总结其他操作停在特定的构建阶段使用外部镜像作为stage导读通常情况下,构建镜像通常会采用两种方式:将全部组件及其依赖库的编译、测试、打包等流程封装进一个Docker镜像中。采用这种方式往... 查看详情

#谈谈docker镜像多阶段构建(代码片段)

...多阶段构建【方案三】总结其他操作停在特定的构建阶段使用外部镜像作为stage导读通常情况下,构建镜像通常会采用两种方式:将全部组件及其依赖库的编译、测试、打包等流程封装进一个Docker镜像中。采用这种方式往... 查看详情

容器指南之容器架构及常用指令

...存储和发布镜像。 1.1.底层技术cgroups,负责管理容器使用的资源(例如 CPU 查看详情

在 OS X 上构建多架构 OpenSSL

...便我将它为两种架构构建到同一个.a文件中?您必须小心使用OpenSSL和多架构库,因为该库不是 查看详情

制作forarm64cpu架构的docker镜像(代码片段)

...错误(“execformaterror”)。究其原因,是用于构建docker容器的实例是forx86架构的。arm与x86是CPU的两个不同体系。简而言之,x86是cisc,复杂指令集,尽量依靠硬件来实现计算机指令;而arm是risc,精简... 查看详情

云原生之docker实战使用dockerfile构建docker镜像(代码片段)

【云原生之Docker学习】使用Dockerfile构建docker镜像一、Docker镜像的分层架构1.镜像的分层示意图2.镜像的组成①.unionfilesystem②.镜像层——bootfs③.镜像层——rootfs④.镜像层——依赖环境⑤.容器层3.镜像的分层图示二、镜像与容器的... 查看详情

万字长文:彻底搞懂容器镜像构建(代码片段)

...对Docker有个大概的认识,它整体上是个C/S架构;我们平时使用的docker命令就是它的CLI客户端,而它的服务端是dockerd在Linux系统中,通常我们是使用systemd进行管理,所以我们可以使用systemctlstartdocker来启动服务。(但是请注意,doc... 查看详情

docker在m1macarm64架构上构建amd64镜像。(代码片段)

...ecture"Architecture":"amd64",[root@one-01~]#构建arm64使用的DockerdileFROMopenjdk:8RUNaptinstalltzdata&&ln-sf/usr/share/zoneinfo/Asia/Shanghai/etc/localtimeARGNAMEARGFILE_URLENVAPP_NAME=$NAMEENVPROFILE=caENVPORT=8080ADD$FILE_URLap 查看详情

使用springcloud和docker构建微服务架构

如何使用SpringBoot、SpringCloud、Docker和Netflix的一些开源工具来构建一个微服务架构。本文通过使用SpringBoot、SpringCloud和Docker构建的概念型应用示例,提供了了解常见的微服务架构模式的起点。该代码可以在Github上获得,并且在Docke... 查看详情

Android Studio 中具有 cpu 架构的多个构建变体

】AndroidStudio中具有cpu架构的多个构建变体【英文标题】:MultiplebuildvariantswithcpuarchitecturesinAndroidStudio【发布时间】:2019-10-1220:48:50【问题描述】:我正在AndroidStudio中设置ProductFlavor,在工作室中创建了多个构建变体喜欢FlavourDebug1... 查看详情