您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

Docker如何跨平台下载Arm架构的镜像

时间:2023-09-02 12:50:11  来源:微信公众号  作者:微技术之家

Docker是一个开源的容器化平台,它可以让开发者打包应用程序及其依赖项到一个容器中,并在任何地方运行这个容器,而不用担心环境配置的问题。类比一下,就好像打包一个包裹,里面包含了应用程序和它需要的各种工具、库等等,这个包裹可以在不同的地方被运输和打开,而不需要在每个地方重新装一遍工具和库。这样,Docker可以使我们的应用程序更加容易部署、更加可移植,并且可以提高开发效率。

而DockerHub则是一个公共官方的包裹存储库,也是我们使用docker pull命令时默认的下载仓库。在这个存储库中,有官方或个人所上传的不同版本,不同架构的镜像。本次我们介绍的则是,如何在DockerHub网站下载官方arm架构的镜像。

图片

如何使用Dokcer Hub?

以ubuntu镜像为例,当我们登录hub.docker.com后在搜索框内输入ubuntu。之后便会出来很多以

“镜像名字”/”作者或镜像内容”:”版本”(也许会有版本)

为标题的镜像。当然这只是个命名的方式,也有很多不同于这个格式的镜像。此时第一个标有OFFICIAL(官方)的镜像往往也是我们想找的,因为官方镜像有足够详细的文档、支持不同的版本与架构,可以满足大多数要求。其中当然也不乏有第三方作者制作精良的镜像,它们往往省心省力。

回到正题,进入到ubuntu官方镜像的详情页。我们可以看到映入眼帘的则是他的介绍、版本等。在左上角则是官方提供的下载命令(此命令未指定版本等信息)。

点击Tags选项卡,可以看到这是ubuntu镜像发布过的版本信息。可以进行筛选及搜索。latest标签则为最新版本的镜像,我们也可以看到有多个它所支持的OS(系统)/ARCH(架构)。右侧则有下载此版本镜像的命令,以及镜像的大小。而左侧则有每个镜像摘要值,这个值是唯一的。

如何在X86_64架构的主机上下载arm架构镜像?

计算机的CPU有不同的品牌如intel、amd等这些耳熟能详的。它们基本的架构都为X86,这个架构早期有intel制定,后续由amd进行扩展为当今主流的X86_64又名amd64。主流并非唯一,业界一直存在多种 CPU 架构,如arm架构。许多手机的CPU也都是arm64架构以及大名鼎鼎得mac的M1、M2均是arm64架构。linux很早就开始支持arm64架构,其社区名为aarch64。在如今我们的科技被美国制裁。华为自研arm架构的手机及服务器芯片也均已停产,国家要迈向全国产的道路。而当下国产CPU多半使用的均为arm架构,甚至当下都无法获得armv8/v9版本的授权,但是arm架构还是会慢慢的走进大家的视野内的。

前面扯得有点远,所以我们该如何从X86_64架构的主机上下载arm架构的镜像呢?说到这就不得不提镜像是怎么区分CPU架构的了。

镜像命名区分CPU架构

CPU 构架 “规范” 名称

我们可以看到早期或者现在,也有不同架构的镜像添加 CPU 架构名作为镜像命名空间前缀。这样就可以用不同的名字下载不同架构的镜像了。

docker pull amd64/ubuntu:20.04docker pull arm64v8/ubuntu:20.04

# 其实现在你也能pull到。

这个方法所带来的问题则很多,如CPU 构架 “规范” 名称该怎么命名?为什么x86_64不命名为amd64?arm64不命名为aarch64?

使用 Tag 后缀区分构架

解决方法则是使用 Tag 后缀区分构架,变通办法是不使用命名空间前缀,改为使用镜像名或 Tag 前缀或后缀区分。如:

docker pull ubuntu:20.04-x86_64docker pull ubuntu:20.04-aarch64

在此情况下,我们可以直接使用docker pull 镜像名:版本@摘要值 的方式进行下载指定的镜像。

如我们要下载armv7版本的ubuntu镜像,可以直接点击左侧的摘要值进入镜像的详细页面。

在镜像名称下方则是我需要的摘要值,它是此镜像的唯一值。再下面我们可以选择不同的版本进行查看。左下方的则是构建此镜像的层,Dockerfile构建过程。而右下方则显示了镜像中包含的软件包,软件是否安全,是否有漏洞等。

现在可以使用当前命令进行下载指定版本的镜像。

docker pull ubuntu:latest@sha256:ad18cfdb19dac67bf0072dacea661a817330e5c955d081f4d09914e743ae5d4a

使用此命令查看镜像支持的架构。docker inspect ubuntu:latest@sha256:ad18cfdb19dac67bf0072dacea661a817330e5c955d081f4d09914e743ae5d4a# ---"Architecture": "arm", "Variant": "v7", "Os": "linux", "Size": 55339361, "VirtualSize": 55339361,

清单列表(Manifest List) 支持多构架镜像,进行拉取arm架构镜像

容器社区提出了使用统一的镜像名支持多种 CPU 构架的方案。2017-09-12 后, docker 使用清单列表 (Manifest List) 功能实现了这一方案。当有了这一功能,我们可以基于一个镜像命名空间。当使用docker pull 进行拉取镜像时,docker会根据当前CPU架构拉取对应的镜像。

docker pull ubuntu:20.04

当我们需要跨CPU架构拉取镜像时,如我是一个X86主机,想要拉取一个arm架构的镜像,除了刚才提到的方法。docker为我们提供了pull命令中的--platform参数,此参数可以明确指定我们需要的镜像。platform 不仅可指定 CPU 构架信息,还可以指定操作系统信息。

前面提到,镜像可以通过镜像命名空间中加入架构名称来区分镜像的架构。但带来的问题则是,不同的人可能命名规范并不相同,难以统一。现在使用清单列表的镜像在向docker镜像中心进行注册时必须按照其规范进行命名。但 platform 参数使用任意一个惯用名均可。如其注册名为arm/v7 ,而在使用platfrom参数时,指定为arm即可。

多架构与单架构拉取的镜像为同一个。

# 拉取 amd64 命名空间下的单架构镜像

docker image pull amd64/ubuntu:20.04

# 拉取多架构镜像在 x86_64 构架下的镜像

docker image pull --platform x86_64 ubuntu:20.04

创建多构架镜像

docker 使用清单列表 (Manifest List) 支持多构架镜像。

什么是清单?

将一个 docker 镜像推送到镜像注册中心后,镜像注册中心会记录镜像的存储信息,称为镜像清单 (Image Manifest) 。而清单列表则记录了多个镜像清单及其对应的平台 platform 信息。所谓多构架镜像,或多平台镜像,就是清单列表及其关联的多个单构架镜像。

创建多构架 (多平台) 镜像的操作步骤为:

创建多个单构架镜像。

将所有镜像推送到镜像注册中心,自动生成镜像清单。

汇总多个镜像清单得到清单列表,同样将清单列表推送 (存储) 到镜像注册中心上。新版本 docker 可使用 docker manifest 命令创建和推送清单列表。

Linux 支持交叉构建,即在一套环境下构建多种 CPU 构架下的镜像。为了简单起见,暂不讨论这种方案,暂采用在多个构架环境下创建各自的原生镜像的办法。

这里以创建多架构镜像 test/ubuntu:20.04 为例,介绍创建 docker 多构架镜像的实践操作步骤。

基于官方多架构镜像 ubuntu:20.04 编写 Dockerfile 。

在 x86_64 机器上构建原生镜像,推送到镜像注册中心。docker build --pull 表示每次构建前自动拉取最新的基础镜像,基础镜像是多架构镜像 (清单列表) 时,自动更新到当前架构的最新镜像。

docker build --pull -t test/ubuntu:20.04-x86_64 .docker push test/ubuntu:20.04-x86_64

同样,在 arm64 机器上构建原生镜像,推送到镜像注册中心。

docker build --pull -t test/ubuntu:20.04-aarch64 .docker push test/ubuntu:20.04-aarch64

使用推送到镜像注册中心的多个镜像创建清单列表。注意,前面为每个单架构镜像添加了不同的 Tag 后缀,以方便区分引用。将清单列表推送到镜像注册中心,删除本地副本 (清单列表只有存储在镜像注册中心上才有意义) 。

docker manifest create test/ubuntu:20.04 hanyong/ubuntu:20.04-x86_64 hanyong/ubuntu:20.04-aarch64docker manifest push test/ubuntu:20.04docker manifest rm test/ubuntu:20.04

扩展:

docker pull 镜像存储位置在哪?

查看docker镜像默认存储位置:

根据 Docker Root Dir: /var/lib/docker显示/var/lib/docker为默认存储位置。

docker info#---Kernel Version: 5.4.0-26-generic Operating System: Ubuntu 20.04 LTS OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 7.748GiB Name: weijishu ID: LINI:YJJ3:WDYH:CFFN:5DBN:WM52:B57J:E6IP:VF7D:NLCV:XJR2:GF62 Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/

总结

本文介绍了如何在x86_64架构的主机上下载arm架构的镜像。镜像可以通过镜像命名空间中加入架构名称来区分镜像的架构,也可以使用Tag后缀区分构架。此外,docker使用清单列表支持多构架镜像,可以使用–platform参数指定需要的镜像。本文还介绍了如何创建多构架镜像。



Tags:Docker   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  Search: Docker  点击:(12)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22  Search: Docker  点击:(10)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  Search: Docker  点击:(22)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  Search: Docker  点击:(65)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  Search: Docker  点击:(76)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04  Search: Docker  点击:(124)  评论:(0)  加入收藏
七个杀手级Docker命令
Docker是一个容器化平台,通过操作系统级别的虚拟化技术,实现软件的打包和容器化运行。借助Docker,开发人员能够将应用程序以容器的形式进行部署,但在此之前需要构建Docker镜像。...【详细内容】
2023-12-22  Search: Docker  点击:(140)  评论:(0)  加入收藏
Docker容器如何打包应用程序的代码和依赖项?
Docker容器通过将应用程序的代码和所有依赖项打包到一个独立的软件包中,实现了应用程序的快速部署和移植。下面是Docker容器实现这一目标的步骤:打包应用程序:使用Docker工具将...【详细内容】
2023-12-20  Search: Docker  点击:(130)  评论:(0)  加入收藏
DBA视角:把数据库放入Docker是一个馊主意
对于无状态的应用服务而言,容器是一个相当完美的开发运维解决方案。然而对于带持久状态的服务 —— 数据库来说,事情就没有那么简单了。生产环境的数据库是否应当放...【详细内容】
2023-12-18  Search: Docker  点击:(197)  评论:(0)  加入收藏
Docker容器编排技术解析
一、容器编排介绍容器编排是现代云原生应用管理的核心,它涉及在大规模的环境中自动化部署、管理、扩展和网络配置容器。随着微服务架构的兴起和应用的复杂性增加,容器编排成为...【详细内容】
2023-12-15  Search: Docker  点击:(245)  评论:(0)  加入收藏
▌简易百科推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  小白debug  微信公众号  Tags:Docker   点击:(12)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22    51CTO  Tags:Docker   点击:(10)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  云原生运维圈  微信公众号  Tags:容器   点击:(13)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  云原生运维圈  微信公众号  Tags:Docker   点击:(22)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01    简易百科  Tags:Kubernetes   点击:(153)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  匠心独运维妙维效  微信公众号  Tags:容器   点击:(47)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  waynblog  微信公众号  Tags:Docker   点击:(65)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  编程技术汇  今日头条  Tags:Docker   点击:(76)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04    Linux中国  Tags:Docker   点击:(124)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  云云众生s  微信公众号  Tags:Kubernetes   点击:(114)  评论:(0)  加入收藏
站内最新
站内热门
站内头条