zoukankan      html  css  js  c++  java
  • 13.Manifest实现多CPU架构Docker镜像(Docker 镜像跨平台使用)

    原文:https://www.jianshu.com/p/fad6b6fb4599

    1、manifest是什么,干什么用?

    manifest是一个文件,这个文件包含了有关于镜像信息,如层、大小和摘要。docker manifest命令还向用户提供附加信息,比如构建镜像的操作系统和体系结构。而manifest list是一个镜像清单列表,用于存放多个不同os/arch的镜像信息。我们可以创建一个manifest list来指向两个镜像(一个linux 64位和一个指向arm64位的镜像),然后对用户提供一个唯一的镜像名称。从Docker registry v2.3和Docker 1.10 开始,Docker hub就可以pull multi architecture Docker镜像了。

    一个镜像的manifest文件信息如下:

    [root@localhost ~]# docker manifest inspect java
    {
            "schemaVersion": 2,
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "config": {
                    "mediaType": "application/vnd.docker.container.image.v1+json",
                    "size": 4733,
                    "digest": "sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8"
            },
            "layers": [ #---镜像层的摘要信息
                    {
                            "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
                            "size": 51361210,
                            "digest": "sha256:5040bd2983909aa8896b9932438c3f1479d25ae837a5f6220242a264d0221f2d"
                    },
    ...................
            ]
    }
    

    一个manifest list的例子如下:

    {
       "schemaVersion": 2,
       "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
       "manifests": [
          {
             "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
             "size": 1357,
             "digest": "sha256:9b47044b1e79b965a8e1653e7f9c04b5f63e00b9161bedd5baef69bb8b4c4834",
             "platform": {
                "architecture": "amd64",
                "os": "linux"
             }
          },
          {
             "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
             "size": 1357,
             "digest": "sha256:8aecae775e1f81d3889929ef15647187b414c833b0798d060bfd778bee668ced",
             "platform": {
                "architecture": "arm64",
                "os": "linux",
                "variant": "v8"
             }
          }
       ]
    }
    

    注意:manifest的功能目前仅仅作用于docker 官方的镜像仓库。

    总结:简单的说manifest list就是多个manifest的一个集合,通过列表方式来管理。


    2、manifest list处理流程:

     
    manifest-2.jpg
     
    docker-manifest.png

    3、开启docker子命令manifest功能:

    manifest是做为docker客户端的子命令存在,不过这个子命令目前处在实验性中一般没有开启。我们需要手动开始这个子命令的功能。开启过程如下:

    1)、编辑配置文件config.json应用实验性功能:
    docker 的默认配置文件config.json是在$HOME目录下的.docker目录下。编辑config.json文件,若目录和文件不存在手动创建。

    $vim ~/.docker/config.json
    {
        "experimental": "enabled"
    }
    

    2)、编辑守护进程配置文件daemon.json开启实验性功能:
    编辑daemon.json,若目录和文件不存在手动创建

    $vim /etc/docker/daemon.json
    {
      "experimental": true
    }
    

    3)、重启docker:

    $systemctl daemon-reload
    $service docker restart
    $docker manifest --help #----查看manifest帮助信息
    

    开启docker的实验性功能后docker pull可以拉取指定平台镜像如下:

    $docker pull --platform arm64  镜像
    --platform:该参数是用于拉取指定平台的镜像,也是实验性功能,在上面步骤中开启后就会出现。通
    过该参数可以手动指定需要的CPU平台镜像,而不用自动去识别。
    

    4、使用manifest创建多CPU架构的镜像:

    查看一个镜像的manifest文件信息
    $docker manifest inspect java

    查看一个镜像的manifest文件的详细信息包括cpu平台架构等信息
    $docker manifest inspect --verbose java

    这里准备好了两个不同CPU架构的镜像如下:
    这里的镜像是自己在docker hub上创建的仓库
    xxx/public_docker:nginx-arm64
    xxx/public_docker:nginx-x86
    将上面两个镜像推到docker hub上面

    1)、创建一个manifest list列表:
    创建一个自定义命名的镜像名的manifest list,然后用该列表关联仓库里面的两个不同架构的镜像
    $docker manifest create xxx/public_docker:nginx-v1 xxx/public_docker:nginx-arm64 xxx/public_docker:nginx-x86

    2)、将创建好的manifest list 推到仓库中:
    $docker manifest push xxx/public_docker:nginx-v1

    3)、查看仓库中创建好的manifest list:
    $docker manifest inspect xxx/public_docker:nginx-v1


    补充:

    在我们拉取镜像时显示的摘要(Digest):

    就是对镜像的 manifest 内容计算 sha256sum 得到的。

  • 相关阅读:
    从句分析
    artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 11 盛最多水的容器
    Java实现 LeetCode 11 盛最多水的容器
  • 原文地址:https://www.cnblogs.com/robinunix/p/12145874.html
Copyright © 2011-2022 走看看