docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker buildx构建多平台构架镜像

docker实现buildx构建多平台(x86,arm64)构架镜像

作者:IT杂人

这篇文章主要介绍了docker实现buildx构建多平台(x86,arm64)构架镜像,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

配置文件激活buildx

docker目前使用版本为Server Version: 20.10.7,添加配置支持buildx

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

有部分docker未带有,比如arm版本,则需要单独下载文件:

下载对应版本:https://github.com/docker/buildx/releases/tag/v0.8.2mkdir -p ~/.docker/cli-pluginsmv buildx-v0.8.2.linux-arm64 ~/.docker/cli-plugins/docker-buildxchmod +x ~/.docker/cli-plugins/docker-buildxdocker buildx ls # 验证是否安装成功 

重启docker

#验证buildx版本docker buildx version#重启docker ***systemctl restart docker#检查是否启用docker info|grep Experimental

环境准备(需要联网)

系统环境要求

uname -a #内核版本要求4.8+

安装binfmt,支持的平台

安装编译时需要支持的平台,这里选择所有

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

初始化buildx构造器(不需要仓库https)

1.创建name=mybuilder且自定义配置的构造器

docker buildx create --use \--name mybuilder \--driver docker-container \--config /etc/buildkitd.toml  --use default

2.其中自定义配置内容

!!!【修改配置后,要删除旧的,重新创建构造器】!!!

$ vi /etc/buildkitd.tomldebug = true# root is where all buildkit state is stored.root = "/var/lib/buildkit"# insecure-entitlements allows insecure entitlements, disabled by default.insecure-entitlements = [ "network.host", "security.insecure" ]# 你的私库地址# optionally mirror configuration can be done by defining it as a registry.[registry."192.168.69.150"]  http = true  insecure = true[registry."192.168.69.150:80"]  http = true  insecure = true

启动构建器,会自动下载并启动buildx_buildkit_mybuilder0 的容器,需要联网docker-hub

docker buildx inspect mybuilder --bootstrap                      #启动name=mybuilder默认构造器docker buildx ls                                                 #列出所有的构造器和支持的平台docker buildx use mybuilder                                      #使用name=buildx的构造器,ls会出现*号表示正在使用中  docker buildx stop mybuilder                                     #停止name=buildx的构建器   

制作多平台基础镜像方式1:合并(docker manifest)

【可用docker buildx imagetools代替】

检查是否启用Experimental

docker info|grep Experimental #如果未启动,则需要配置,详见最顶端docker manifest --help   

显示添加harbor-registry的80端口的配置

因为内网环境,未使用https,而且docker很多地方未完全实现兼容默认去掉80端口,

在以后的配置中最好是添加端口使用,避免不必要的坑。

$ vim /etc/docker/daemon.json{  "insecure-registries":["192.168.69.150:80","192.168.69.150"],  "registry-mirrors":["http://192.168.69.150:80","http://192.168.69.150"]}#重新登录docker login 192.168.69.150:80#重启docker ***systemctl restart docker

创建多镜像集合

docker manifest create --insecure  192.168.69.150:80/commandcenter/centos_arm:latest \                                   192.168.69.150:80/commandcenter/centos_arm:v1

修改子镜像的架构名称(可选)

当有部分默认的os/arch值没有,或者太长时,可自定义修改

docker manifest annotate  192.168.69.150:80/commandcenter/centos_arm:latest \                          192.168.69.150:80/commandcenter/centos_arm:v1 \                          --os linux --arch arm64

指定v1版本为linux下的arm64架构

推送多镜像集合

docker manifest push --insecure  192.168.69.150:80/commandcenter/centos_arm:latest

–insecure,允许不安全的服务

检查是否正常

进入harbor,检查镜像是否有【文件夹】的图标,点击进入是否有OS/ARCH的列

拉取测试

此处命令兼容80端口,所以可省略docker pull --platform=linux/arm64/v8 192.168.69.150/commandcenter/centos_arm:latest

使用buildx时,指定platform则使用OS/ARCH的列值

查看已有镜像的manifest

docker manifest inspect --insecure 192.168.69.150:80/commandcenter/centos_arm:latest 

调整Dockerfile接收平台相关参数(可选,建议不写)

# 显示指定buildx传递--platform,但建议不写,在buildx后面传递platform参数即可,这样可兼容一般build命令
FROM --platform=$TARGETPLATFORM 基础镜像名:TAG

构建并导出到本地Docker images中

Dockfile中使用到的基础镜像需要支持多平台架构,如下harbor显示

一个镜像的同一个tag下,点击文件夹后,进入多平台架构列表;

Artifacts拉取命令OS/ARCHTags大小
sha256:c238d03b【有个文件夹】linux/amd64117.57MiB
sha256:74842b33linux/arm64121.57MiB
# 导出到本地只能构建一个镜像,本地不支持同时导出manifest lists#arm64docker buildx build -t 镜像名:版本号-arm64 --platform linux/arm64 . --load#x86_64(amd64)docker buildx build -t 镜像名:版本号-amd64 --platform linux/amd64 . --load

导出本地tar文件

#导出tar文件docker save -o 镜像名.TAG.tar 镜像名:TAG#导出tar.gz压缩文件docker save 镜像名:TAG|gzip > 镜像名.TAG.tar.gz

推送到仓库

docker tag  镜像名:TAG 镜像仓库地址/镜像名:TAGdocker push 镜像仓库地址/镜像名:TAG 

另:

同时构建X86_64与ARM64镜像(支持list)

制作多平台基础镜像方式2:也可用于制作基础镜像,Dockerfile一致

docker buildx build -t 镜像仓库地址/镜像名:TAG --platform linux/amd64,linux/arm64 . --push

仓库支持https,则直接创建构建器,不需要配置

docker buildx create --name builderx  --driver docker-container  #创建name=buildx的构建器
docker buildx use builderx                                       #使用name=buildx的构造器,ls会出现*号表示正在使用中
docker buildx inspect builderx --bootstrap                       #启动name=builderx默认构造器
docker buildx ls                                                 #列出所有的构造器和支持的平台
docker buildx stop builderx                                      #停止name=buildx的构建器

使用http非安全构造器方式2:待修正补充

不需要创建配置文件:–config /etc/buildkitd.toml

但不能使用–push的操作,只能使用–load;

https://docs.docker.com/engine/reference/commandline/buildx_build/#allow

#创建构造器:加--buildkitd-flags '--allow-insecure-entitlement security.insecure' 
 docker buildx create --use \
  --name mybuilder \
  --driver docker-container \
  --buildkitd-flags '--allow-insecure-entitlement security.insecure'  --use default

#生成镜像:加--allow security.insecure
 docker buildx build --allow security.insecure  -t /ubuntu_buildx:v2.2 --platform linux/arm64 . --load

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文