当前位置: 首页 > 科技观察

使用DockerBuildx构建各种系统架构镜像

时间:2023-03-15 10:14:05 科技观察

DockerBuildx是一个扩展Docker命令的DockerCLI插件,支持MobyBuildKit提供的功能。提供与DockerBuild相同的用户体验,并添加了许多新功能。BuildKit是下一代图像构建组件,具有许多主要功能。本文主要利用其编译多系统架构的特点。URL:https://github.com/moby/buildkit需要注意的是,该功能仅适用于Dockerv19.03+版本。本文将讲解如何使用Buildx构建各种系统架构的镜像。在开始之前,你已经在Linux系统(各大发行版)下默认安装了64位的Docker。在撰写本文时,Docker的最新版本号为19.03.13。$dockerversionClient:DockerEngine-CommunityVersion:19.03.13APIversion:1.40Goversion:go1.13.15Gitcommit:4484c46d9dBuilt:WedSep1617:03:452020OS/Arch:linux/amd64Experimental:trueServer:DockerEngine-CommunityEngine:Version.imumversion14.13.03.03)Goversion:go1.13.15Gitcommit:4484c46d9dBuilt:WedSep1617:02:212020OS/Arch:linux/amd64Experimental:falsecontainerd:Version:1.3.7GitCommit:8fba4e9a7d01810a393d5d25a3621dc101981175runc:Version:1.0.0-rc10GitCommit:dc9208a3303feef5b3839f4323d9beb36df0a9dddocker-init:Version:0.18.0GitCommit:fec36831。启用Buildxbuildx命令是一项实验性功能,因此需要先启用它。在上面查看Docker版本返回的内容中,如果出现Experimental:true的字样,则表示已经开启了该功能。以下步骤可以省略。编辑~/.docker/config.json文件,添加如下内容(以下演示适用于事先不存在.docker目录的情况)$mkdir~/.docker$cat>~/.docker/config.json<"COPY--from=builder/root/vlmcsd/bin/vlmcsd/usr/bin/vlmcsdEXPOSE1688CMD["vlmcsd","-D","-e"]$TARGETPLATFORM是一个内置变量,其值由--平台参数。由于是基于alpine的镜像制作的,而alpine支持以下7种系统架构,所以我们制作的镜像也支持这7种系统架构。linux/amd64、linux/arm/v6、linux/arm/v7、linux/arm64、linux/386、linux/ppc64le、linux/s390x比较友好的架构名称如下:amd64、arm32v6、arm32v7、arm64v8、i386,ppc64le,s390x在这里穿插一句牢骚。简单统计一下,ARM系统架构有以下各种简称:arm64、armv8l、arm64v8、aarch64arm、arm32、arm32v7、armv7、armv7l、armhfarm32v6、armv6、armv6l、arm32v5、armv5、armv5l、armel、aarch32想打人?对比一下Intel和AMD就简单多了:x86、386、i386、i686x86_64、x64、amd644。要构建映像,请先在本地构建一个。gitclone刚才的sampleDockerfile,进入其目录:$cd~&&gitclonehttps://github.com/teddysun/across.git&&cdacross/docker/kms/本地构建支持7个平台的镜像$dockerbuildxbuild--platformlinux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,linux/386-tteddysun/kms-otype=local,dest=.docker-f./Dockerfile.architecture.dockerbuildxbuild的具体参数含义可以参考如下官方文档:https://docs.docker.com/engine/reference/commandline/buildx_build/完成上面的步骤后,其实就是将构建好的镜像放到local下小路。此时,让我们再看看现有的构建器实例。$dockerbuildxlsNAME/NODEDRIVER/ENDPOINTSTATUSPLATFORMSmybuilder*docker-containermybuilder0unix:///var/run/docker.sockrunninglinux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6defaultdockerdefaultdefaultrunninglinux/amd64,linux/386,你会发现mybuilder下有8个支持的架构(riscv64还没有,但是已经支持了)。此时查看docker镜像的运行状态,会发现有一个名为buildx_buildkit_mybuilder0的容器在运行。这是刚才在本地构建时自动创建的,切记不要停止或删除它。$dockerps-asCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESSIZEbe753fa16090moby/buildkit:buildx-stable-1"buildkitd"15minutesagoUp15minutesbuildx_buildkit_mybuilder00B(virtual78.6MB)然后构建多系统架构镜像,并将构建好的镜像仓库推送到.comhub.doc。在进行此操作之前,需要提前注册一个账号(demo过程省略)并登录,登录命令如下:$dockerlogin输入用户名和密码进行登录,注意下面演示中的tag命令前面是我的用户名teddysun,如果你想制作自己的镜像,请替换成你自己的用户名。使用--push参数将构建的镜像推送到Docker存储库。这个时候还在刚刚的~/across/docker/kms目录下,文件Dockerfile.architecture是为构建多系统架构准备的。命令如下:$dockerbuildxbuild--platformlinux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x-tteddysun/kms--push-f./Dockerfile在.architecture之后。命令执行成功,你会在DockerHub上看到你上传的镜像。示例图片如下:5.写在最后在制作多系统架构的Docker镜像时,建议使用CPU比较强的vps或者多核的vps来搭建,否则会很耗时。