首页 > 其他分享 >docker 多架构接口数据交换

docker 多架构接口数据交换

时间:2024-10-18 17:22:59浏览次数:9  
标签:vnd 架构 image manifest docker sha256 数据交换 digest

前言

docker 的仓库支持一个 tag 下多个架构镜像, 这是如何实现的呢? 抓包看看其数据交互流程

前提

错误处理

执行命令buildx报错:

ERROR: Multi-platform build is not supported for the docker driver.
Switch to a different driver, or turn on the containerd image store, and try again.
Learn more at https://docs.docker.com/go/build-multi-platform/

修复: 执行命令docker buildx create --use desktop-linux . 参考链接

OCI参考文档

构建

Dockerfile:

FROM hub.hujingnb.com/hj-public/debian

RUN date > /tmp/date.txt

构建命令:

docker buildx build --platform linux/amd64,linux/arm64 -t hub.hujingnb.com/hj-public/test1:new --push .

抓包接口调用(2张图连续的, 1张图放不下了):

image-20241018145931938

image-20241018150006086

接口调用说明:

method 接口 说明 OCI 对应
HEAD /v2/hj-public/debian/manifests/latest 判断远端此镜像是否存在(每个架构) /v2/<name>/manifests/<reference>
GET /v2/hj-public/debian/manifests/sha256:520ce6d85... 获取镜像 manifests(多架构的). 内容参考: 多架构manifest /v2/<name>/manifests/<reference>
GET /v2/hj-public/debian/manifests/sha256:d15e83b3... 获取镜像 manifests(每个架构. 内容参考: 镜像manifests /v2/<name>/manifests/<reference>
GET /v2/hj-public/debian/blobs/sha256:8ea8... 获取上一步拿到的所有 blob /v2/<name>/blobs/<digest>
... 中间步骤和普通的镜像上传一样. 可参考之前的文章
HEAD /v2/hj-public/test1/manifests/new 判断远端 manifests 是否存在. /v2/<name>/manifests/<reference>
PUT /v2/hj-public/test1/manifests/new 上传manifests. 内容参考: 多架构manifest /v2/<name>/manifests/<reference>

至此, 一次多架构镜像构建并上传就完成了.

手动创建 manifests

我们也可以手动创建多架构, 而不是用 buildx. 命令如下:

# 假设仓库中已经存在: image:amd64 image:arm64 2个镜像
docker manifest create --insecure --amend  image:new image:arm64 image:amd64
docker manifest annotate image:new image:arm64 --os=linux --arch=arm64
docker manifest annotate image:new image:amd64 --os=linux --arch=amd64
docker manifest push --insecure --purge image:new

此时的接口调用, 直接跳到上面的最后2步: HEAD/PUT manifests接口.

拉取

其实在上一步构建的时候已经能够看到拉取的接口调用了. 在每次构建的时候, 要把不同架构的基础镜像拉倒本地进行构建.

这里就简单放一张接口调用流程, 命令: docker pull --platform=linux/arm64 hub.hujingnb.com/hj-public/test1:new:

image-20241018161603623

总结

单独镜像的推拉, 可以参考之前的文章

可以看到, 实现多架构时, 与非多架构镜像的唯一区别, 就是额外加了一个 manifests 类型, 用来将单架构镜像整合为多架构.

附件

多架构manifest
{
    "schemaVersion": 2,
    "mediaType": "application/vnd.oci.image.index.v1+json",
    "manifests":
    [
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:b4df0c22aa74c1aa7e1941619c4c63b2e3b1b1dc57436ecc6515e547b6888dab",
            "size": 481,
            "platform":
            {
                "architecture": "386",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:651dd02a84abdd528e35e73d483aec5c361078bf169919bd3dac7bfe66d19290",
            "size": 481,
            "platform":
            {
                "architecture": "amd64",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:9dac568c16fc9d22304b66eb1be48e849c912c0c1f233b7c8233eee5834fc082",
            "size": 481,
            "platform":
            {
                "architecture": "arm",
                "os": "linux",
                "variant": "v5"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:e30e0f9e2580058251db6012e2886fa8b3971d980ae04c0d2e304190df601b4a",
            "size": 481,
            "platform":
            {
                "architecture": "arm",
                "os": "linux",
                "variant": "v7"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:d15e83b3662501593be46a5a2aef02c2f5b4a1826aa5bef8cd21e7047a497af8",
            "size": 481,
            "platform":
            {
                "architecture": "arm64",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:bddc1b85037e49dcbeef083c2b2868c73e23d7443e3c13bc177762b90ddaf80f",
            "size": 481,
            "platform":
            {
                "architecture": "mips64le",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:e0d4150147fe4f2ecaf11fd532bd3d707d8632024f6743da58141b122a305887",
            "size": 481,
            "platform":
            {
                "architecture": "ppc64le",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:ed6e2e64d1f0a99ca795c481ca08ff62fc8e1efca022ae22c5604bb27e6c76c1",
            "size": 481,
            "platform":
            {
                "architecture": "s390x",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:785cf1dd62c0b02ce1fbf6cf615ef6eba5d4087385613ddcf26c221daac8e6a0",
            "size": 566,
            "annotations":
            {
                "vnd.docker.reference.digest": "sha256:b4df0c22aa74c1aa7e1941619c4c63b2e3b1b1dc57436ecc6515e547b6888dab",
                "vnd.docker.reference.type": "attestation-manifest"
            },
            "platform":
            {
                "architecture": "unknown",
                "os": "unknown"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:520be2ba49e9d29e94745580f96858c3960f5fcf1eaa2b8b6e2574d5bba4bc91",
            "size": 566,
            "annotations":
            {
                "vnd.docker.reference.digest": "sha256:651dd02a84abdd528e35e73d483aec5c361078bf169919bd3dac7bfe66d19290",
                "vnd.docker.reference.type": "attestation-manifest"
            },
            "platform":
            {
                "architecture": "unknown",
                "os": "unknown"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:edbe0bc83fdd4b6516399b43dcb4422c9b5e78a1a485fc8870554b7f1b59a501",
            "size": 566,
            "annotations":
            {
                "vnd.docker.reference.digest": "sha256:9dac568c16fc9d22304b66eb1be48e849c912c0c1f233b7c8233eee5834fc082",
                "vnd.docker.reference.type": "attestation-manifest"
            },
            "platform":
            {
                "architecture": "unknown",
                "os": "unknown"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:3d456f67aef005b6da1b9ae91c778314b6d79553917d7d37e6aa484eb8ea5a91",
            "size": 566,
            "annotations":
            {
                "vnd.docker.reference.digest": "sha256:e30e0f9e2580058251db6012e2886fa8b3971d980ae04c0d2e304190df601b4a",
                "vnd.docker.reference.type": "attestation-manifest"
            },
            "platform":
            {
                "architecture": "unknown",
                "os": "unknown"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:fe2aa90b281550a68cdc80208979c65acf8f64ca7ba709fe07fc38ed4eae7400",
            "size": 566,
            "annotations":
            {
                "vnd.docker.reference.digest": "sha256:d15e83b3662501593be46a5a2aef02c2f5b4a1826aa5bef8cd21e7047a497af8",
                "vnd.docker.reference.type": "attestation-manifest"
            },
            "platform":
            {
                "architecture": "unknown",
                "os": "unknown"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:5308441e25778d9e467114c998ed3faf9c4bc18df17702fdbe7fcf495ff44eb9",
            "size": 566,
            "annotations":
            {
                "vnd.docker.reference.digest": "sha256:bddc1b85037e49dcbeef083c2b2868c73e23d7443e3c13bc177762b90ddaf80f",
                "vnd.docker.reference.type": "attestation-manifest"
            },
            "platform":
            {
                "architecture": "unknown",
                "os": "unknown"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:264d85222bd6ff7a724dd33fa5071e6c3e1a30361989d52f2f7ca191ac7b9b20",
            "size": 566,
            "annotations":
            {
                "vnd.docker.reference.digest": "sha256:e0d4150147fe4f2ecaf11fd532bd3d707d8632024f6743da58141b122a305887",
                "vnd.docker.reference.type": "attestation-manifest"
            },
            "platform":
            {
                "architecture": "unknown",
                "os": "unknown"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:8f06e8c4e23717acbe73a0cd2f6ef9678b0c8c0387d67f7e604c85d43ba22cbf",
            "size": 566,
            "annotations":
            {
                "vnd.docker.reference.digest": "sha256:ed6e2e64d1f0a99ca795c481ca08ff62fc8e1efca022ae22c5604bb27e6c76c1",
                "vnd.docker.reference.type": "attestation-manifest"
            },
            "platform":
            {
                "architecture": "unknown",
                "os": "unknown"
            }
        }
    ]
}

其中后面几个 annotations 类型的内容, 是每个架构下的 manifests 证明文件. 用于镜像签名.

镜像manifests
{
	"schemaVersion": 2,
	"mediaType": "application/vnd.oci.image.manifest.v1+json",
	"config": {
		"mediaType": "application/vnd.oci.image.config.v1+json",
		"digest": "sha256:fe997a1b6216319619839e4ffe4bf083b70e58e751d5a26837254dc113b743f6",
		"size": 579
	},
	"layers": [{
		"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
		"digest": "sha256:c1e0ef7b956a07c7b090256aa16cbb0550a34d0625d1d23c5b1a76e92a58d01e",
		"size": 49584978
	}]
}

标签:vnd,架构,image,manifest,docker,sha256,数据交换,digest
From: https://www.cnblogs.com/hujingnb/p/18474684

相关文章

  • ARM架构鲲鹏主机BClinux离线安装docker步骤
    ■下载arm架构二进制文件安装包http://mirrors.163.com/docker-ce/linux/static/stable/aarch64/docker-27.3.1.tgz21-Sep-202401:3666M■解压二进制文件移动到/usr/bin目录tarxvfzdocker-27.3.1.tgzls-ldockercpdocker/......
  • 容器运维必备-Docker 常用命令
    前言:在Kubernetes的日常运维中,虽然我们主要依赖kubectl命令来管理容器和集群,但有时候,Docker的一些命令因其直观和便捷性,能够为我们提供极大的帮助。以下是一些Docker的常用命令,它们可以在Kubernetes环境中作为辅助工具使用,以提高我们的工作效率和操作的灵活性以下是Doc......
  • 二进制安装 Docker 以及 Docker Compose
    Author:ACatSmilingSince:2024-10-12Docker安装官网下载安装包。(以下示例脚本为下载最新版Docker离线压缩包,也可以用浏览器打开官网地址直接下载再传到服务器。如果使用该脚本,下面的第2、3步可以不执行。)#!/bin/bashset-u#docker官网下载地址url='https://d......
  • Docker 用例:15 种最常见的 Docker 使用方法
    容器化应用程序而不是将它们托管在虚拟机上是过去几年一直流行的概念,使容器管理流行起来。Docker处于这一转变的核心,帮助组织无缝地采用容器化技术。最近,Docker用例遍布所有行业,无论规模大小和性质如何。什么是Docker?Docker是一种容器化技术,它使开发人员能够将服务及其依......
  • 基于YOLOv8的高精度火车轨道路障检测算法源码源码 + 数据集,数据集共2053张图片,有5个类
     基于YOLOv8的高精度火车轨道路障检测算法源码源码+数据集,数据集共2053张图片,有5个类别,分别是preson、obstic_oc、animal、vehicle、motor_bicycle实时检测:采用YOLOv8m算法,轻量级架构,可以实时识别轨道上的障碍物。高精度识别:精准识别多种路障,包括人、动物、车辆、摩托车。......
  • 中电金信:企业架构转型,先“卷”平台化建设?
    ​话说,这几年金融机构平台化建设越来越“卷”了既要自主可控、能力升级还要安全合规、敏捷响应…… ​Buff1:政策要求2022年,银保监会发布《关于银行业保险业数字化转型的指导意见》,提出要“加快推动企业级业务平台建设,实现业务系统平台化、模块化、服务化”。 Buff......
  • 1.docker基础课程-docker安装
    如今,docker的使用已是越来越广泛熟练的掌握docker的使用已经是作为后端开发工程师必不可少的技能之一了docker是干啥的我们都知道,windows环境和linux环境是不一样的简单来说就是,不同的应用程序所依赖的环境不一样,如果把他们依赖的软件都安装在一个服务器上,不仅需要调试很久......
  • 国外电商系统开发-运维系统Docker镜像
            如果您在【主机配置】中,添加主机的时候使用的是root超级管理员,而且该主机中确实有docker镜像存在,那么运维系统会自动发现该列表,并且展现在网页中                自动发现的时间,间隔是30分钟一次。在该页面,您可以自行操作docker镜像功能。 ......
  • docker-certbot-dnspod 使用 Docker 申请、续期免费证书
    项目地址https://github.com/chenlongqiang/docker-certbot-dnspod背景近期免费证书有效期从1年缩短到3个月,避免经常要上云平台手动申请,所以想找个工具可以简单的申请、续期证书。通过了解,发现Certbot工具,但官方没提供Dnspod插件,于是找了Python3的封装并打包成......
  • dockerfile中nuget源加载失败Retrying 'FindPackagesByIdAsync' for source 'xxx'
    问题描述:最近jenkins打包总是提示微软源加载不到Retrying'FindPackagesByIdAsync'forsource'https://api.nuget.org/v3-flatcontainer/microsoft.extensions.primitives/index.json'.Anerroroccurredwhilesendingtherequest.解决方案:dockerfile中添加国内源,改用华......