基于Docker buildx构建多平台镜像
前言
之前一直使用docker manifest
合并多平台镜像,使用教程可参考:https://199604.com/3169
但docker manifest
不支持构建,因此不满足自行构建多平台镜像。于是只能通过docker buildx
进行构建,再加上年前没啥活,就学习记录一下过程。
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 manifest
vs docker buildx
特性 | docker manifest |
docker buildx |
---|---|---|
主要用途 | 管理和分发多平台镜像 | 构建多平台镜像 |
功能重点 | 镜像清单操作(创建、修改、推送) | 高效构建和分布式构建 |
是否支持构建 | 不直接支持构建,依赖 docker build 或 docker buildx |
支持完整的构建流程 |
是否支持多平台 | 是,通过聚合不同架构的镜像 | 是,直接在构建时支持多平台 |
是否支持分布式构建 | 不支持 | 支持,通过 BuildKit |
是否支持缓存优化 | 不支持 | 支持,通过 BuildKit |
docker manifest
主要用于管理和分发多平台镜像,适合在镜像构建完成后对镜像清单进行操作。docker buildx
是一个强大的构建工具,支持多平台构建、分布式构建和缓存优化,适合在构建过程中直接生成多平台镜像。
配置 Docker buildx 环境
如果我们使用的 Docker 版本中没有包含 buildx,或者想要安装最新版本的 buildx,可以访问 buildx 获取安装指南。
安装 buildx 插件 – 已安装可忽略
Buildx 构建演示
以下是一个简单的 Dockerfile 示例,用于创建一个非常小的镜像,并测试 docker buildx
对 ARM 和 x86 平台的支持。这个 Dockerfile 使用了 Alpine Linux 作为基础镜像,并在其中安装了 echo
命令,用于测试。
Dockerfile 示例
配置Buildx的镜像加速配置文件
因为buildx
的环境跟docker不一样的,docker配置了镜像加速,但是buildx
没配置一样也无法进行拉取,因此需要配置镜像加速器,否则你会发现直接docker pull
可以正常用,但是docker bulidx
还是无法拉取,这个问题也是折腾我半天才发现。
参考:
https://docs.docker.com/build/buildkit/toml-configuration/
创建一个Buildx 构建实例
buildx 有一个默认的 builder,但是这个builder不支持多平台构建。因此,我们需要创建一个支持多平台构建的 builder 实例。
1、查看 builder
docker buildx ls
2、创建一个支持多平台构建的 builder 实例,并切换到新的builder
docker buildx create --use --name=glj --driver docker-container --driver-opt network=host --config /root/conf/buildkitd.toml
注意:使用docker-container driver才支持多平台构建。
3、查看 builder 详情并初始化
docker buildx inspect --bootstrap
4、切换builder
docker buildx use default
docker buildx use glj
5、查看builder详情
docker buildx inspect glj
构建多平台镜像
这里我使用是harbor私有的容器仓库作为镜像的存放仓库
可以看到镜像已经成功的推送到镜像仓库上了,有 arm 和 x86 镜像,至于还有unknown的,我这边暂时也还不清楚怎么回事,但正常进行拉取使用。
最后
构建出的镜像,确保可用的话,可以使用像 QEMU 这样的模拟器,或者实际的硬件设备来测试构建的容器镜像。可参考:https://199604.com/3000
进行配置qemu-user-static依赖
参考
1.https://www.voidking.com/dev-docker-buildx/
2.https://docs.docker.com/build/buildkit/toml-configuration/