https://blog.csdn.net/atzqtzq/article/details/128583331

配置文件激活buildx

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

    docker版本较低时,请升级docker版本

    $ vim /etc/docker/daemon.json
    {
    "experimental": true
    }
    • 1
    • 2
    • 3
    • 4
  • 重启docker
    #验证buildx版本
    docker buildx version

    重启docker ***

    systemctl restart docker

    检查是否启用

    docker info|grep Experimental
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

环境准备(需要联网)

  • 系统环境要求

    如果版本较低,需要升级内核

    uname -a #内核版本要求4.8+
    
    • 1
  • 安装binfmt,支持的平台
    安装编译时需要支持的平台,这里选择所有

    binfmt-support >= 2.1.7,需要联网docker-hub

    docker run --privileged --rm tonistiigi/binfmt --install all
    
    • 1
  • 初始化buildx构造器(不需要仓库https)

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

    docker buildx create --use \
    --name mybuilder \
    --driver docker-container \
    --config /etc/buildkitd.toml --use default
    • 1
    • 2
    • 3
    • 4

    2.其中自定义配置内容
    【修改配置后,要删除旧的,重新创建构造器】

    $ vi /etc/buildkitd.toml
    debug = 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
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 启动构建器,会自动下载并启动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
    • 2
    • 3
    • 4

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

【可用docker buildx imagetools代替】

检查是否启用Experimental

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

docker manifest --help
  • 1
  • 2
  • 3

显示添加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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

创建多镜像集合

docker manifest create --insecure  192.168.69.150:80/commandcenter/centos_arm:latest \
192.168.69.150:80/commandcenter/centos_arm:v1
  • 1
  • 2
  • –insecure,允许不安全的服务
  • 192.168.69.150:80/commandcenter/centos_arm:lates,第一个镜像名为统一的名称
  • 192.168.69.150:80/commandcenter/centos_arm:v1,后面的表示要集成的子镜像名,当然可以集成多个子镜像
  • 删除使用docker manifest rm 【manifest统一镜像名称】

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

当有部分默认的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
  • 1
  • 2
  • 3
  • 指定v1版本为linux下的arm64架构

推送多镜像集合

docker manifest push --insecure  192.168.69.150:80/commandcenter/centos_arm:latest
  • 1
  • –insecure,允许不安全的服务

检查是否正常

  • 进入harbor,检查镜像是否有【文件夹】的图标,点击进入是否有OS/ARCH的列
  • 拉取测试
    此处命令兼容80端口,所以可省略
    docker pull --platform=linux/arm64/v8 192.168.69.150/commandcenter/centos_arm:latest
    • 1
    • 2
  • 使用buildx时,指定platform则使用OS/ARCH的列值
  • 查看已有镜像的manifest
    docker manifest inspect --insecure 192.168.69.150:80/commandcenter/centos_arm:latest 
    
    • 1

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

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

构建并导出到本地Docker images中

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

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

Artifacts 拉取命令 OS/ARCH Tags 大小
sha256:c238d03b【有个文件夹】 linux/amd64 117.57MiB
sha256:74842b33 linux/arm64 121.57MiB
# 导出到本地只能构建一个镜像,本地不支持同时导出manifest lists
#arm64
docker buildx build -t 镜像名:版本号-arm64 --platform linux/arm64 . --load
#x86_64(amd64)
docker buildx build -t 镜像名:版本号-amd64 --platform linux/amd64 . --load
  • 1
  • 2
  • 3
  • 4
  • 5

导出本地tar文件

#导出tar文件
docker save -o 镜像名.TAG.tar 镜像名:TAG

导出tar.gz压缩文件

docker save 镜像名:TAG|gzip > 镜像名.TAG.tar.gz
  • 1
  • 2
  • 3
  • 4
  • 5

推送到仓库

docker tag  镜像名:TAG 镜像仓库地址/镜像名:TAG
docker push 镜像仓库地址/镜像名:TAG
  • 1
  • 2

参考

https://docs.docker.com/build/building/multi-platform/
https://blog.csdn.net/qq_34777982/article/details/123515396
https://blog.csdn.net/qq_33745102/article/details/124714360
https://blog.csdn.net/u012586326/article/details/125589644
https://docs.docker.com/build/buildkit/configure/

另:

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

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

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

仓库支持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的构建器
  • 1
  • 2
  • 3
  • 4
  • 5

使用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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
文章知识点与官方知识档案匹配,可进一步学习相关知识

[转帖]docker使用buildx构建多平台(x86,arm64)构架镜像的更多相关文章

  1. 使用 buildx 构建多平台 Docker 镜像

    原文链接:使用 buildx 构建多平台 Docker 镜像 在工作和生活中,我们可能经常需要将某个程序跑在不同的 CPU 架构上,比如让某些不可描述的软件运行在树莓派或嵌入式路由器设备上.特别是 D ...

  2. Docker Buildx使用教程:使用Buildx构建多平台镜像

    写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker ...

  3. docker:Dockerfile构建LNMP平台

    docker:Dockerfile构建LNMP平台   1.dockerfile介绍  Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式.可以通过docker buil ...

  4. 基于Docker&Kubernetes构建PaaS平台基础知识梳理

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 基于Docker&Kubernetes构建Paa ...

  5. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

  6. 记一次构建SaaS平台项目失败后的反思(收集的客户需求太少,且没有区分重点,闭门造车。技术演变要渐进)

    记一次构建SaaS平台项目失败后的反思 前言: 笔者从2017年起开始着手将公司现有的软件系统改造成多租户模式,以降低整个系统的运营成本.但最后这个项目以失败告终.今天,我将对这个SaaS项目是如何走 ...

  7. docker&flask快速构建服务接口(二)

    系列其他内容 docker快速创建轻量级的可移植的容器✓ docker&flask快速构建服务接口✓ docker&uwsgi高性能WSGI服务器生产部署必备 docker&g ...

  8. docker定制化镜像的构建及基于该定制的镜像创建容器

    1.在项目里创建Dockerfile(注意大小写)文件,执行构建命令:docker build -t tiny-node-1 /root/tiny-node-docker    其中tiny-node ...

  9. Docker 使用 Dockerfile 构建自己的镜像

    可以使用Dockerfile的配置文件方式进行构建自己的镜像 下面利用docker构建一个Caddy web服务器 构建脚本 Dockerfile有自己的命令,下面使用了一些比较常用的命令,更多的Do ...

  10. 使用Docker+Jenkins自动构建部署

    环境 Windows 10 Docker Version 18.06.1-ce-win73 (19507) 运行jenkins 运行jenkins 容器 docker run -d --name ln ...

随机推荐

  1. PyTorch项目源码学习(3)——Module类初步学习

    torch.nn.Module Module类是用户使用torch来自定义网络模型的基础,Module的设计要求包括低耦合性,高模块化等等.一般来说,计算图上所有的子图都可以是Module的子类,包括 ...

  2. 深入了解RC4 Drop加密技术

    一.引言 在网络安全领域,加密技术始终是重中之重.随着计算机技术的发展,加密算法也在不断更新换代.RC4(Rivest Cipher 4)加密算法因其高效.简洁的特性,在信息安全领域得到了广泛的应用. ...

  3. openGauss内核:简单查询的执行

    摘要:本文主要分析简单查询语句在业务处理线程Postgres上的执行流程,并介绍如何利用gdb梳理代码逻辑. 本文分享自华为云社区<openGauss内核分析(二):简单查询的执行>,作者 ...

  4. 实践GoF的设计模式:工厂方法模式

    摘要:工厂方法模式(Factory Method Pattern)将对象创建的逻辑封装起来,为使用者提供一个简单易用的对象创建接口,常用于不指定对象具体类型的情况下创建对象的场景. 本文分享自华为云社 ...

  5. 保姆级带你深入阅读NAS-BERT

    摘要:本文用权重共享的one-shot的NAS方式对BERT做NAS搜索. 本文分享自华为云社区<[NAS论文][Transformer][预训练模型]精读NAS-BERT>,作者:苏道 ...

  6. 分享两个常见的搜索算法:BFS和DFS

    摘要:本文为大家分享两个常见的搜索算法:BFS和DFS. 本文分享自华为云社区<BFS和DFS算法初探>,作者: ayin. 本次分享两个常见的搜索算法: 1.BFS 即广度优先搜索 2. ...

  7. 企业需要知道的5个 IAM 最佳实践

    在之前的文章中,我们了解了在代码发布到 GitHub 之前如何管理用户权限.但你知道吗?人为错误竟然是迄今为止数据泄露的主要原因!根据统计,高达95%的数据泄露是由配置错误和不良网络环境引起的.黑客通 ...

  8. Denso Create Programming Contest 2022(AtCoder Beginner Contest 239) E~F 题

    E - Subtree K-th Max 题意:给定一个以 \(1\) 为根的树,节点个数为 \(n(\le 1e5)\),每个点都有自己的点权.需要回答 \(m(\le1e5)\) 次询问.每次询问 ...

  9. JSP | application 对象详解 & 网站计数器实现

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 本篇学习自:C语言中文网,部分内容转载仅供学习使用. \[QAQ \] JSP applicat ...

  10. [kuangbin]专题九 连通图 题解+总结

    kuangbin专题链接:https://vjudge.net/article/752 kuangbin专题十二 基础DP1 题解+总结:https://www.cnblogs.com/RioTian ...