Docker 多架构镜像介绍和最佳实践

news2024/9/26 1:25:14

Docker 多架构镜像介绍和最佳实践> 更多云原生相关技术分享请关注公众号:CloudNativeOps ;

添加微信 GoOps888,备注 ‘加群’ 可加入云原生技术交流群。

一、多架构镜像介绍

在 Docker 中,同一个 Docker 镜像可以在不同的平台上运行,例如在 x86、ARM、PowerPC 等不同的 CPU 架构上。

为了支持这种多平台的镜像构建和管理,Docker 在 17.06 版本时引入了 Manifest 的概念,在此之前,Docker 并没有原生支持多平台镜像的构建和管理,因此开发者需要手动构建和管理不同平台的镜像。
【需要注意的是,在 Docker 19.03 版本中,Docker 官方已经推出了 Buildx 工具,它可以进一步简化多平台镜像的构建和管理,】

接下来我们来看看如何使用docker manifestdocker buildx 来构建和使用多架构镜像。

二、使用docker manifest 构建多架构镜像

Docker Manifest 是一个 Docker 镜像的描述文件,它可以用来实现多平台镜像的构建和管理。

在 Docker Manifest 会包含一个或多个镜像的元数据信息,例如镜像的操作系统、CPU 架构、大小等信息,同时还包含了这些镜像的关系和优先级信息,它可以用来指定多个镜像的组合,或者为单个镜像定义多个平台的支持。

通过使用 Docker Manifest,可以方便地管理多平台 Docker 镜像,同时也可以避免重复构建和维护多个不同平台的镜像,从而降低了开发和维护的成本。

1. 创建多平台的 Docker 镜像

首先,我们需要为每个平台构建一个 Docker 镜像,并将其打上相应的标签。
例如,为 x86 架构构建一个镜像:

docker build -t cloudnativeops:x86 -f Dockerfile.x86 .

docker push cloudnativeops:x86

然后,为 ARM 架构构建一个镜像:

docker build -t cloudnativeops:arm -f Dockerfile.arm .

docker push cloudnativeops:arm

2. 创建 Manifest 文件

使用 Docker CLI 命令创建 Manifest 文件,并将所有平台的镜像关联在一起:

docker manifest create cloudnativeops:v1 cloudnativeops:x86 cloudnativeops:arm

3. 给manifest 打注解

docker manifest annotate cloudnativeops:v1 cloudnativeops:x86 --os linux --arch amd64

docker manifest annotate cloudnativeops:v1 cloudnativeops:arm --os linux --arch arm64

4. 推送多平台镜像
使用 Docker CLI 命令将多平台镜像推送到 Docker Hub 或其他 Docker Registry 中:

docker manifest push cloudnativeops:v1 

5. 查看 Manifest 文件

使用 Docker CLI 命令查看 Manifest 文件的详细信息:

# 可以看到该镜像支持 arm64+amd64 多架构
$ docker manifest inspect cloudnativeops:v1

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 737,
         "digest": "sha256:7d1336ad7da3758e7d2fe0103787d96feb48b4c5fba94f9544655d9649cf2aa4",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 738,
         "digest": "sha256:eb5896ab76da70a495a224e55dc70d13b1d07e37fed8137fd95870e24c0d0946",
         "platform": {
            "architecture": "arm64",
            "os": "linux",
            "variant": "v8"
         }
      }
   ]
}

6. 使用多架构镜像

使用 Docker CLI 命令从 Docker Registry 拉取多平台镜像:

# 使用多架构镜像,会自动识别当前环境架构
$ docker run docker.io/bgbiao/cloudnativeops:v1
Hello, welcome to CloudNativeOps !

# 分别使用指定架构镜像,发现在mac 中会进行提示
$ docker run docker.io/bgbiao/cloudnativeops:v1-amd
Hello, welcome to CloudNativeOps !

$ docker run docker.io/bgbiao/cloudnativeops:v1-arm
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested
Hello, welcome to CloudNativeOps !


在 dockerhub 中查看相关镜像的基本信息如下:

三、使用 buildx 自动构建多架构镜像

注意:对docker 版本有一定要求。

# 启用experimental 特性
$ DOCKER_CLI_EXPERIMENTAL=enabled

# 创建一个buildx 构建环境
$ docker buildx create --use --name mutli-build

# 查看当前构建环境信息,以及支持的架构
$ docker buildx inspect --bootstrap
Name:   mutli-build
Driver: docker-container

Nodes:
Name:      mutli-build0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6


# 构建多架构镜像
$ docker buildx build --platform linux/amd64,linux/arm64 -t bgbiao/cloudnativeops:v2 --push .
....
....


# 查看多架构镜像manifest
$ docker buildx imagetools inspect  bgbiao/cloudnativeops:v2
Name:      docker.io/bgbiao/cloudnativeops:v2
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest:    sha256:a171305a0624787a212f98171fedbd0e88bd30dca3b372ea08a1a917b915bb5c

Manifests:
  Name:      docker.io/bgbiao/cloudnativeops:v2@sha256:2a2e955aa452055ca57986dd73266f99ed597078f52a5365f5458a9f16b3a125
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/amd64

  Name:      docker.io/bgbiao/cloudnativeops:v2@sha256:325274a2a64bed5febaec29eb7609b41bd86d807afe02c35a41525f5325a177f
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/arm64
  
# 使用
$ docker run docker.io/bgbiao/cloudnativeops:v2
Hello, welcome to CloudNativeOps !

使用 buildx 构建的多架构镜像

参考资料:

  • docker build
  • docker manifest
  • Building Multi-Architecture Docker Images With Buildx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rosserial协议通信--向ros写调用过程和读取数据调用过程

rosserial通信向ros写调用过程如下: 在32单片机中,发布者调用publish函数,然后依次逆向(上图是分析过程;调用过程逆向)查看上图, 最终操作串口,向上位机发布数据进行通信。 rosser…

代码随想录第24天 | ● 93.复原IP地址 ● 78.子集 ● 90.子集II

93.复原IP地址 /*** param {string} s* return {string[]}*/ let road [];let path [];var restoreIpAddresses function (s) {road [];if (s.length > 12 || s.length < 4) return [];//开始就判断&#xff0c;长度大于12的字符窜或者小于4的都不行backtracking(s,…

漏洞复现 || Apache RocketMQ 远程代码执行

技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的…

Spring原码学习第一篇:Spring概述

1、Spring源码概述图&#xff1a; 2、一些重要的接口 3、Spring获取对象的过程 BeanDefinition中实现的方法&#xff0c;把xml中定义的对象封装为一个对象&#xff0c;方便后面处理 4、BeandefinitionReader BeandefinitionReader作为一个抽象层来处理配置文件&#xff0c;定…

unity插件 -- UiEffect for UGUI

目录 1.简介 2. 脚本 3. 在线观看Demo 4.安装要求 5.使用方法 6.使用场景 7.插件下载 1.简介 UIEffect-upm是Unity中的一个插件&#xff0c;用于实现各种UI特效。它提供了许多常见的UI效果&#xff0c;如模糊、描边、阴影、发光等&#xff0c;可以轻松地为UI元素增添动…

Vue3子组件向父组件传递消息

父子组件之间的通信&#xff1a;props与emit 通常提到props&#xff0c;都会想到的是父组件给子组件传值&#xff1b;提到emit为子组件向父组件发送消息&#xff0c;但其实&#xff0c;props也可以使子组件向父组件传递消息 方式为在父组件中通过为子组件绑定属性&#xff0c…

代谢组学数据分析及网络药理学研究技术与实践

代谢组学是近年发展快速的一门学科&#xff0c;目前在医学、植物学、微生物学、毒理学、药物研发等多个领域中得到了广泛的应用。如何从复杂的代谢组学数据中提取出有价值的信息&#xff0c;筛选出潜在的生物标志物成为近年来代谢组学研究的热点和难点。网络药理学能够通过计算…

基于STM32的熏艾式空气消毒装置设计与实现(华为云IOT)

一、前言 艾叶自古以来都在中医中占据着重要地位,特别是在那个瘟疫横行、卫生设施条件落后的时代。而在如今的疫情时代,艾叶的实用功能依旧可以为我们所用。考虑到技术的发展,我们是否可以利用现代技术的高效性来对艾叶进行更加科学利用呢?可编程的嵌入式系统与传感器结合…

Linux学习之管道

管道和信号一样&#xff0c;也是进程通信的方式之一。匿名管道&#xff0c;也称为管道符&#xff08;“|”&#xff09;&#xff0c;用来把上一个命令的输出当成下一个命令的输入。使用vim pipeContent.txt&#xff0c;把下边的内容 1 11 2 22 3 33 4 44 5 6 7 8 9写到Redirec…

基于simulink从视频序列创建马赛克(附源码)

一、前言 此示例演示如何从视频序列创建马赛克。视频拼接是将视频帧拼接在一起以形成场景综合视图的过程。生成的马赛克图像是视频数据的紧凑表示。视频马赛克块通常用于视频压缩和监控应用。 此示例说明如何使用“角检测”块、“估计几何变换”块、“投影变换”块和“合成”…

Vue3+Vite+Pinia+Naive后台管理系统搭建之四:Naive UI 组件库的安装和使用

前言 如果对 vue3 的语法不熟悉的&#xff0c;可以移步 Vue3.0 基础入门Vue3.0 基础入门快速入门。 UI 组件请参考官网&#xff1a;Naive Ui 官网 1. 安装依赖 yarn add naive-ui -D // or npm install naive-ui -D 2. 在 SFC (单文件组件) 中使用 直接引入&#xff08;推…

UnsatisfiedDependencyException: Error creating bean with name “dataSource” 异常排查

在写demo过程中&#xff0c;出现此异常&#xff0c;自己是按照以下步骤一个一个进行排查最终解决问题&#xff0c;希望能帮到碰到此问题的同学 : ) 1. 检查配置文件是否设置正常&#xff0c;是否配置了扫描类和配置文件路径 2. 检查是否设置MapperScan注解 3. 检查驱动版本和s…

c语言的变量

变量 我们可以直接声明一个变量&#xff0c;并利用这些变量进行基本的运算&#xff0c;声明格式为: 数据类型 变量名称 初始值&#xff1b; // 其中初始值可以不用定义变量时设定 // 是赋值操作&#xff0c;可以将等号后面的值赋值给前面的变量&#xff0c;等号后面可以直接…

SpringMVC集合

目录 SpringMVCSpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 SpringMVC入门&#xff08;1&#xff09;引入依赖&#xff08;2&#xff09;配置web.xml&#xff08;3&#xff09;创建请求控制器&#xff08;4&#xff09;创建SpringMVC的配置文件&#xff08…

[Docker] Docker学习和基本配置部署(一)

前言&#xff1a; Docker的作用是通过容器化技术实现快速、可移植和可扩展的应用程序部署与管理。 文章目录 引言容器化的基本概念Docker的背景产生Docker 配置和命令详解1. 安装 Docker2. Docker 配置3. Docker 命令 Docker的核心组件Docker在软件开发和云计算中的重要性Docke…

rancher

rancher&#xff08;牧场主&#xff09;简介&#xff1a; Rancher是一个开源的容器管理平台&#xff0c;它提供了一套完整的解决方案来管理和部署容器集群。它的目标是简化容器化应用的部署、管理和运维工作。 Rancher使用了开放标准的容器技术&#xff0c;如Docker和Kubernete…

C/C++实现高并发http服务器

http高并发服务器实现 基础知识 html&#xff0c;全称为html markup language&#xff0c;超文本标记语言。 http&#xff0c;全称hyper text transfer protocol&#xff0c;超文本传输协议。用于从万维网&#xff08;WWW&#xff1a;World Wide Web&#xff09;服务器传输超…

绝了!贸易企业增值税高,税负重怎么办?这些处理技巧请收藏!

绝了&#xff01;贸易企业增值税高&#xff0c;税负重怎么办&#xff1f;这些处理技巧请收藏&#xff01; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 贸易企业始终都逃脱不了税负重的问题&#xff0c;这是因为贸易企业自身的行业…

ChatGPT潮落 资金逃离AI概念股

ChatGPT访问量首次出现负增长&#xff0c;寒气传导到证券市场。 上半年经历暴涨的一众AI概念股偃旗息鼓&#xff0c;蓝色光标、三六零、昆仑万维等知名个股均较高点跌超30%。微软、英伟达也未能幸免&#xff0c;同样有不同程度回调。 回顾这波过山车般的市场表现&#xff0c;…

【JavaEE】你真的了解Cookie和Session吗?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 一、什么是Cookie 二、什么是Session 三、Cookie和Session有什么不同 四、关于Sessionid 五、关于浏览器禁止Cookie 六、如何考虑分布式Session问题&#xff1f; 七、Serv…