制作多系统架构平台镜像

目录

一、说明

二、制作方法

2.1 方案一:不同架构平台制作镜像

2.1.1查看镜像manifest

2.1.2 制作各架构系统镜像

2.2 方案二:搭建环境制作镜像

2.2.1 配置开启buildx

2.2.2 安装不同系统架构组件,开启binfmt_misc

2.2.3 创建buildx实例

2.2.4 制作多系统架构镜像并推送到hub仓库

2.2.5 查看多架构平台镜像信息


一、说明

Docker的多架构支持是基于不同cpu的架构而不是不同操作系统的架构

制作多系统架构平台镜像_第1张图片

     使用qemu 仿真出很多平台,buildx集成了该特性,可以实现在其他平台构建不需要修改dockerfile ,当它需要对不同的架构运行一个二进制文件时,它会自己从binfmt_misc 处理器中已经注册的架构去加载对应的二进制文件。当然,我们需要手动在binfmt_misc处理器里去注册我们想要的架构的。

Windows、macOS 除外,其使用了 binfmt_misc 提供了多种架构支持,在 Windows、macOS 系统上 (x86_64) 可以运行 arm 等其他架构的镜像。

二、制作方法

2.1 方案一:不同架构平台制作镜像

2.1.1查看镜像manifest

先了解一下做好的比较全面的多系统架构镜像

docker manifest inspect wjiyu/dfclient:v1
{

   "schemaVersion": 2,

   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",

   "manifests": [

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:507cd928037bc053683f70a17c4fe9e5a47b7f0e9d52e88d46045402f2c8ab58",

         "platform": {

            "architecture": "arm64",

            "os": "linux"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:7f707eb33c83e0082c7cc86b00d6232a237e3436eeb0fa2c7219bd851194fc43",

         "platform": {

            "architecture": "amd64",

            "os": "linux"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:3cc72692c0dd302043d5c4f118dbadade178ffb65eaa50e5229f3dba7314bbc0",

         "platform": {

            "architecture": "riscv64",

            "os": "linux"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:ddee477648ccbfb2b1253c3b9958d477dd2c1bf16cabcd6ed7a5ae2a5dd8ec54",

         "platform": {

            "architecture": "ppc64le",

            "os": "linux"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:0e18da143c6a049d6b5d87847bb973a5f4087690048a873709bc40ae1a907f8e",

         "platform": {

            "architecture": "s390x",

            "os": "linux"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:20eed96c6c7a2d6ad19827849489ac561d41ab460704ff802045d1454c1bd8c2",

         "platform": {

            "architecture": "386",

            "os": "linux"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:c5e40465d52a7f46aee7605ca5fc3ef0c8e3577855125d008164461ed0e5f8e9",

         "platform": {

            "architecture": "mips64le",

            "os": "linux"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:3fcc3f575ce9b2f3e709edc8ebafa930d637da5926ca3d5c9d7e0c60add3eac5",

         "platform": {

            "architecture": "mips64",

            "os": "linux"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:08d462cc4a83210c6f46278d524ab3cdc58343788f52ec828d935d214260480e",

         "platform": {

            "architecture": "arm",

            "os": "linux",

            "variant": "v7"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:fa02e0c861b04adf546e05d321d4eca479cdba5f9d4d751315039ac42c4cd17b",

         "platform": {

            "architecture": "arm",

            "os": "linux",

            "variant": "v6"

         }

      }

   ]

}

2.1.2 制作各架构系统镜像

1、dfclient Dockfile示例

FROM --platform=$BUILDPLATFORM golang:1.13.15-alpine as builder



WORKDIR /go/src/github.com/dragonflyoss/Dragonfly

RUN apk --no-cache add bash make gcc libc-dev git



COPY . /go/src/github.com/dragonflyoss/Dragonfly



# make build dfdaemon and dfget.

# write the resulting executable to the dir /opt/dragonfly/df-client.

ARG GOPROXY

RUN make build-client && make install-client



FROM alpine:3.8



RUN apk --no-cache add ca-certificates bash



COPY --from=builder /opt/dragonfly/df-client /opt/dragonfly/df-client



# dfdaemon will listen 65001 in default.

EXPOSE 65001



# use the https://index.docker.io as default registry.

# more cli config see https://github.com/dragonflyoss/Dragonfly/blob/master/docs/cli_reference/dfdaemon.md

# CMD [ "--registry", "https://index.docker.io" ]



ENTRYPOINT [ "/opt/dragonfly/df-client/dfdaemon" ]

1)、在x86 amd64环境构建

168.170.141.42:5000/dragonfly/dfclient:amd64镜像。

docker buildx build --platform linux/arm64 --build-arg GOPROXY=https://goproxy.cn -t 168.170.141.42:5000/dragonfly/dfclient:amd64 -o type=registry . 

2)、在arm64环境构建

168.170.141.42:5000/dragonfly/dfclient:arm64镜像

docker buildx build --platform linux/arm64 --build-arg GOPROXY=https://goproxy.cn -t 168.170.141.42:5000/dragonfly/dfclient:arm64 -o type=registry . 

2、创建dfclient:latest的manifest列表

docker manifest create 168.170.141.42:5000/dragonfly/dfclient:latest 168.170.141.42:5000/dragonfly/dfclient:amd64 168.170.141.42:5000/dragonfly/dfclient:arm64 --insecure

docker manifest create -a 修改manifest

3、设置dfclient:latest manifest的manifests

docker manifest annotate 168.170.141.42:5000/dragonfly/dfclient:latest 168.170.141.42:5000/dragonfly/dfclient:amd64 --os linux --arch amd64

docker manifest annotate 168.170.141.42:5000/dragonfly/dfclient:latest 168.170.141.42:5000/dragonfly/dfclient:arm64 --os linux --arch arm64

4、查看manifest

docker manifest inspect 168.170.141.42:5000/dragonfly/dfclient:latest

{

   "schemaVersion": 2,

   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",

   "manifests": [

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:fe8d0d7b3cd251af963859458fd92091bd1c9fd5508dd82501d64d0f536e994d",

         "platform": {

            "architecture": "arm64",

            "os": "linux"

         }

      },

      {

         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

         "size": 951,

         "digest": "sha256:0654f7f284b6311f5de12c00cb3f0bfca6ba37e6161e89c5e80330f9b0237358",

         "platform": {

            "architecture": "amd64",

            "os": "linux"

         }

      }

   ]

}

5、推送manifest到harbor仓库

重要:harbor1.X版本不支持多系统架构manifest,harbor2.X版本支持多系统架构manifest,

docker manifest push 168.170.141.42:5000/dragonfly/dfclient:latest --insecure

制作多系统架构平台镜像_第2张图片

 制作多系统架构平台镜像_第3张图片

2.2 方案二:搭建环境制作镜像

  • Docker 版本限制。使用 buildx 作为 docker CLI 插件需要使用 Docker 19.03 或更新版本。旧版本的 Docker 可以单独安装调用二进制文件作为插件,可以支持部分功能。对于 Docker 版本大于 19.03 的版本,可以直接调用 buildx 二进制来访问 Docker buildx 子命令。
  • Linux 内核版本限制。要求 Linux kernel >= 4.8,因为自该 Linux 内核版本 binfmt_misc 才支持 fix-binary (F) flag。fix_binary 标志允许内核在容器或 chroot 内使用 binfmt_misc 注册的二进制格式处理程序,即使该处理程序二进制文件不是该容器或 chroot 内可见的文件系统的一部分。即可以支持编译打包不同架构平台的镜像。
  • 在内核中使用 QEMU 模拟支持

通过 QEMU 的用户态模式创建轻量级的虚拟机,在虚拟机系统中构建镜像。

目前可用架构:

linux/arm64,linux/amd64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6

2.2.1配置开启buildx

vim /etc/docker/daemon.json添加"experimental": true

{

    "runtimes": {

        "nvidia": {

            "path": "nvidia-container-runtime",

            "runtimeArgs": []

        }

    },

    "log-level": "debug",

    "registry-mirrors": [

        "http://hub-mirror.c.163.com",

        "https://docker.mirrors.ustc.edu.cn",

        "https://registry.docker-cn.com"

    ],

    "experimental": true

}

systemctl daemon-reload

systemctl restart docker

docker version

制作多系统架构平台镜像_第4张图片

2.2.2 安装不同系统架构组件,开启binfmt_misc

       QEMU 通常用于模拟完整的操作系统,它还可以通过用户态模式运行:以 binfmt_misc 在宿主机系统中注册一个二进制转换处理程序,并在程序运行时动态翻译二进制文件,根据需要将系统调用从目标 CPU 架构转换为当前系统的 CPU 架构。最终的效果就像在一个虚拟机中运行目标 CPU 架构的二进制文件。Docker Desktop 内置了 QEMU 支持,其他满足运行要求的平台可通过以下方式安装:

 docker run --privileged --rm tonistiigi/binfmt --install all

查看/proc/sys/fs/binfmt_misc/qemu-*

制作多系统架构平台镜像_第5张图片

2.2.3创建buildx实例

docker buildx create --use --name wjy

查看实例

docker buildx ls

移除实例

docker builx rm wjy

2.2.4 制作多系统架构镜像并推送到hub仓库

继续使用2.1.2 df Dockerfile示例

$ docker buildx use wjy

$docker buildx build --platform linux/arm64,linux/amd64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 -t wjiyu/dfclient:v1 -o type=registry .

docker buildx build 支持丰富的输出行为,通过--output=[PATH,-,type=TYPE[,KEY=VALUE] 选项可以指定构建结果的输出类型和路径等,常用的输出类型有以下几种:

  • local:构建结果将以文件系统格式写入 dest 指定的本地路径, 如 --output type=local,dest=./output。
  • tar:构建结果将在打包后写入 dest 指定的本地路径。
  • oci:构建结果以 OCI 标准镜像格式写入 dest 指定的本地路径。
  • docker:构建结果以 Docker 标准镜像格式写入 dest 指定的本地路径或加载到 docker 的镜像库中。同时指定多个目标平台时无法使用该选项。
  • image:以镜像或者镜像列表输出,并支持 push=true 选项直接推送到远程仓库,同时指定多个目标平台时可使用该选项。
  • registry:type=image,push=true 的精简表示。

2.2.5 查看多架构平台镜像信息

$ docker buildx imagetools inspect wjiyu/dfclient:v1

制作多系统架构平台镜像_第6张图片

你可能感兴趣的:(docker和harbor,系统架构,docker)