簡單幾招助您加速 ARM 容器應用開發和測試流程

隨着5G時代的臨近,低延遲網絡、AI硬件算力提高、和智能化應用快速發展,一個萬物智聯的時代必將到來。咱們須要將智能決策、實時處理能力從雲延展到邊緣和IoT設備端。阿里雲容器服務推出了邊緣容器,支持雲-邊-端應用一體協同。在IoT和邊緣計算場景,咱們不但須要支持X86芯片也要提供對ARM架構芯片的支持。此外隨着國產ARM CPU的快速發展,也須要咱們在產品測提供ARM版本的容器產品支持。本文將介紹一些簡單的技術來加速 ARM 容器應用的開發和測試流程。python

X86環境構建ARM架構Docker鏡像

今年4月24日,Docker公司與ARM公司宣佈合做夥伴計劃,爲Docker的工具優化面向ARM平臺的開發者體驗。Docker開發者能夠在x86桌面端爲ARM設備構建容器鏡像,並可將容器應用部署至雲端、邊緣以及物聯網設備。整個容器構建流程很是簡單,無需任何交叉編譯步驟。linux

Docker Desktop 是 macOS 和 Windows平臺的容器開發環境。Docker會藉助宿主機操做系統的虛擬化技術,如Windows的Hyper-V和 macOS的HyperKit,來運行Docker開發環境。在最新的Docker版本中,LinuxKit做爲面向容器的操做系統,增長了QEMU模擬器,能夠支持ARM架構CPU。如今能夠支持 arm/v6, arm/v7 和 arm64 架構應用。架構圖以下:git

首先安裝最新edge版本的 Docker Desktop,Docker Engine版本須要大於 19.03。github

在Docker Desktop中,選擇 "Preference..." > "Command Line" > "Enable experimental features" 開啓實驗特性。docker

Docker新增長了 docker buildx 命令npm

$ 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的狀態bootstrap

$ 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架構

自從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查看鏡像信息

在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

登陸到樹莓派(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

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。意外不意外?驚不驚喜?:-)

總結

利用容器、操做系統和虛擬化技術,咱們能夠輕鬆在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/ 

 

本文做者:易立

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索