当前位置: 首页 > news >正文

好好学Docker:基于Docker buildx构建多平台镜像【转载】

1. Docker buildx 是什么?

Docker buildx 是 Docker 官方维护的一个 CLI 插件,它基于 BuildKit 引擎,提供了不同于 docker build 的更多功能,
buildx的一个关键特性是可以同时为不同的硬件架构构建并输出镜像,使得我们可以很容易地交叉构建镜像。比如,我们可以在 AMD64 的机器上构建 ARM64 架构的镜像,这对于软件的跨平台支持非常有用。

Docker buildx 支持的平台主要包括以下几种:

  • Linux:包括多种 CPU 架构和操作系统,如 x86_64、ARM、IBM Power、IBM Z 等。
  • Windows:包括多种 CPU 架构和操作系统,如 x86_64、ARM64 等。
  • macOS:支持 Intel、Apple M1 架构。

在本文中,我们将学习 Docker buildx 工具,并基于它构建多平台镜像。

参考文档:

  • github - docker/buildx
  • Docker 多平台构建指南:构建 WebAssembly 镜像
  • Docker container build driver
  • 利用 docker buildx 构建多平台镜像

2. Docker buildx builder是什么?

单纯的 Docker builder,一般是指执行 Docker 镜像构建任务的一个实体或者进程。

在 Docker buildx 工具中,builder 指的是进行镜像构建的一个实例或环境。

builder 实例的特性:

  • 它可以被配置为支持跨多种平台的构建,如 linux/amd64linux/arm64 等。
  • 每个 builder 实例可以使用不同的驱动程序,Docker buildx 默认支持两种类型的驱动:docker 和 docker-container
  • 它允许我们定义构建环境的不同方面,比如资源限制、构建缓存存储位置等。
  • builder 实例可以是本地的,也可以被配置为分布式,由多个节点组成,以便分布式地执行构建任务。

builder 实例常用命令:

  • docker buildx ls:查看 builer 实例列表
  • docker buildx inspect:检查当前 builder 实例的详细信息,如果想查看特定的 builder,可以将其名称作为参数传入命令
  • docker buildx use:切换到一个指定的 builder 实例,让后续的 docker buildx 命令使用该实例
  • docker buildx create:创建新的 builder 实例
  • docker buildx update:修改 builder 实例配置
  • docker buildx rm:删除一个 builder 实例

builder 常用配置:

  • 平台:指定 builder 可以为哪些操作系统和架构对组合来构建镜像。例如 linux/amd64linux/arm64windows/amd64 等。
  • 环境变量:为 builder 实例设定环境变量,这些变量在构建过程中可用。
  • 构建选项:例如构建缓存的位置、构建输出的位置、是否使用 BuildKit 功能等。
  • 节点:在使用 docker-container 驱动时,我们可以添加多个节点,这些节点可以扩展 builder 的构建能力。
  • 驱动选项:指定构建使用的驱动和配置,例如 image 驱动或者 docker-container 驱动的细节配置,包括使用的网络模式等。

3. 配置 Docker buildx 环境

1、确保 Docker 版本不低于 19.03,才能使用 buildx

docker --version

2、检查 buildx 插件

docker buildx version

通过apt或者yum等包管理方式安装的Docker,默认是带有 buildx 插件的。

如果我们使用的 Docker 版本中没有包含 buildx,或者想要安装最新版本的 buildx,可以访问 github - docker/buildx 获取安装指南。

3、安装 buildx 插件

wget https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-amd64
chmod a+x buildx-v0.14.0.linux-amd64
mkdir -p /usr/libexec/docker/cli-plugins
mv buildx-v0.14.0.linux-amd64 /usr/libexec/docker/cli-plugins/docker-buildx

更多系统适用的 buildx 版本,可以访问github - buildx releases页面获取。

4、启用实验性功能
为了构建多平台镜像,需要确保 Docker 的实验性功能被启用,因为 buildx 依赖这些功能。
我们可以通过修改 Docker 配置文件(通常位于 ~/.docker/config.json)来启用实验功能。

{
  "experimental": "enabled"
}

4. 支持多平台构建的 builder 实例

buildx 有一个默认的 builder,但是这个builder不支持多平台构建。因此,我们需要创建一个支持多平台构建的 builder 实例。

1、查看 builder

docker buildx ls

2、创建一个支持多平台构建的 builder 实例,并切换到新的builder

docker buildx create --name mybuilder --driver docker-container --use

注意:使用docker-container driver才支持多平台构建。

3、查看 builder 详情并初始化

docker buildx inspect --bootstrap

4、切换builder

docker buildx use default
docker buildx use mybuilder

5、查看builder详情

docker buildx inspect mybuilder

5. 构建多平台的镜像

1、查看基础镜像的多平台镜像

docker buildx imagetools inspect busybox:1.34

2、编写 Dockerfile

FROM busybox:1.34

3、构建多平台镜像

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7  -t voidking/busybox:1.34 .

出现警告:WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use –push or to load image into docker use –load

这个命令将会为 amd64、arm64 和 arm/v7 架构构建镜像,但是,构建后的镜像通过 docker images 是看不到的,只会存在BuildKit 的构建缓存中,也就是说-t参数是无效的。

想要看到构建出的镜像,有两个办法:
方法一:使用--push参数直接上传到镜像仓库

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7  -t voidking/busybox:1.34 --push .
docker buildx imagetools inspect voidking/busybox:1.34

方法二:使用--load参数,一次只构建一个平台的镜像

docker buildx build --platform linux/arm64  -t voidking/busybox:1.34 --load .
docker inspect voidking/busybox:1.34

6. 后记

构建出的镜像,并不确保一定可用。可以使用像 QEMU 这样的模拟器,或者实际的硬件设备来测试构建的容器镜像。

原文地址:好好学Docker:基于Docker buildx构建多平台镜像 | 好好学习的郝

相关文章:

  • Python爬取微博签到数据(2025年3月更)
  • python的文件上传
  • 单片机 - RAM 与内存、ROM 与硬盘 之间的详细对比总结
  • 【MySQL】JDBC —— Java 连接 MySQL
  • Qt 隐式共享
  • Java「Deque」 方法详解:从入门到实战
  • 信息安全和病毒防护——入侵检测技术
  • selenium基本使用(二)九种定位方法
  • 深度优先搜索(DFS)在排列组合问题中的应用详解:C++实现与优化
  • 第一章,网络发展史///OSI七层模型
  • 【开题报告+论文+源码】基于SpringBoot+Vue的酒店餐饮管理系统设计与实现
  • CTF类题目复现总结-[羊城杯 2020]TCP_IP 1
  • 25. 策略模式
  • Java 编译 API(javax.tools 包)的使用方法及关键点总结,适用于在运行时动态编译 Java 代码
  • 【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法
  • 芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门
  • LeetCode 2255.统计是给定字符串前缀的字符串数目:使用库函数+计数
  • wordpress-网站百宝箱插件
  • Spring Boot - 动态编译 Java 类并实现热加载
  • 第二天 流程控制(if/for/while) - 列表/元组/字典操作
  • 日月谭天 | 赖清德倒行逆施“三宗罪”,让岛内民众怒不可遏
  • 央媒:设施老化、应急预案套模板,养老机构消防隐患亟待排查
  • 第十届青春文学奖揭晓,梁晓声获特别奖
  • 广东高州发生山体滑坡,造成2人遇难4人送医救治1人失联
  • 中方是否计划解除或调整稀土出口管制?外交部回应
  • 四川内江警方通报一起持刀伤人致死案:因车辆停放引起,嫌犯被抓获