简单几招助您加速 ARM 容器应用开发和测试流程

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 阿里云容器服务推出了边缘容器,支持云-边-端应用一体协同。本文将介绍一些简单的技术在X86环境来构建和测试ARM 容器应用,无需交叉编译,无需修改镜像。

1564464971872-dc1e87ce-8edd-4e7f-8285-ee7734d90065.png

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

X86环境构建ARM架构Docker镜像

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

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

image.png

首先安装最新edge版本的 Docker Desktop,Docker Engine版本需要大于 19.03。

image.png

在Docker Desktop中,选择 "Preference..." > "Command Line" > "Enable experimental features" 开启实验特性。

image.png

Docker新增加了 docker buildx 命令

$ docker buildx --help

Usage:  docker buildx COMMAND

Build with BuildKit

Management Commands:
  imagetools  Commands to work on images in registry

Commands:
  bake        Build from a file
  build       Start a build
  create      Create a new builder instance
  inspect     Inspect current builder instance
  ls          List builder instances
  rm          Remove a builder instance
  stop        Stop builder instance
  use         Set the current builder instance
  version     Show buildx version information

Run 'docker buildx COMMAND --help' for more information on a command.

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

$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMS
default * docker
  default default         running linux/amd64, linux/arm64, linux/arm/v7, linux/arm/v6

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

$ docker buildx create --name mybuilder
mybuilder
$ docker buildx use mybuilder
$ docker buildx inspect --bootstrap
[+] Building 20.2s (1/1) FINISHED
 => [internal] booting buildkit                                           20.2s
 => => pulling image moby/buildkit:master                                 19.6s
 => => creating container buildx_buildkit_mybuilder0                       0.6s
Name:   mybuilder
Driver: docker-container
Nodes:
Name:      mybuilder0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/amd64, linux/arm64, linux/arm/v7, linux/arm/v6

从Github获取测试应用

$ git clone https://github.com/adamparco/helloworld
$ cd helloworld

Docker Hub创建一个测试Repository

image.png

自从Docker registry v2.3和Docker 1.10开始,Docker通过支持新的image Media 类型 manifest list 实现了Multi-architecture Docker镜像功能,支持在一个镜像中同时包含多种CPU体系架构的镜像层。

为测试应用构建多CPU体系架构镜像,包含x86, ARM 64和ARM v7支持,并推送到 Docker Hub

$ docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t denverdino/multiarch --push .
  .
[+] Building 26.1s (31/31) FINISHED
...
 => [linux/arm64 internal] load metadata for docker.io/library/python:3.7-alpine                                                                                                                                                         2.9s
 => [linux/arm/v7 internal] load metadata for docker.io/library/python:3.7-alpine                                                                                                                                                        3.2s
 => [linux/amd64 internal] load metadata for docker.io/library/python:3.7-alpine                                                                                                                                                         2.9s
...
 => exporting to image                                                                                                                                                                                                                  22.8s
 => => exporting layers                                                                                                                                                                                                                  1.0s
 => => exporting manifest sha256:f8739d2eb9f1b043e5d44e962c79d353261a257ffa6c8332b762b5d811d54c1a                                                                                                                                        0.0s
 => => exporting config sha256:528fc30a95957bf3c6c1bb4ea77793a2a484c0c5b87f3efad6bbc9dbc2df6a90                                                                                                                                          0.0s
 => => exporting manifest sha256:b52df7ab39acbe3ebb8b5d9e6a8069b9c916f1811b81aa84dd3b9dd9b4304536                                                                                                                                        0.0s
 => => exporting config sha256:9712542f20d1dd16c7332f664432a1b37c6254fefe7d4cb7806b74997467da07                                                                                                                                          0.0s
 => => exporting manifest sha256:698969718e9a316003a7fb4c2fe26216c95672e3e92372d25b01a6db5295e9e7                                                                                                                                        0.0s
 => => exporting config sha256:f636eaa8cec74fa574f99318cddd01b37a9e7c21708f94e11ae6575b34ca18f7                                                                                                                                          0.0s
 => => exporting manifest list sha256:3da22eea857f889ade3c85a2d41ed17db727385f78096e3dcf74ae039f164281                                                                                                                                   0.0s
 => => pushing layers                                                                                                                                                                                                                   18.3s
 => => pushing manifest for docker.io/denverdino/multiarch:latest

我们可以在Docker Hub查看镜像信息

image.png

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

$ docker run -p5000:5000 denverdino/multiarch
 * Serving Flask app "hello" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

访问 http://0.0.0.0:5000/ 可以看到当前CPU架构为 x86_64

image.png

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

pi@raspberrypi:~ $ docker run -p5000:5000 denverdino/multiarch
* Serving Flask app "hello" (lazy loading)
* Environment: production
  WARNING: Do not use the development server in a production environment.
  Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

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

image.png

X86环境执行ARM架构Docker镜像

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

docker buildx build --platform linux/arm/v7 -t denverdino/multiarch:armv7 --push .
[+] Building 67.9s (13/13) FINISHED
...
 => => pushing layers                                                                                                                                                                                                                    8.5s
 => => pushing manifest for docker.io/denverdino/multiarch:armv7

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

$ docker run --rm --privileged npmccallum/qemu-register

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

$ docker run -p5000:5000 denverdino/multiarch:armv7
 * Serving Flask app "hello" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

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

image.png

总结

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

参考

https://engineering.docker.com/2019/04/multi-arch-images/

http://collabnix.com/building-arm-based-docker-images-on-docker-desktop-made-possible-using-buildx/

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
弹性计算 监控 测试技术
弹性计算的测试流程
弹性计算的测试流程
31 0
|
2月前
|
运维 Kubernetes 测试技术
容器技术:优化软件测试流程的利器
本文介绍了容器技术的概念、优势和历史发展,对比了容器与虚拟机的区别,并提及了Docker和Kubernetes等常见容器技术。容器作为轻量级虚拟化工具,提供高效、灵活的应用部署方式,广泛应用于软件开发、云计算和微服务架构。随着技术演进,容器将在边缘计算、人工智能等领域发挥更大作用,推动行业变革。
36 3
|
2月前
|
安全 测试技术 网络架构
【专栏】编写网络设备割接方案的七个步骤,包括明确割接目标、收集信息、制定计划、设计流程、风险评估、准备测试环境和编写文档。
【4月更文挑战第28天】本文介绍了编写网络设备割接方案的七个步骤,包括明确割接目标、收集信息、制定计划、设计流程、风险评估、准备测试环境和编写文档。通过实际案例分析,展示了如何成功完成割接,确保业务连续性和稳定性。遵循这些步骤,可提高割接成功率,为公司的网络性能和安全提供保障。
|
2月前
|
安全 测试技术 网络安全
API渗透测试的基本流程及关键点
【5月更文挑战第26天】API渗透测试类似Web应用渗透测试,涉及资产分析和模拟攻击,以发现安全缺陷。
|
1月前
|
测试技术
软件测试项目式学习三(软件测试原则与基本流程与实际测试用例)
软件测试项目式学习三(软件测试原则与基本流程与实际测试用例)
23 0
|
2月前
|
安全 数据管理 测试技术
网络安全与信息安全:防范漏洞、加强加密与提升安全意识深入探索自动化测试框架的设计原则与实践应用化测试解决方案。文章不仅涵盖了框架选择的标准,还详细阐述了如何根据项目需求定制测试流程,以及如何利用持续集成工具实现测试的自动触发和结果反馈。最后,文中还将讨论测试数据管理、测试用例优化及团队协作等关键问题,为读者提供全面的自动化测试框架设计与实施指南。
【5月更文挑战第27天】 在数字化时代,网络安全与信息安全已成为维护国家安全、企业利益和个人隐私的重要环节。本文旨在分享关于网络安全漏洞的识别与防范、加密技术的应用以及提升安全意识的重要性。通过对这些方面的深入探讨,我们希望能为读者提供一些实用的建议和策略,以应对日益严峻的网络安全挑战。 【5月更文挑战第27天】 在软件开发周期中,自动化测试作为保障软件质量的关键步骤,其重要性日益凸显。本文旨在剖析自动化测试框架设计的核心原则,并结合具体案例探讨其在实际应用中的执行策略。通过对比分析不同测试框架的优缺点,我们提出一套高效、可扩展且易于维护的自动
|
2月前
|
移动开发 前端开发
基于若依的ruoyi-nbcio流程管理系统一种简单的动态表单模拟测试实现(五)
基于若依的ruoyi-nbcio流程管理系统一种简单的动态表单模拟测试实现(五)
20 0
|
2月前
|
中间件 Linux API
容器改造传统应用的流程
【5月更文挑战第1天】如何评估和执行将传统应用进行Docker化改造的过程。
|
2月前
|
人工智能 监控 数据处理
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】1. 快速上手数据集与测试评估过程
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】1. 快速上手数据集与测试评估过程
70 0
|
2月前
|
存储 编译器 Linux
完全理解ARM启动流程:Uboot-Kernel
完全理解ARM启动流程:Uboot-Kernel
121 0