好好学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 工具,并基于它构建多平台镜像。

参考文档:

2. Docker buildx builder是什么?

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

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

builder 实例的特性:

  • 它可以被配置为支持跨多种平台的构建,如 linux/amd64linux/arm64 等。
  • 每个 builder 实例可以使用不同的驱动程序,Docker buildx 默认支持两种类型的驱动:dockerdocker-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构建多平台镜像 | 好好学习的郝

相关推荐
牛奔12 分钟前
docker compose up 命令,默认配置文件自动查找规则
java·spring cloud·docker·容器·eureka
工具罗某人12 分钟前
docker快速部署jenkins
java·docker·jenkins
学烹饪的小胡桃12 分钟前
WGCAT工单系统 v1.2.7 更新说明
linux·运维·服务器·网络·工单系统
BigBigHang12 分钟前
【docker】离线设备安装镜像
运维·docker·容器
学好statistics和DS17 分钟前
Docker文件与本地文件,系统
运维·docker·容器
liuc031720 分钟前
docker下安装SearXNG
运维·docker·容器
云飞云共享云桌面30 分钟前
非标自动化工厂的设计云桌面为什么要选云飞云智能共享云桌面?
大数据·运维·服务器·网络·自动化·负载均衡
oMcLin31 分钟前
如何在CentOS 8上配置并优化Docker与Kubernetes结合的容器集群,提升微服务部署效率?
docker·kubernetes·centos
翼龙云_cloud1 小时前
阿里云渠道商:阿里云自动扩缩容配置教程
运维·服务器·阿里云·云计算
别多香了1 小时前
系统批量运维管理器 paramiko
linux·运维·服务器