[转帖]docker使用buildx构建多平台(x86,arm64)构架镜像
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)构架镜像的更多相关文章
- 使用 buildx 构建多平台 Docker 镜像
原文链接:使用 buildx 构建多平台 Docker 镜像 在工作和生活中,我们可能经常需要将某个程序跑在不同的 CPU 架构上,比如让某些不可描述的软件运行在树莓派或嵌入式路由器设备上.特别是 D ...
- Docker Buildx使用教程:使用Buildx构建多平台镜像
写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker ...
- docker:Dockerfile构建LNMP平台
docker:Dockerfile构建LNMP平台 1.dockerfile介绍 Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式.可以通过docker buil ...
- 基于Docker&Kubernetes构建PaaS平台基础知识梳理
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 基于Docker&Kubernetes构建Paa ...
- 【原创】基于Docker的CaaS容器云平台架构设计及市场分析
基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...
- 记一次构建SaaS平台项目失败后的反思(收集的客户需求太少,且没有区分重点,闭门造车。技术演变要渐进)
记一次构建SaaS平台项目失败后的反思 前言: 笔者从2017年起开始着手将公司现有的软件系统改造成多租户模式,以降低整个系统的运营成本.但最后这个项目以失败告终.今天,我将对这个SaaS项目是如何走 ...
- docker&flask快速构建服务接口(二)
系列其他内容 docker快速创建轻量级的可移植的容器✓ docker&flask快速构建服务接口✓ docker&uwsgi高性能WSGI服务器生产部署必备 docker&g ...
- docker定制化镜像的构建及基于该定制的镜像创建容器
1.在项目里创建Dockerfile(注意大小写)文件,执行构建命令:docker build -t tiny-node-1 /root/tiny-node-docker 其中tiny-node ...
- Docker 使用 Dockerfile 构建自己的镜像
可以使用Dockerfile的配置文件方式进行构建自己的镜像 下面利用docker构建一个Caddy web服务器 构建脚本 Dockerfile有自己的命令,下面使用了一些比较常用的命令,更多的Do ...
- 使用Docker+Jenkins自动构建部署
环境 Windows 10 Docker Version 18.06.1-ce-win73 (19507) 运行jenkins 运行jenkins 容器 docker run -d --name ln ...
随机推荐
- 如何快速部署本地训练的 Bert-VITS2 语音模型到 Hugging Face
Hugging Face是一个机器学习(ML)和数据科学平台和社区,帮助用户构建.部署和训练机器学习模型.它提供基础设施,用于在实时应用中演示.运行和部署人工智能(AI).用户还可以浏览其他用户上传的 ...
- 这场世界级的攻坚考验,华为云GaussDB稳过
摘要:实践证明,华为云GaussDB完全经受住了这场世界级的攻坚考验,也完全具备支撑大型一体机系统迁移上云的能力,并积累了丰富的经验. 本文分享自华为云社区<这场世界级的攻坚考验,华为云Gaus ...
- 华为云原生数据仓库GaussDB(DWS)深度技术解读:融、快、大、稳、易
摘要:云原生数据仓库GaussDB(DWS)架构师应邀为大家解读数仓深度技术. "云原生"在2020年成为备受瞩目的热词,云原生在确保企业数字化转型中资源快速供给.按需使用的同时, ...
- 如何正确使用Python临时文件
摘要:临时文件通常用来保存无法保存在内存中的数据,或者传递给必须从文件读取的外部程序.一般我们会在/tmp目录下生成唯一的文件名,但是安全的创建临时文件并不是那么简单,需要遵守许多规则. 1.前言 临 ...
- Cesium球心坐标与本地坐标系经纬转换的数学原理—矩阵变换
之前整理过:<透析矩阵,由浅入深娓娓道来-高数-线性代数-矩阵>.<三维旋转笔记:欧拉角/四元数/旋转矩阵/轴角-记忆点整理>,这次转载 FuckGIS的<Cesium之 ...
- 火山引擎DataTester智能发布:助力产品降低功能迭代风险
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 对企业而言,应用大规模AB实验,可以帮助企业提高决策效率.降低试错成本,而近期火山引擎AB测试 DataTes ...
- 火山引擎DataLeap的Catalog系统搜索实践(一):背景与功能需求
火山引擎DataLeap的Data Catalog系统通过汇总和组织各种元数据,解决了数据生产者梳理数据.数据消费者找数和理解数的业务场景,其中搜索是Data Catalog的主要功能之一.本文详细介 ...
- SQL SERVER数据分组后取第一条数据——PARTITION BY
MySQL 数据分组后取第一条数据 SQL SERVER (mssql) 数据分组后取第一条数据 SQL 如下 找状态=1的数据,按 HospitalId,DeptId 组合并倒序排序,每组里面取第一 ...
- python jira 读取表数据批量新建子任务
小李在Jira中处理任务时,发现一个表格数据很有趣.他决定为每一行数据创建一个新的子任务.他复制粘贴,忙得不亦乐乎.同事小张路过,好奇地问:"你在做什么?"小李得意地回答:&quo ...
- 你不知道的vue3:使用runWithContext实现在非 setup 期间使用inject
前言 日常开发时有些特殊的场景需要在非 setup 期间调用inject函数,比如app中使用provide注入的配置信息需要在发送http请求时带上传给后端.对此我们希望不在每个发起请求的地方去修改 ...