您现在的位置是:首页 > 科技前沿

几招帮您加速 ARM 容器应用的开发和测试流程

智慧创新站 2025-05-18【科技前沿】297人已围观

简介随着5G时代的临近,低延迟网络、AI硬件算力提升、和智能化应用快速发展,一个万物智联的时代必将到来。我们需要将智能决策、实时处理能力从云延展到边缘和IoT设备端。阿里云容器服务推出了边缘容器,支持云-边-端应用一体协同。在IoT和边缘计算场景,我们不但需要支持X86芯片也要提供对ARM架构芯片的支持...

随着5G时代的临近,低延迟网络、AI硬件算力提升、和智能化应用快速发展,一个万物智联的时代必将到来。我们需要将智能决策、实时处理能力从云延展到边缘和IoT设备端。阿里云容器服务推出了边缘容器,支持云-边-端应用一体协同。在IoT和边缘计算场景,我们不但需要支持X86芯片也要提供对ARM架构芯片的支持。此外随着国产ARMCPU的快速发展,也需要我们在产品测提供ARM版本的容器产品支持。本文将介绍一些简单的技术来加速ARM容器应用的开发和测试流程。

X86环境构建ARM架构Docker镜像

今年4月24日,Docker公司与ARM公司宣布合作伙伴计划,为Docker的工具优化面向ARM平台的开发者体验。Docker开发者可以在x86桌面端为ARM设备构建容器镜像,并可将容器应用部署至云端、边缘以及物联网设备。整个容器构建流程非常简单,无需任何交叉编译步骤。

DockerDesktop是macOS和Windows平台的容器开发环境。Docker会借助宿主机操作系统的虚拟化技术,如Windows的Hyper-V和macOS的HyperKit,来运行Docker开发环境。在最新的Docker版本中,LinuxKit作为面向容器的操作系统,增加了QEMU模拟器,可以支持ARM架构CPU。现在可以支持arm/v6,arm/v7和arm64架构应用。架构图如下:

首先安装最新edge版本的DockerDesktop,DockerEngine版本需要大于19.03。

在DockerDesktop中,选择"Preference""CommandLine""Enableexperimentalfeatures"开启实验特性。

Docker新增加了dockerbuildx命令。

$dockerbuildx--helpUsage:dockerbuildxCOMMANDBuildwithBuildKitManagementCommands:imagetoolsCommandstoworkonimagesinregistryCommands:bakeBuildfromafilebuildStartabuildcreateCreateanewbuilderinstanceinspectInspectcurrentbuilderinstancelsListbuilderinstancesrmRemoveabuilderinstancestopStopbuilderinstanceuseSetthecurrentbuilderinstanceversionShowbuildxversioninformationRun'dockerbuildxCOMMAND--help'formoreinformationonacommand.

我们可以查看一下当前builder的状态

$dockerbuildxlsNAME/NODEDRIVER/ENDPOINTSTATUSPLATFORMSdefault*dockerdefaultdefaultrunninglinux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6

创建一个mybuilder实例,设置为默认构建器并激活ARM构建能力

$dockerbuildxcreate--namemybuildermybuilder$dockerbuildxusemybuilder$dockerbuildxinspect--bootstrap[+](1/1)FINISHED=[internal]==pullingimagemoby/buildkit:==creatingcontainerbuildx_buildkit_:mybuilderDriver:docker-containerNodes:Name:mybuilder0point:unix:///var/run/:runningPlatforms:linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6

从Github获取测试应用

$gitclone$cdhelloworld

在DockerHub创建一个测试Repository

自从和开始,Docker通过支持新的imageMedia类型manifestlist实现了Multi-architectureDocker镜像功能,支持在一个镜像中同时包含多种CPU体系架构的镜像层。

为测试应用构建多CPU体系架构镜像,包含x86,ARM64和ARMv7支持,并推送到DockerHub

$dockerbuildxbuild--platformlinux/amd64,linux/arm64,linux/arm/v7-tdenverdino/multiarch--push..[+](31/31)FINISHED=[linux/arm64internal]/library/python:3.7-=[linux/arm/v7internal]/library/python:3.7-=[linux/amd64internal]/library/python:3.7-=====exportingmanifestsha256:f8739==exportingconfigsha256:528==exportingmanifestsha256:b52==exportingconfigsha256:9712542==exportingmanifestsha256:698969718==exportingconfigsha256:f636==exportingmanifestlistsha256:3d====/denverdino/multiarch:latest

我们可以在DockerHub查看镜像信息

在Mac上面执行构建出来的镜像,

$dockerrun-p5000:5000denverdino/multiarch*ServingFlaskapp"hello"(lazyloading)*Environment:productionWARNING:*Debugmode:off*Runningon(PressCTRL+Ctoquit)

访问

登录到树莓派(Raspbian基于ARMv7),执行如下命令,运行同样的容器镜像

pi@raspberrypi:~$dockerrun-p5000:5000denverdino/multiarch*ServingFlaskapp"hello"(lazyloading)*Environment:productionWARNING:*Debugmode:off*Runningon(PressCTRL+Ctoquit)

打开浏览器访问raspberrypi:5000,可以看到当前CPU架构为armv7l

X86环境执行ARM架构Docker镜像

我们首先构建一个ARMv7版本的镜像

dockerbuildxbuild--platformlinux/arm/v7-tdenverdino/multiarch:armv7--push.[+](13/13)FINISHED====/denverdino/multiarch:armv7

Linux内核中binfmt_misc允许注册一个“解释器”,在运行可执行文件的时候调用自定义解释器。版本在binfmt_misc中增加了Fflag使内核可以在配置时加载解释器而非在运行时Lazyload,通过这个方法我们可以利用一个容器来注册和运行ARM指令集的解释器。

$dockerrun--rm--privilegednpmccallum/qemu-register

在Mac上运行如下命令,无需任何修改就可以启动一个ARM镜像

$dockerrun-p5000:5000denverdino/multiarch:armv7*ServingFlaskapp"hello"(lazyloading)*Environment:productionWARNING:*Debugmode:off*Runningon(PressCTRL+Ctoquit)

访问,可以看到当前CPU架构变成为armv7l。意外不意外?惊不惊喜?:-)

总结

利用容器、操作系统和虚拟化技术,我们可以轻松在X86平台构建和测试ARM应用,简化了多CPU体系架构应用的支持。

本文为云栖社区原创内容,未经允许不得转载。

很赞哦!(62)