腾讯云多平台容器镜像构建(下)

时间:2021-07-15 | 标签: | 作者:Q8 | 来源:孔矾建网络

小提示:您能找到这篇{腾讯云多平台容器镜像构建(下)}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的腾讯云多平台容器镜像构建(下)内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您!

创建Manifest List

< ">我们使用docker manifest子命令管理manifest list。其中,docker manifest create子命令用于在本地创建一个manifest list。该命令需要指定待manifest list地址和一系列的manifests。例如需要创建包含amd64和arm64两个平台镜像的manifest list,则命令如:

docker manifest create kofj/multi-demo kofj/multi-demo:amd64 kofj/multi-demo:arm64

< ">docker manifest create命令的详细帮助信息如下所示:

# docker manifest create --help

Usage: docker manifest create MANIFEST_LIST MANIFEST [MANIFEST...]



Create a local manifest list for annotating and pushing to a registry

Options:

  -a, --amend      Amend an existing manifest list

      --insecure   Allow communication with an insecure registry

< ">我们按照上述方法创建出来的manifest list中并没有说明其中的manifest是什么操作系统和平台的,docker manifest annotate命令用于注释创建出来的manifest list。例如注释某个manifest是linxu系统arm64平台的,则命令:

docker manifest annotate kofj/multi-demo kofj/multi-demo:arm64--os linux--arch arm64

< ">docker manifest annotate命令的详细帮助信息如下所示:

# docker manifest annotate --help

Usage: docker manifest annotate [OPTIONS] MANIFEST_LIST MANIFEST

Add additional information to a local image manifest

Options:

      --arch string           Set architecture

      --os string             Set operating system

      --os-features strings   Set operating system feature

      --variant string        Set architecture variant

< ">注意:

< ">1.创建manifest list清单的过程中会检查远端仓库中manifests是否存在,所以我们必修提前推送镜像到远端。如果远端仓库是不安全的,在创建的过程中需要添加参数--inseure。

< ">2.使用docker manifest annotate注释manifest list的时候不需要使用--insecure。

< ">为了方便使用,我们可以使用下述代码段-06的脚本创建manifest list。

//代码段-06

#!/bin/bash

IMAGE?=kofj/multi-demo

NOCOLOR:='33[0m'

RED:='33[0;31m'

GREEN:='33[0;32m'

LINUX_ARCH?=amd64 arm64 riscv64

IMAGES=$(foreach arch,$(LINUX_ARCH),$(IMAGE):$(arch))

echo${GREEN}Create manifest for${RED}(${LINUX_ARCH})${NOCOLOR};

docker manifest create${IMAGE}${IMAGES}

for arch in${LINUX_ARCH};do

echo${GREEN}Annotate manifest${RED}linux/$$arch${NOCOLOR};

echo===================;

docker manifest annotate${IMAGE}${IMAGE}:$$arch--os linux--arch$$arch;

done

推送manifest list

< ">当我们完成manifest list的创建工作后,它还是存储在本地的。这时候,还需要推送到远端的镜像仓库。与推送普通镜像不同,推送manifest list需要使用docker manifest push命令进行。如果我们要推送kofj/multi-demo这个manifest list,则命令如:

docker manifest push kofj/multi-demo

< ">使用docker manifest push命令可以通过附加--purge选项在推送完成后删除存储在本地的manifest list;当我们的目标仓库没有使用或者使用了非可信TLS证书的时候,则需要使用--insecure选项。

< ">buildx自动构建

< ">软件依赖



< ">Docker19.03:自该Docker版本包含buildx。

< ">Linux kernel4.8:自该Linux内核版本binfmt_misc支持fix-binary(F)flag。fix_binary标志允许内核在容器或chroot内使用binfmt_misc注册的二进制格式处理程序,即使该处理程序二进制文件不是该容器或chroot内可见的文件系统的一部分。

< ">binfmt_misc file system mounted:需要挂载binfmt_misc文件系统,以便用户空间工具可以控制此内核功能,即注册和启用处理程序。

< ">Docker Desktop2.1.0 如果是使用的Docker Desktop。

配置Buildx

< ">buildx从19.03开始与Docker CE捆绑发布,但是需要我们在Docker CLI上CCTV广告启用实验性功能开开启。可以通过两种方式启用它:

< ">1.将"experimental":"enabled”添加到Docker CLI的配置文件~/.docker/config.json。

< ">2.另外一种方法时设置环境变量DOCKER_CLI_EXPERIMENTAL=enabled。

< ">使用Docker Desktop的同学可以通过UI菜单Preferences→Command Line进入Docker CLI配置界面,通过Switch开关Enable experimental features启用实验性功能。

< ">如果需要使用最新版本的buildx,可以从https://github.com/docker/buildx/releases/latest下载最新的二进制发行版,并将其复制到~/.docker/cli-plugins文件夹中,重命名为docker-buildx,然后更改执行权限:

chmod+x~/.docker/cli-plugins/docker-buildx

< ">最后让我们验证buildx是否已经可用了:

$docker buildx version

github.com/docker/buildx v0.3.1-tp-docker 6db68d029599c6710a32aa7adcba8e5a344795a7

配置binfmt_misc

< ">QEMU是一个很棒的开源项目,它可以模拟很多平台。将QEMU和Docker结合起来使用能使得我们更容易的构建跨平台的容器镜像。集成QEMU依赖于Linux内核功能。Linux内核中的binfmt_misc功能可以使得内核识别任意类型的可以执行文件格式,并传递到特定的用户空间应用程序和虚拟机(https://zh.wikipedia.org/wiki/Binfmt_misc)。当Linux遇到一种无法识别的可执行文件格式(比如说其它平台的可执行文件格式)时,它会检查有没有配置任何“用户空间应用程序”用于处理它。如果检测到了,就将可执行文件传递给该应用程序。

< ">为此,我们需要在内核当中注册其它平台的可执行文件格式。

< ">对于使用Docker Desktop(MacOS和Windows上都是)的同学,因为默认配置了binfmt_misc,可以跳过这一步。而使用Linux发行版操作系统的同学则需要自行安装配置binfmt_misc,以便能够非原生的其它平台的镜像。

< ">要在宿主机上执行其它CPU平台的指令,需要安装QEMU模拟器。因为程序执行时会在当前程序可见的文件系统中查找动态库,而在容器或chroot环境中注册的处理程序在其它的cgroup namespace中可能无法找到,所以需要静态编译连接的QEMU。同时,我们需要安装一个包含足够新的update-binfmts二进制文件的包,以便能够支持fix-binary(F)标志,并在注册QEMU模拟器时实际使用,这样才能结合buildx一起镜像跨平台构建。

< ">QEMU和binfmt_misc支持工具可以通过宿主机或者Docker容器镜像安装。但是,使用Docker镜像安装配置能让事情变得更加简单。镜像docker/binfmt中包含QEMU二进制文件和在binfmt_misc中注册QEMU的安装脚本。

docker run--privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d

< ">执行完后,我们验证下是否注册成功了。成功注册后,/proc/sys/fs/binfmt_misc目录中会有多个qemu-前缀的文件。查看/proc/sys/fs/binfmt_misc/qemu-aarch64文件内容,可以看到falgs标志为OCF,说明这个处理程序是通过(F)标志注册的,能够正常的结合buildx完成跨平台构建。

root kofj-hk~ls-al/proc/sys/fs/binfmt_misc

total 0

drwxr-xr-x 2 root root 0 Oct 12 20:19.

dr-xr-xr-x 1 root root 0 Oct 12 20:19..

-rw-r--r--1 root root 0 Oct 12 20:19 python2.7

-rw-r--r--1 root root 0 Oct 12 20:19 python3.6

-rw-r--r--1 root root 0 Oct 12 20:21 qemu-aarch64

-rw-r--r--1 root root 0 Oct 12 20:21 qemu-arm

-rw-r--r--1 root root 0 Oct 12 20:21 qemu-ppc64le

-rw-r--r--1 root root 0 Oct 12 20:21 qemu-s390x

--w-------1 root root 0 Oct 12 20:19 register

-rw-r--r--1 root root 0 Oct 12 20:19 status

root kofj-hk~cat/proc/sys/fs/binfmt_misc/qemu-aarch64

enabled

interpreter/usr/bin/qemu-aarch64

flags:OCF

offset 0

magic 7f454c460201010000000000000000000200b7

mask ffffffffffffff00fffffffffffffffffeffff

使用buildx构建

< ">前置依赖注备好后,我们终于可以使用buildx构建多平台镜像了。与其它方案不同的是,使用buildx可以让我们不必改动dockerfile。

< ">Buildx始终使用BuildKit引擎构建镜像,不需要配置环境变量DOCKER_BUILDKIT=1。BuildKit可以很好的用于多个平台的构建,而不仅适用于我们当前构建镜像时所使用的平台和操作系统。进行构建时,使用--platform标志可以用于指定构建输出的目标平台(例如linux/amd64,linux/arm64,linux/riscv64)。

< ">首先,我们先准备好Dockerfile文件:

FROM golang:1.14 as builder

COPY./src

WORKDIR/src

RUN ls-al&&go build-a-tags netgo-ldflags'-w'-mod=vendor-v-o/src/bin/webapp/src/cmd/main.go

#Final image

FROM ubuntu:18.04

LABEL authors="Fanjian Kong"

COPY--from=builder/src/bin/webapp/app/

WORKDIR/app

CMD["/app/webapp"]

< ">然后,让我们尝试下运行buildx。

root kofj-hk~docker buildx build--platform linux/amd64,linux/arm64,linux/arm-t harbor-community.tencentcloudcr.com/multi-arch/demo:2020-10-12.--push

error:auto-push is currently not implemented for docker driver,please create a new builder instance

< ">居然报错error:auto-push is currently not implemented for docker driver,please create a new builder instance了!别担心,这是因为Docker默认的builder是不支持多平台构建的。我们可以通过docker buildx ls查看当前节点上的builder有哪些。

root kofj-hk~docker buildx ls

NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS

default*docker

default default running linux/amd64,linux/386

< ">为了使用多平台构建功能,我们需要新建一个builder,并设置当前builder为新建的。

#新建同时切换builder

docker buildx create--use--name mybuilder

#只新建,然后再切换builder

docker buildx create--name mybuilder

docker buildx use mybuilder

< ">现在,让我们再次执行buildx,看着一切向着期待的方向发展了。

注意事项

< ">注意1:到目前位置,buildx支持linux/amd64,linux/386,linux/arm/v7,linux/arm/v6,linux/arm64,linux/ppc64le,linux/s390x。所以docker/binfmt镜像仅注册了arm、ppc64le和s390x的处理程序。如果你需要构建、运行RISC-V平台的容器镜像,建议使用multiarch/qemu-user-static镜像镜像配置。

docker run--rm--privileged multiarch/qemu-user-static--reset-p yes

< ">注意2:在软件依赖中我们提到需要Linux内核版本&gt;=4.8.0;如果在内核版本为3.10.0的系统(比如CentOS)上运行docker/binfmt,会出现报错Cannot write to/proc/sys/fs/binfmt_misc/register:write/proc/sys/fs/binfmt_misc/register:invalid argument,这是由于内核不支持(F)标志造成的。出现这种情况,建议您升级系统内核或者换使用较高版本内核的Linux发行版。

< ">小结

< ">多年前,大规模部署应用程序是一项非常耗费人力、财力、时间,还需要大量技能和技巧的事务,工程师们还需要应对应用程序所运行的每一台服务器的环境差异。这对大公司而言是个极其沉重的负担,小公司更是无力应对。

< ">正如多年前人们无法想象大规模部署复杂的应用程序只需要一个kubectl create命令,不久前我们也不会想到构建多平台的容器镜像只需要一个docker buildx build。但是,我们还有更加广阔的想象空间,自动化流程、更多平台的支持、更智能简单的工具,你能想到的都有可能在不久的将来变成现实。

< ">技术的发展进步,不断降低了生产活动中社会平均劳动时间,提升了生产力,能够释放劳动者去做更多有益的探索。让我们不断学习、拥抱、应用新技术,在时代的浪潮中勇往直前。

可执行方案舆情监测与应对回顾

< ">1.确保使用的Linux发行版内核&gt;=4.8.0(推荐使用Ubuntu 18.04以上的TLS发行版),且Docker&gt;=19.03;

< ">2.启用Docker CLI实验性功能:export DOCKER_CLI_EXPERIMENTAL=enabled;

< ">3.配置其它平台的模拟器:docker run--privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d;

< ">4.新建Docker builder实例支持多平台构建:docker buildx create--use--name mybuilder;

< ">5.在项目目录中执行构建:docker buildx build--platform linux/amd64,linux/arm64,linux/arm-t harbor-community.tencentcloudcr.com/${YOUR_NAMESPACE}/multi-arch:2020-10-12.--push。

< ">6.相关演示代码、脚本可以在https://github.com/kofj/multi-arch-demo.git获取。

推广时间

< ">目前,腾讯云容器镜像服务TCR已完成公测进入商业化阶段。我们也已经对部分用户开放了Multi Arch镜像和OCI云原生制品支持。如果您对该功能感兴趣,欢迎联系客服开通。

腾讯云多平台容器镜像构建(下)

上一篇:Google Play:打造适用于 Daydream 和 Google Cardboard 的
下一篇:Google Play:使用 Android Vitals 改进您的应用的性能


版权声明:以上主题为“腾讯云多平台容器镜像构建(下)"的内容可能是本站网友自行发布,或者来至于网络。如有侵权欢迎联系我们客服QQ处理,谢谢。
相关内容
推荐内容
扫码咨询
    腾讯云多平台容器镜像构建(下)
    打开微信扫码或长按识别二维码

小提示:您应该对本页介绍的“腾讯云多平台容器镜像构建(下)”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通腾讯云多平台容器镜像构建(下)的相关事宜。

关键词:腾讯云多平台容器镜像构

关于 | 业务 | 案例 | 免责 | 隐私
客服邮箱:sales@1330.com.cn
电话:400-021-1330 | 客服QQ:865612759
沪ICP备12034177号 | 沪公网安备31010702002418号