温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Docker Desktop如何构建Multi-Arch的arm容器镜像

发布时间:2021-12-13 15:21:30 来源:亿速云 阅读:480 作者:iii 栏目:云计算

本篇内容介绍了“Docker Desktop如何构建Multi-Arch的arm容器镜像”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

为什么 Docker 这样做?

在November 2018,Amazon 宣布 EC2 A1 实例采用 AWS Graviton Processors,是一个 64-bit Arm Neoverse cores,由AWS进行设计。 A1 EC2实例经过性能优化、成本较低,相对于其它EC2实例节省成本达 45% 以上。通过 Docker Desktop 技术预览,Docker将能够更容易滴开发出容器,用于在 Arm 服务器和设备上运行。使用熟悉的 Docker 工具和处理过程,可以 build, push, pull, 以及运行镜像到不同的架构之中。不需要改变 Dockerfiles 和源码来构建 Arm上用的镜像版本。简单滴使用新的特征来 rebuild 镜像即可。终于,Docker可以快速地扩展到 Edge 和 IoT,这将是重要的一步。Docker一直关注开发者,想办法使事情变得简单。

是如何工作的?

Docker Desktop如何构建Multi-Arch的arm容器镜像

Docker Desktop在macOS 和Windows上可用,为用户打包和配置了很多东西是开发容器变得更为简单。 that make developing containers extremely easy.  Docker Desktop 带有hypervisors for the host OS。这个 hypervisor运行一个轻量级的 Linux kernel (LinuxKit),是 Docker Desktop的一部分。这一快速而且轻量的容器OS通过 QEMU emulator进行封装,并且通过 binfmt_misc 来运行任何架构下的二进制代码。Arm 提交了支持 Docker’s QEMU fork 并且帮助维护该项目。Docker Desktop将保持最新的 emulation 支持。上图可以看到 QEMU emulation 对 arm/v6, arm/v7 和arm64 Docker images的支持情况。

Docker Desktop Edge推出了一个新的 CLI 命令- buildx。 Buildx允许在本地 (and soon remotely) 构建multi-arch images,链接 manifest file,然后推送到 registry – 只需要一个命令。通过包含的 emulation,可以透明地构建不仅是是 native images!  Buildx 添加新的builder 实例(基于 BuildKit),然后让 Docker Desktops 技术栈可以运行 non-native 的二进制文件。

为啥叫buildx?  这是一个最初的名称,x 代表体验。未来新的 build features稳定下来的时候,将会去掉 x 整合到 docker build command。注意buildx实体性质的,features 和 flags 以后都会变化。

开始使用

如果还没有 Docker Desktop, start by downloading it。然后按照提示进行安装。安装完Docker Desktop后,将会看到 Docker icon 在任务栏,点击“ preferences”,然后切换到 edge 版本。.

Docker Desktop如何构建Multi-Arch的arm容器镜像

确认版本 2.0.4.0 (33772)+ ,通过打开 “About Docker Desktop”。

Docker Desktop如何构建Multi-Arch的arm容器镜像

应用实例

假设你对这个伟大的功能感兴趣,我们来看一些例子。列出所有的 builders:

~ ❯❯❯ docker buildx lsNAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMSdefault * docker  default default         running linux/amd64, linux/arm64, linux/arm/v7, linux/arm/v6

目前使用的是缺省的 builder, 基于老的 builder。我们来创建一个新的 builder,将给出访问多架构的能力:

~ ❯❯❯ docker buildx create --name mybuildermybuilder
~ ❯❯❯ docker buildx use mybuilder~ ❯❯❯ docker buildx inspect --bootstrap[+] Building 2.5s (1/1) FINISHED => [internal] booting buildkit                                                   2.5s => => pulling image moby/buildkit:master                                         1.3s => => creating container buildx_buildkit_mybuilder0                              1.2sName:   mybuilderDriver: docker-containerNodes:Name:      mybuilder0Endpoint:  unix:///var/run/docker.sockStatus:    runningPlatforms: linux/amd64, linux/arm64, linux/arm/v7, linux/arm/v6

这里创建了一个新的builder instance,命名为 mybuilder,切换过去,然后探查信息。

  • 注意 --bootstrap 不是必须要的,只是用于立即开始 container 。

下一步我们测试这个工作流程。确认我们能够 build、push和运行 multi-arch images。

创建一个简单的 Dockerfile,build 几个不同的镜像,然后推送到 Hub。

~ ❯❯❯ mkdir test && cd test && cat <<EOF > Dockerfile
FROM ubuntu
RUN apt-get update && apt-get install -y curl
WORKDIR /srcCOPY . .EOF
~/test ❯❯❯ docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t adamparco/demo:latest --push .[+] Building 6.9s (19/19) FINISHED... => => pushing layers                                                             2.7s => => pushing manifest for docker.io/adamparco/demo:latest                       2.2

工作起来了! 这个 --platform flag 告诉 buildx 创建Linux images的 Intel 64-bit、Arm 32-bit和Arm 64-bit architectures版本。 该 --push flag 创建一个 multi-arch manifest然后将其所有镜像推送到Docker Hub。使用 imagetools 来inspect 。 

~/test ❯❯❯ docker buildx imagetools inspect adamparco/demo:latest
Name:      docker.io/adamparco/demo:latest
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest:    sha256:2a2769e4a50db6ac4fa39cf7fb300fa26680aba6ae30f241bb3b6225858eab76

Manifests:
  Name:      docker.io/adamparco/demo:latest@sha256:8f77afbf7c1268aab1ee7f6ce169bb0d96b86f585587d259583a10d5cd56edca
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/amd64

  Name:      docker.io/adamparco/demo:latest@sha256:2b77acdfea5dc5baa489ffab2a0b4a387666d1d526490e31845eb64e3e73ed20
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/arm64

  Name:      docker.io/adamparco/demo:latest@sha256:723c22f366ae44e419d12706453a544ae92711ae52f510e226f6467d8228d191
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/arm/v7

该image现在 Docker Hub可用,其tag为 adamparco/demo:latest。可以运行 container在 Intel laptops、Amazon EC2 A1 instances、Raspberry Pis, 或其它。  Docker 拉取正确的与当前架构适应的镜像,比如Raspberry Pis 运行 32-bit Arm 版本而 EC2 A1 实例运行 64-bit Arm版本。

该SHA tags 标识一个完整的 image 变体,也可以在 Docker Desktop 运行不同的架构版本。我们使用 SHA tag来运行一个镜像,然后检查是否是我们期待的架构。

~/test ❯❯❯ docker run --rm docker.io/adamparco/demo:latest@sha256:2b77acdfea5dc5baa489ffab2a0b4a387666d1d526490e31845eb64e3e73ed20 uname -m
aarch74
~/test ❯❯❯ docker run --rm docker.io/adamparco/demo:latest@sha256:723c22f366ae44e419d12706453a544ae92711ae52f510e226f6467d8228d191 uname -m
armv7l

上面的命令运行后,我们看到 uname -m 返回 aarch74 和armv7l,是我们期望的结果。所有的 building 和running 都是在我的 macOS 开发机器上完成的。

上面介绍了的技术栈,如果没有 Docker Desktop 和 buildx,要做到这些是比较困难的。

一个更为复杂的例子,python flask web application,可以显示宿主机的架构。

~❯❯❯ docker buildx build -t adamparco/helloworld:latest --platform linux/arm64 --push github.com/adamparco/helloworld[+] Building 69.1s (11/11) FINISHED => CACHED [internal] load git source github.com/adamparco/helloworld             0.0s => [internal] load metadata for docker.io/library/python:3.7-alpine              0.5s => [base 1/1] FROM docker.io/library/python:3.7-alpine@sha256:b3957604aaf12d969  3.6s... => => pushing layers                                                             7.3s => => pushing manifest for docker.io/adamparco/helloworld:latest                 0.3s

指定了一个单一的架构,只有 64-bit Arm。  现在运行并发布服务端口,如下:

~❯❯❯ docker run -p5000:5000 adamparco/helloworld:latest... * Serving Flask app "hello" (lazy loading) * Environment: production * Debug mode: off * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

打开浏览器,载入地址 localhost:5000 ,显示:

Docker Desktop如何构建Multi-Arch的arm容器镜像

这样,你可以简单地使用 Docker 命令来build 和 run multi-architecture images,可以通过 buildx来完成这几件事情。将来版本会加入更多的新的强大的特征。

Amazon EC2 A1 Credits

有限的时间,注册到 beta.docker.com 收到免费的 credits可以使用Amazon EC2 A1 instances来进行测试和部署 Arm images。

“Docker Desktop如何构建Multi-Arch的arm容器镜像”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI